@@ -117,8 +117,9 @@ defmodule Mimic.Module do
117117 mimic_info = module_mimic_info ( opts )
118118 mimic_behaviours = generate_mimic_behaviours ( module )
119119 mimic_functions = generate_mimic_functions ( module )
120+ mimic_macros = generate_mimic_macros ( module )
120121 mimic_struct = generate_mimic_struct ( module )
121- quoted = [ mimic_info , mimic_struct | mimic_behaviours ++ mimic_functions ]
122+ quoted = [ mimic_info , mimic_struct | mimic_behaviours ++ mimic_functions ++ mimic_macros ]
122123 Module . create ( module , quoted , Macro.Env . location ( __ENV__ ) )
123124 module
124125 end
@@ -175,7 +176,14 @@ defmodule Mimic.Module do
175176 defp generate_mimic_functions ( module ) do
176177 internal_functions = [ __info__: 1 , module_info: 0 , module_info: 1 ]
177178
178- for { fn_name , arity } <- module . module_info ( :exports ) ,
179+ functions =
180+ if function_exported? ( module , :__info__ , 1 ) do
181+ module . __info__ ( :functions )
182+ else
183+ module . module_info ( :exports )
184+ end
185+
186+ for { fn_name , arity } <- functions ,
179187 { fn_name , arity } not in internal_functions do
180188 args = Macro . generate_arguments ( arity , module )
181189
@@ -187,6 +195,26 @@ defmodule Mimic.Module do
187195 end
188196 end
189197
198+ defp generate_mimic_macros ( module ) do
199+ macros =
200+ if function_exported? ( module , :__info__ , 1 ) do
201+ module . __info__ ( :macros )
202+ else
203+ [ ]
204+ end
205+
206+ for { macro_name , arity } <- macros do
207+ args = Macro . generate_arguments ( arity , module )
208+ macro_fun = String . to_existing_atom ( "MACRO-#{ macro_name } " )
209+
210+ quote do
211+ defmacro unquote ( macro_name ) ( unquote_splicing ( args ) ) do
212+ Server . apply ( __MODULE__ , unquote ( macro_fun ) , [ __CALLER__ | unquote ( args ) ] )
213+ end
214+ end
215+ end
216+ end
217+
190218 defp generate_mimic_behaviours ( module ) do
191219 module . module_info ( :attributes )
192220 |> Keyword . get_values ( :behaviour )
0 commit comments