multi_alias.ex (1582B)
1 defmodule Credo.Check.Readability.MultiAlias do 2 use Credo.Check, 3 base_priority: :low, 4 tags: [:controversial], 5 explanations: [ 6 check: """ 7 Multi alias expansion makes module uses harder to search for in large code bases. 8 9 # preferred 10 11 alias Module.Foo 12 alias Module.Bar 13 14 # NOT preferred 15 16 alias Module.{Foo, Bar} 17 18 Like all `Readability` issues, this one is not a technical concern. 19 But you can improve the odds of others reading and liking your code by making 20 it easier to follow. 21 """ 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 # TODO: consider for experimental check front-loader (ast) 33 defp traverse( 34 {:alias, _, [{{_, _, [{alias, opts, _base_alias}, :{}]}, _, [multi_alias | _]}]} = ast, 35 issues, 36 issue_meta 37 ) 38 when alias in [:__aliases__, :__MODULE__] do 39 {:__aliases__, _, module} = multi_alias 40 module = Enum.join(module, ".") 41 42 new_issue = issue_for(issue_meta, Keyword.get(opts, :line), module) 43 44 {ast, [new_issue | issues]} 45 end 46 47 defp traverse(ast, issues, _issue_meta), do: {ast, issues} 48 49 defp issue_for(issue_meta, line_no, trigger) do 50 format_issue( 51 issue_meta, 52 message: 53 "Avoid grouping aliases in '{ ... }'; please specify one fully-qualified alias per line.", 54 trigger: trigger, 55 line_no: line_no 56 ) 57 end 58 end