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