@@ -40,17 +40,43 @@ defmodule Credo.Check.Warning.ExpensiveEmptyEnumCheck do
4040 }
4141 @ length_pattern quote do: { :length , _ , [ _ ] }
4242 @ comparisons [
43- { @ enum_count_pattern , 0 , "Enum.count" } ,
44- { 0 , @ enum_count_pattern , "Enum.count" } ,
45- { @ length_pattern , 0 , "length" } ,
46- { 0 , @ length_pattern , "length" }
43+ { @ enum_count_pattern , "Enum.count" } ,
44+ { @ length_pattern , "length" }
4745 ]
48- @ operators [ :== , :!= , :=== , :!== , :> , :< ]
46+ @ eq_operators [ :== , :!= , :=== , :!== , :> , :< ]
4947
50- for { lhs , rhs , trigger } <- @ comparisons ,
51- operator <- @ operators do
48+ # Comparisons against 0
49+ for { pattern , trigger } <- @ comparisons ,
50+ operator <- @ eq_operators do
5251 defp traverse (
53- { unquote ( operator ) , _meta , [ unquote ( lhs ) , unquote ( rhs ) ] } = ast ,
52+ { unquote ( operator ) , _meta , [ unquote ( pattern ) , 0 ] } = ast ,
53+ issues ,
54+ issue_meta
55+ ) do
56+ { ast , issues_for_call ( unquote ( trigger ) , issues , issue_meta , ast ) }
57+ end
58+
59+ defp traverse (
60+ { unquote ( operator ) , _meta , [ 0 , unquote ( pattern ) ] } = ast ,
61+ issues ,
62+ issue_meta
63+ ) do
64+ { ast , issues_for_call ( unquote ( trigger ) , issues , issue_meta , ast ) }
65+ end
66+ end
67+
68+ # Comparisons against 1
69+ for { pattern , trigger } <- @ comparisons do
70+ defp traverse (
71+ { :>= , _meta , [ unquote ( pattern ) , 1 ] } = ast ,
72+ issues ,
73+ issue_meta
74+ ) do
75+ { ast , issues_for_call ( unquote ( trigger ) , issues , issue_meta , ast ) }
76+ end
77+
78+ defp traverse (
79+ { :<= , _meta , [ 1 , unquote ( pattern ) ] } = ast ,
5480 issues ,
5581 issue_meta
5682 ) do
@@ -67,13 +93,13 @@ defmodule Credo.Check.Warning.ExpensiveEmptyEnumCheck do
6793 [ issue_for ( issue_meta , meta , trigger , suggest ( ast ) ) | issues ]
6894 end
6995
70- defp suggest ( { _op , _ , [ 0 , { _pattern , _ , args } ] } ) , do: suggest_for_arity ( Enum . count ( args ) )
71- defp suggest ( { _op , _ , [ { _pattern , _ , args } , 0 ] } ) , do: suggest_for_arity ( Enum . count ( args ) )
96+ defp suggest ( { _op , _ , [ _ , { _pattern , _ , args } ] } ) , do: suggest_for_arity ( Enum . count ( args ) )
97+ defp suggest ( { _op , _ , [ { _pattern , _ , args } , _ ] } ) , do: suggest_for_arity ( Enum . count ( args ) )
7298
73- defp get_meta ( { _op , _ , [ 0 , { { :. , _ , [ { :__aliases__ , meta , _ } , _ ] } , _ , _ } ] } ) , do: meta
74- defp get_meta ( { _op , _ , [ 0 , { _ , meta , _ } ] } ) , do: meta
75- defp get_meta ( { _op , _ , [ { { :. , _ , [ { :__aliases__ , meta , _ } , _ ] } , _ , _ } , 0 ] } ) , do: meta
76- defp get_meta ( { _op , _ , [ { _ , meta , _ } , 0 ] } ) , do: meta
99+ defp get_meta ( { _op , _ , [ _ , { { :. , _ , [ { :__aliases__ , meta , _ } , _ ] } , _ , _ } ] } ) , do: meta
100+ defp get_meta ( { _op , _ , [ _ , { _ , meta , _ } ] } ) , do: meta
101+ defp get_meta ( { _op , _ , [ { { :. , _ , [ { :__aliases__ , meta , _ } , _ ] } , _ , _ } , _ ] } ) , do: meta
102+ defp get_meta ( { _op , _ , [ { _ , meta , _ } , _ ] } ) , do: meta
77103
78104 defp suggest_for_arity ( 2 ) , do: "`not Enum.any?/2`"
79105 defp suggest_for_arity ( 1 ) , do: "`Enum.empty?/1` or `list == []`"
0 commit comments