Packages
moon
2.87.7
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon/convert/ast.ex
defmodule Moon.Convert.Ast do
@moduledoc "Some helper functions for work with elixir module AST"
# import Macro
@doc "try Macro.to_string(function_ast(__MODULE__, :function_name))"
def function_ast(mod, fun) do
mod
|> module_ast()
|> Macro.prewalk(fn
result = {:def, _, [{^fun, _, _} | _]} -> throw(result)
other -> other
end)
:error_fetchig_ast
catch
result -> {:ok, result}
end
def module_ast(mod) do
mod.__info__(:compile)[:source]
|> to_string()
|> File.read!()
|> Code.string_to_quoted!()
end
def merge_ast(
{:defmodule, m1,
[
aliases,
[
do: {:__block__, [], children}
]
]},
{:defmodule, _,
[
_aliases,
[
do: {:__block__, [], children2}
]
]}
) do
{:defmodule, m1,
[
aliases,
[
do:
{:__block__, [],
(children ++ children2)
|> Enum.sort_by(fn
{:@, _, [{:moduledoc, _, _}]} -> 0
{:use, _, _} -> 1
{:alias, _, _} -> 2
{:import, _, _} -> 3
{:require, _, _} -> 4
_ -> 100
end)}
]
]}
end
def ast_aliases(ast, %{module: module}) do
{_, aliases} =
ast
|> Macro.prewalk([], fn
result = {:alias, _, [{:__aliases__, _, a} | _]}, acc ->
{result, acc ++ [a]}
result = {:alias, _, [{:__MODULE__, _, _}]}, acc ->
{result,
acc ++
[
module
|> to_string()
|> String.replace("Elixir.", "")
|> String.split(".")
|> Enum.map(&String.to_atom/1)
]}
result = {:alias, _, [{{:., _, [{:__aliases__, _, root_part}, :{}]}, _, children}]},
acc ->
{result,
acc ++
(children |> Enum.map(fn {:__aliases__, _, sub_part} -> root_part ++ sub_part end))}
other, acc ->
{other, acc}
end)
aliases
|> Enum.reduce(%{}, fn items, acc ->
Map.put(
acc,
Enum.at(items, -1) |> to_string(),
[:"Elixir" | items] |> Enum.map_join(".", &to_string/1) |> String.to_atom()
)
end)
end
def parent_module(module) do
module |> to_string() |> String.replace(~r/\.[A-Za-z]*$/, "") |> String.to_atom()
end
end