alias_as.ex (1804B)
1 defmodule Credo.Check.Readability.AliasAs do 2 use Credo.Check, 3 base_priority: :low, 4 tags: [:experimental], 5 explanations: [ 6 check: """ 7 Aliases which are not completely renamed using the `:as` option are easier to follow. 8 9 # preferred 10 11 def MyModule do 12 alias MyApp.Module1 13 14 def my_function(foo) do 15 Module1.run(foo) 16 end 17 end 18 19 # NOT preferred 20 21 def MyModule do 22 alias MyApp.Module1, as: M1 23 24 def my_function(foo) do 25 # what the heck is `M1`? 26 M1.run(foo) 27 end 28 end 29 30 Like all `Readability` issues, this one is not a technical concern. 31 But you can improve the odds of others reading and liking your code by making 32 it easier to follow. 33 """ 34 ] 35 36 @doc false 37 @impl true 38 def run(%SourceFile{} = source_file, params) do 39 source_file 40 |> Credo.Code.prewalk(&traverse(&1, &2, IssueMeta.for(source_file, params))) 41 |> Enum.reverse() 42 end 43 44 defp traverse(ast, issues, issue_meta), do: {ast, add_issue(issues, issue(ast, issue_meta))} 45 46 defp add_issue(issues, nil), do: issues 47 defp add_issue(issues, issue), do: [issue | issues] 48 49 defp issue({:alias, _, [{:__MODULE__, _, nil}, [as: {_, meta, _}]]}, issue_meta), 50 do: issue_for(issue_meta, meta[:line], inspect(:__MODULE__)) 51 52 defp issue({:alias, _, [{_, _, original}, [as: {_, meta, _}]]}, issue_meta), 53 do: issue_for(issue_meta, meta[:line], inspect(Module.concat(original))) 54 55 defp issue(_ast, _issue_meta), do: nil 56 57 defp issue_for(issue_meta, line_no, trigger) do 58 format_issue( 59 issue_meta, 60 message: "Avoid using the :as option with alias.", 61 trigger: trigger, 62 line_no: line_no 63 ) 64 end 65 end