Packages
metastatic
0.4.2
0.26.0
0.25.0
0.24.1
0.24.0
0.23.0
0.22.2
0.22.1
0.22.0
0.21.3
0.21.2
0.21.1
0.21.0
0.20.3
0.20.2
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.1
0.15.0
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Cross-language code meta-model library using unified MetaAST representation. Parse, transform, and translate code across Python, Elixir, Ruby, Erlang, Haskell, and more via a shared three-tuple AST format.
Current section
Files
Jump to
Current section
Files
lib/metastatic/document/analyzer.ex
defmodule Metastatic.Document.Analyzer do
@moduledoc false
@callback handle_analyze(Metastatic.Document.t(), keyword()) ::
{:ok, map()} | {:error, term()}
defmacro __using__(opts \\ []) do
quote location: :keep, generated: true do
@behaviour Metastatic.Document.Analyzer
doc =
Keyword.get(
unquote(opts),
:doc,
"Analyzes a document for #{inspect(__MODULE__)}, raising on error."
)
@doc doc
@spec analyze(Metastatic.Document.t()) :: {:ok, map()} | {:error, term()}
@spec analyze(Metastatic.Document.t(), keyword()) :: {:ok, map()} | {:error, term()}
@spec analyze(Metastatic.language(), term(), keyword()) :: {:ok, map()} | {:error, term()}
def analyze(language_or_doc, source_or_ast_or_opts \\ [], opts \\ [])
def analyze(language, source_or_ast, opts) when is_atom(language) do
with {:ok, doc} <- Metastatic.Document.normalize({language, source_or_ast}),
do: analyze(doc, opts, opts)
end
def analyze(%Metastatic.Document{ast: nil}, _, _),
do: {:error, :invalid_ast}
def analyze(%Metastatic.Document{ast: _} = doc, opts, _),
do: handle_analyze(doc, opts)
@doc doc <> "\n\nUnlike not-banged version, this one either returns a result or raises"
@spec analyze!(Metastatic.Document.t()) :: map()
@spec analyze!(Metastatic.Document.t(), keyword()) :: map()
@spec analyze!(Metastatic.language(), term(), keyword()) :: map()
def analyze!(language_or_doc, source_or_ast_or_opts \\ [], opts \\ []) do
case analyze(language_or_doc, source_or_ast_or_opts, opts) do
{:ok, result} ->
result
{:error, reason} ->
raise "Analysis by #{inspect(__MODULE__)} failed: #{inspect(reason)}"
end
end
end
end
end