Packages
credo
1.6.7
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.7-rc.0
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.2-rc.4
1.7.2-rc.3
1.7.2-rc.2
1.7.2-rc.1
1.7.2-rc.0
1.7.1
1.7.0
1.7.0-rc.2
1.7.0-rc.1
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.4.1
1.4.0
1.4.0-rc.2
1.4.0-rc.1
1.3.2
1.3.1
1.3.0
1.3.0-rc3
1.3.0-rc2
1.3.0-rc1
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc4
1.2.0-rc3
1.2.0-rc2
1.2.0-rc1
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.1.0-rc3
1.1.0-rc2
1.1.0-rc1
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.1-rc1
1.0.0
1.0.0-rc1
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.9.0-rc8
0.9.0-rc7
0.9.0-rc6
0.9.0-rc5
0.9.0-rc4
0.9.0-rc3
0.9.0-rc2
0.9.0-rc1
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.8.0-rc7
0.8.0-rc6
0.8.0-rc5
0.8.0-rc4
0.8.0-rc3
0.8.0-rc2
0.8.0-rc1
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.6.0-rc2
0.6.0-rc1
0.5.3
0.5.2
0.5.1
0.5.0
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.10-dev
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-beta5
0.4.0-beta4
0.4.0-beta3
0.4.0-beta2
0.4.0-beta1
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-dev2
0.3.0-dev
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.1-dev
A static code analysis tool with a focus on code consistency and teaching.
Current section
Files
Jump to
Current section
Files
lib/credo/check/config_comment.ex
defmodule Credo.Check.ConfigComment do
@moduledoc """
`ConfigComment` structs represent comments which follow control Credo's behaviour.
The following comments are supported:
# credo:disable-for-this-file
# credo:disable-for-next-line
# credo:disable-for-previous-line
# credo:disable-for-lines:<number>
"""
@instruction_disable_file "disable-for-this-file"
@instruction_disable_next_line "disable-for-next-line"
@instruction_disable_previous_line "disable-for-previous-line"
@instruction_disable_lines "disable-for-lines"
alias Credo.Issue
defstruct line_no: nil,
line_no_end: nil,
instruction: nil,
params: nil
@doc "Returns a `ConfigComment` struct based on the given parameters."
def new(instruction, param_string, line_no)
def new("#{@instruction_disable_lines}:" <> line_count, param_string, line_no) do
line_count = String.to_integer(line_count)
params =
param_string
|> value_for()
|> List.wrap()
if line_count >= 0 do
%__MODULE__{
line_no: line_no,
line_no_end: line_no + line_count,
instruction: @instruction_disable_lines,
params: params
}
else
%__MODULE__{
line_no: line_no + line_count,
line_no_end: line_no,
instruction: @instruction_disable_lines,
params: params
}
end
end
def new(instruction, param_string, line_no) do
%__MODULE__{
line_no: line_no,
instruction: instruction,
params: param_string |> value_for() |> List.wrap()
}
end
@doc "Returns `true` if the given `issue` should be ignored based on the given `config_comment`"
def ignores_issue?(config_comment, issue)
def ignores_issue?(
%__MODULE__{instruction: @instruction_disable_file, params: params},
%Issue{} = issue
) do
params_ignore_issue?(params, issue)
end
def ignores_issue?(
%__MODULE__{
instruction: @instruction_disable_next_line,
line_no: line_no,
params: params
},
%Issue{line_no: line_no_issue} = issue
)
when line_no_issue == line_no + 1 do
params_ignore_issue?(params, issue)
end
def ignores_issue?(
%__MODULE__{
instruction: @instruction_disable_previous_line,
line_no: line_no,
params: params
},
%Issue{line_no: line_no_issue} = issue
)
when line_no_issue == line_no - 1 do
params_ignore_issue?(params, issue)
end
def ignores_issue?(
%__MODULE__{
instruction: @instruction_disable_lines,
line_no: line_no_start,
line_no_end: line_no_end,
params: params
},
%Issue{line_no: line_no_issue} = issue
)
when line_no_issue >= line_no_start and line_no_issue <= line_no_end do
params_ignore_issue?(params, issue)
end
def ignores_issue?(_, _) do
false
end
#
defp params_ignore_issue?([], _issue) do
true
end
defp params_ignore_issue?(params, issue) when is_list(params) do
Enum.any?(params, &check_tuple_ignores_issue?(&1, issue))
end
defp check_tuple_ignores_issue?(check_or_regex, 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 value_for(""), do: nil
defp value_for(param_string) do
if regex_value?(param_string) do
param_string
|> String.slice(1..-2)
|> Regex.compile!("i")
else
String.to_atom("Elixir.#{param_string}")
end
end
defp regex_value?(param_string), do: param_string =~ ~r'^/.+/$'
end