Packages

Really just Credo. Plus some additional functionality.

Current section

Files

Jump to
credo_plus lib credo code token_ast_correlation.ex
Raw

lib/credo/code/token_ast_correlation.ex

defmodule Credo.Code.TokenAstCorrelation do
if Version.match?(System.version(), ">= 1.6.0-rc") do
# Elixir >= 1.6.0
def find_tokens_in_ast(wanted_token, ast) do
Credo.Code.prewalk(ast, &traverse_ast_for_token(&1, &2, wanted_token))
end
defp traverse_ast_for_token({:., meta, arguments} = ast, acc, token)
when is_list(arguments) do
{line_no_start, col_start, _line_no_end, _col_end} = Credo.Code.Token.position(token)
if meta[:line] == line_no_start && meta[:column] == col_start - 1 do
{nil, acc ++ [ast]}
else
{ast, acc}
end
end
defp traverse_ast_for_token({_name, meta, _arguments} = ast, acc, token) do
{line_no_start, col_start, _line_no_end, _col_end} = Credo.Code.Token.position(token)
if meta[:line] == line_no_start && meta[:column] == col_start do
{nil, acc ++ [ast]}
else
{ast, acc}
end
end
defp traverse_ast_for_token(ast, acc, _token) do
{ast, acc}
end
else
# Elixir <= 1.5.x
def find_tokens_in_ast(_wanted_token, _ast) do
nil
end
end
end