Current section

Files

Jump to
reach lib reach source.ex
Raw

lib/reach/source.ex

defmodule Reach.Source do
@moduledoc "Helpers for attaching source-origin metadata to lowered AST."
alias Reach.Source.{Origin, Span}
@metadata_key :reach
def metadata_key, do: @metadata_key
def origin(meta) when is_list(meta), do: Keyword.get(meta, @metadata_key)
def origin(_), do: nil
def put_origin({form, meta, args}, %Origin{} = origin) when is_list(meta) and is_list(args) do
{form, Keyword.put(meta, @metadata_key, origin), args}
end
def put_origin(ast, _origin), do: ast
def span_from_origin(%Origin{span: span}), do: Span.to_map(span)
def span_from_origin(_), do: nil
def project_files(project) do
project.nodes
|> Map.values()
|> Enum.flat_map(fn node ->
case node.source_span do
%{file: file} when is_binary(file) -> [file]
_span -> []
end
end)
|> Enum.uniq()
|> Enum.reject(&dependency_file?/1)
|> Enum.sort()
end
defp dependency_file?(file) do
String.contains?(file, "/deps/") or String.contains?(file, "/_build/")
end
end