Run `Macro.expand` on `use` macro with different __ENV__


I’m stuck on a meta programming problem and was hoping someone could enlighten me.

My library rewire is re-wiring aliases of any Elixir module by loading the module’s source file, using Code.string_to_quoted to get the AST, transforming it, and finally using Code.eval_quoted to generate the new module.

But some modules have a use macro in it (like use GenServer) and I’d like to run the AST through Macro.expand on it so get the final code before rewiring it. Problem is that the __ENV__ I have is not the one for the module I’m rewiring but simply my library’s module. So when I use Macro.expand, I see:

you must require GenServer before invoking the macro GenServer.__using__/

To play around with it, I’ve narrow it down to this code snippet:

quote do
  use GenServer
end |> Macro.prewalk(fn (ast) ->
  Macro.expand(ast, __ENV__) |> IO.inspect()

This gives me the same error message from above.

The intermediate output is

{:__block__, [],
   {:__block__, [],
      {:require, [counter: -576460752303423071, context: Kernel], [GenServer]},
      {{:., [], [GenServer, :__using__]}, [], [[]]}

So it resolves the use to those two instructions but then it fails.

How can I expand this macro correctly?