operation_with_constant_result.ex (1588B)
1 defmodule Credo.Check.Warning.OperationWithConstantResult do 2 use Credo.Check, 3 base_priority: :high, 4 explanations: [ 5 check: """ 6 Some numerical operations always yield the same result and therefore make 7 little sense in production code. 8 9 Examples: 10 11 x * 1 # always returns x 12 x * 0 # always returns 0 13 14 In practice they are likely the result of a debugging session or were made by 15 mistake. 16 """ 17 ] 18 19 @ops_and_constant_results [ 20 {:*, "zero", 0}, 21 {:*, "the left side of the expression", 1} 22 ] 23 24 @doc false 25 @impl true 26 def run(%SourceFile{} = source_file, params) do 27 issue_meta = IssueMeta.for(source_file, params) 28 29 Credo.Code.prewalk(source_file, &traverse(&1, &2, issue_meta)) 30 end 31 32 # skip references to functions 33 defp traverse({:&, _, _}, issues, _) do 34 {nil, issues} 35 end 36 37 for {op, constant_result, operand} <- @ops_and_constant_results do 38 defp traverse( 39 {unquote(op), meta, [_lhs, unquote(operand)]} = ast, 40 issues, 41 issue_meta 42 ) do 43 new_issue = 44 issue_for( 45 issue_meta, 46 meta[:line], 47 unquote(op), 48 unquote(constant_result) 49 ) 50 51 {ast, issues ++ [new_issue]} 52 end 53 end 54 55 defp traverse(ast, issues, _issue_meta) do 56 {ast, issues} 57 end 58 59 defp issue_for(issue_meta, line_no, trigger, constant_result) do 60 format_issue( 61 issue_meta, 62 message: "Operation will always return #{constant_result}.", 63 trigger: trigger, 64 line_no: line_no 65 ) 66 end 67 end