Current section

Files

Jump to
credo lib credo check lint_attribute.ex
Raw

lib/credo/check/lint_attribute.ex

defmodule Credo.Check.LintAttribute do
defstruct line: nil,
meta: nil, # TODO: remove these
arguments: nil, # TODO: as they are for debug purposes only
scope: nil,
value: nil
def from_ast({:@, meta, [{:lint, _, arguments}]}) do
%__MODULE__{
meta: meta,
arguments: arguments,
value: value_for(arguments)
}
end
def ignores_issue?(%__MODULE__{value: false} = lint_attribute, issue) do
lint_attribute.scope == issue.scope
end
def ignores_issue?(%__MODULE__{value: check_list} = lint_attribute, issue) when is_list(check_list) do
if lint_attribute.scope == issue.scope do
Enum.any?(check_list, &check_tuple_ignores_issue?(&1, issue))
else
false
end
end
def ignores_issue?(_, _), do: false
defp check_tuple_ignores_issue?({check_or_regex, false}, issue) do
if Regex.regex?(check_or_regex) do
issue.check
|> to_string
|> String.match?(check_or_regex)
else
issue.check == check_or_regex
end
end
defp check_tuple_ignores_issue?(_, _issue), do: false
def value_for([false]), do: false
def value_for([list]) when is_list(list) do
Enum.map(list, &value_for/1)
end
def value_for([tuple]) when is_tuple(tuple) do
[value_for(tuple)]
end
def value_for({{:__aliases__, _, mod_list}, params}) do
{Module.concat(mod_list), params}
end
def value_for({{:sigil_r, _, _} = sigil, params}) do
{result, _binding} = Code.eval_quoted(sigil)
{result, params}
end
def value_for({{:sigil_R, _, _} = sigil, params}) do
{result, _binding} = Code.eval_quoted(sigil)
{result, params}
end
def value_for(_), do: nil
end