Current section

Files

Jump to
credo lib credo check readability redundant_blank_lines.ex
Raw

lib/credo/check/readability/redundant_blank_lines.ex

defmodule Credo.Check.Readability.RedundantBlankLines do
@moduledoc """
Files should not have two or more consecutive blank lines.
"""
@explanation [
check: @moduledoc,
params: [
max_blank_lines: "The maximum number of tolerated consecutive blank lines.",
]
]
@default_params [
max_blank_lines: 1
]
use Credo.Check, base_priority: :low
def run(%SourceFile{lines: lines} = source_file, params \\ []) do
issue_meta = IssueMeta.for(source_file, params)
max_blank_lines = params |> Params.get(:max_blank_lines, @default_params)
lines
|> blank_lines
|> consecutive_lines(max_blank_lines)
|> Enum.map(fn line -> issue_for(issue_meta, line, max_blank_lines) end)
end
defp issue_for(issue_meta, line, max_blank_lines) do
format_issue issue_meta,
message: "There should be no more than #{max_blank_lines} consecutive blank lines.",
line_no: line
end
defp blank_lines(lines) do
lines
|> Enum.filter(fn {_, content} -> content == "" end)
|> Enum.map(fn {pos, _} -> pos end)
end
defp consecutive_lines([], _), do: false
defp consecutive_lines([first_line|other_lines], max_blank_lines) do
reducer = consecutive_lines_reducer(max_blank_lines)
other_lines
|> Enum.reduce({first_line, 0, []}, reducer)
|> elem(2)
end
defp consecutive_lines_reducer(max_blank_lines) do
fn line, {last, consecutive, lines} ->
consecutive =
if last && line == last + 1 do
consecutive + 1
else
0
end
lines =
if consecutive >= max_blank_lines do
lines ++ [line]
else
lines
end
{line, consecutive, lines}
end
end
end