Skip to content

Commit 34e2d14

Browse files
authored
Merge pull request #947 from hoyon/forbidden-module-nested-alias
Make Credo.Check.Warning.ForbiddenModule work for grouped aliases
2 parents fa82efd + 7e47e38 commit 34e2d14

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

lib/credo/check/warning/forbidden_module.ex

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,42 @@ defmodule Credo.Check.Warning.ForbiddenModule do
4040
defp traverse(ast = {:__aliases__, meta, modules}, issues, forbidden_modules, issue_meta) do
4141
module = Name.full(modules)
4242

43+
issues = put_issue_if_forbidden(issues, issue_meta, meta[:line], module, forbidden_modules)
44+
45+
{ast, issues}
46+
end
47+
48+
defp traverse(
49+
ast = {:alias, _meta, [{{_, _, [{:__aliases__, _opts, base_alias}, :{}]}, _, aliases}]},
50+
issues,
51+
forbidden_modules,
52+
issue_meta
53+
) do
54+
modules =
55+
Enum.map(aliases, fn {:__aliases__, meta, module} ->
56+
{Name.full([base_alias, module]), meta[:line]}
57+
end)
58+
59+
issues =
60+
Enum.reduce(modules, issues, fn {module, line}, issues ->
61+
put_issue_if_forbidden(issues, issue_meta, line, module, forbidden_modules)
62+
end)
63+
64+
{ast, issues}
65+
end
66+
67+
defp traverse(ast, issues, _, _), do: {ast, issues}
68+
69+
defp put_issue_if_forbidden(issues, issue_meta, line_no, module, forbidden_modules) do
4370
forbidden_module_names = Enum.map(forbidden_modules, &elem(&1, 0))
4471

4572
if found_module?(forbidden_module_names, module) do
46-
{ast, [issue_for(issue_meta, meta[:line], module, forbidden_modules) | issues]}
73+
[issue_for(issue_meta, line_no, module, forbidden_modules) | issues]
4774
else
48-
{ast, issues}
75+
issues
4976
end
5077
end
5178

52-
defp traverse(ast, issues, _, _), do: {ast, issues}
53-
5479
defp found_module?(forbidden_module_names, module) do
5580
Enum.member?(forbidden_module_names, module)
5681
end
@@ -68,6 +93,9 @@ defmodule Credo.Check.Warning.ForbiddenModule do
6893
end
6994

7095
defp message(forbidden_modules, module) do
71-
Enum.find_value(forbidden_modules, fn {^module, message} -> message end)
96+
Enum.find_value(forbidden_modules, fn
97+
{^module, message} -> message
98+
_ -> nil
99+
end)
72100
end
73101
end

test/credo/check/warning/forbidden_module_test.exs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ defmodule Credo.Check.Warning.ForbiddenModuleTest do
6565
|> assert_issue()
6666
end
6767

68+
test "it should report on grouped aliases" do
69+
"""
70+
defmodule CredoSampleModule do
71+
alias CredoSampleModule.{AllowedModule, ForbiddenModule, ForbiddenModule2}
72+
def some_function, do: ForbiddenModule.another_function()
73+
end
74+
"""
75+
|> to_source_file
76+
|> run_check(@described_check, modules: [CredoSampleModule.ForbiddenModule, CredoSampleModule.ForbiddenModule2])
77+
|> assert_issues()
78+
end
79+
6880
test "it should report on import" do
6981
"""
7082
defmodule CredoSampleModule do
@@ -103,4 +115,16 @@ defmodule Credo.Check.Warning.ForbiddenModuleTest do
103115
assert issue.message == expected_message
104116
end)
105117
end
118+
119+
test "it should work with multiple forbidden modules" do
120+
"""
121+
defmodule CredoSampleModule do
122+
def some_function, do: CredoSampleModule.ForbiddenModule.another_function()
123+
def some_function2, do: CredoSampleModule.ForbiddenModule2.another_function()
124+
end
125+
"""
126+
|> to_source_file
127+
|> run_check(@described_check, modules: [CredoSampleModule.ForbiddenModule, CredoSampleModule.ForbiddenModule2])
128+
|> assert_issues()
129+
end
106130
end

0 commit comments

Comments
 (0)