Current section

Files

Jump to
demacro lib demacro.ex
Raw

lib/demacro.ex

defmodule Mix.Tasks.Demacro do
use Mix.Task
def run([filename | _]) do
File.read!(filename)
|> Code.string_to_quoted!()
|> Macro.postwalk(fn a -> try_expand(a) end)
|> Macro.to_string()
|> IO.puts()
end
def try_expand({:defmodule, _, _} = b), do: b
def try_expand({:def, _, _} = b), do: b
def try_expand({:defp, _, _} = b), do: b
def try_expand({:defmacro, _, _} = b), do: b
def try_expand({:defmacrop, _, _} = b), do: b
def try_expand(block) do
try do
Macro.expand(block, __ENV__)
rescue
e in ArgumentError -> block
end
end
end