impl_true.ex (1403B)
1 defmodule Credo.Check.Readability.ImplTrue do 2 use Credo.Check, 3 base_priority: :normal, 4 explanations: [ 5 check: """ 6 When implementing behaviour callbacks, `@impl true` indicates that a function implements a callback, but 7 a better way is to note the actual behaviour being implemented, for example `@impl MyBehaviour`. This 8 not only improves readability, but adds extra validation in cases where multiple behaviours are implemented 9 in a single module. 10 11 Instead of: 12 13 @impl true 14 def my_funcion() do 15 ... 16 17 use: 18 19 @impl MyBehaviour 20 def my_funcion() do 21 ... 22 23 """ 24 ] 25 26 alias Credo.Code.Heredocs 27 28 @doc false 29 @impl true 30 def run(%SourceFile{} = source_file, params) do 31 issue_meta = IssueMeta.for(source_file, params) 32 33 source_file 34 |> Heredocs.replace_with_spaces() 35 |> String.split("\n") 36 |> Enum.with_index(1) 37 |> Enum.reduce([], &check_line(&1, &2, issue_meta)) 38 end 39 40 defp check_line({line, line_number}, issues, issue_meta) do 41 case String.trim(line) do 42 "@impl true" -> [issue_for(issue_meta, line_number) | issues] 43 _ -> issues 44 end 45 end 46 47 defp issue_for(issue_meta, line_no) do 48 format_issue( 49 issue_meta, 50 message: "@impl true should be @impl MyBehaviour", 51 trigger: "@impl true", 52 line_no: line_no 53 ) 54 end 55 end