Current section
Files
Jump to
Current section
Files
lib/credo/check/config_comment_finder.ex
defmodule Credo.Check.ConfigCommentFinder do
@moduledoc false
# This check is used internally by Credo.
#
# It traverses the given codebase to find `Credo.Check.ConfigComment`
# compatible comments, which control Credo's behaviour.
@explanation nil
@config_comment_format ~r/#\s*credo\:([\w-\:]+)\s*(.*)/im
use Credo.Check, run_on_all: true, base_priority: :high
alias Credo.Check.ConfigComment
alias Credo.SourceFile
@doc false
def run(source_files, _exec, _params) when is_list(source_files) do
source_files
|> Enum.map(&find_and_set_in_source_file/1)
|> Enum.reject(&is_nil/1)
end
def find_and_set_in_source_file(source_file) do
case find_config_comments(source_file) do
[] ->
nil
config_comments ->
{source_file.filename, config_comments}
end
end
defp find_config_comments(source_file) do
source = SourceFile.source(source_file)
if source =~ @config_comment_format do
source
|> Credo.Code.clean_charlists_strings_and_sigils()
|> Credo.Code.to_lines()
|> Enum.reduce([], &find_config_comment/2)
else
[]
end
end
defp find_config_comment({line_no, string}, memo) do
case Regex.run(@config_comment_format, string) do
nil ->
memo
[_, instruction, param_string] ->
memo ++ [ConfigComment.new(instruction, param_string, line_no)]
end
end
end