Current section

Files

Jump to
credo lib credo check consistency space_around_operators without_space.ex
Raw

lib/credo/check/consistency/space_around_operators/without_space.ex

defmodule Credo.Check.Consistency.SpaceAroundOperators.WithoutSpace do
use Credo.Check.CodePattern
alias Credo.Check.CodeHelper
alias Credo.Check.Consistency.SpaceAroundOperators.SpaceHelper
def property_value, do: :without_space
def property_value_for(source_file, _params) do
property_values_for(source_file.source, source_file.filename)
end
defp property_values_for(source, filename) do
source
|> CodeHelper.clean_strings_and_sigils
|> Credo.Code.to_tokens
|> check_tokens([])
|> Enum.uniq
|> Enum.map(&to_property_values(&1, filename))
end
defp to_property_values({{line_no, column, _}, trigger}, filename) do
property_value
|> PropertyValue.for(filename: filename, line_no: line_no, column: column, trigger: trigger)
end
defp check_tokens([], acc), do: acc
defp check_tokens([prev | t], acc) do
current = t |> List.first
next = t |> Enum.at(1)
if SpaceHelper.operator?(current) do
acc = acc ++ collect_tokens(prev, current, next)
end
check_tokens(t, acc)
end
def collect_tokens(prev, operator, next) do
list = []
if SpaceHelper.no_space_between?(prev, operator) && !SpaceHelper.usually_no_space_before?(prev, operator, next) do
list = list ++ [SpaceHelper.trigger_token(operator)]
end
if SpaceHelper.no_space_between?(operator, next) && !SpaceHelper.usually_no_space_after?(prev, operator, next) do
case next do
{:eol, _} ->
nil
_ ->
list = list ++ [SpaceHelper.trigger_token(operator)]
end
end
list
end
end