@@ -20,6 +20,9 @@ const BIG_ENDIAN = (ENDIAN_BOM == 0x01020304)
20
20
export Pkg
21
21
end
22
22
23
+ _stdout () = @static V6_COMPAT ? STDOUT : stdout
24
+ _stderr () = @static V6_COMPAT ? STDERR : stderr
25
+
23
26
Base. parse (:: Type{Expr} , args... ; kwargs... ) =
24
27
Meta. parse (args... ; kwargs... )
25
28
@@ -80,7 +83,8 @@ function m_eval(mod, expr)
80
83
Core. eval (mod, expr)
81
84
catch ex
82
85
println (" m_eval($mod , $expr )" );
83
- rethrow (ex)
86
+ println (sprint (showerror, ex, catch_backtrace ()))
87
+ # rethrow(ex)
84
88
end
85
89
end
86
90
m_eval (expr) = m_eval (cur_mod (), expr)
@@ -111,7 +115,7 @@ m_eval(expr) = m_eval(cur_mod(), expr)
111
115
112
116
"""
113
117
macro api (cmd:: Symbol )
114
- mod = @static V6_COMPAT ? current_module () : __module__
118
+ mod = @static V6_COMPAT ? current_module () : @__MODULE__
115
119
cmd == :list ? _api_list (mod) :
116
120
cmd == :freeze ? _api_freeze (mod) :
117
121
error (" @api unrecognized command: $cmd " )
@@ -167,15 +171,20 @@ function push_args!(symbols, lst, grp)
167
171
end
168
172
end
169
173
174
+ """ Initialize the temp api variable for this module"""
175
+ _init_api (curmod) =
176
+ isdefined (curmod, :__tmp_api__ ) ||
177
+ m_eval (curmod, :( export @api , ModuleInterfaceTools ;
178
+ global __tmp_api__ = ModuleInterfaceTools. TMP_API ($ curmod)))
179
+
170
180
""" Add symbols"""
171
181
function _add_symbols (curmod, grp, exprs)
172
182
if debug[]
173
183
print (" _add_symbols($curmod , $grp , $exprs )" )
174
184
isdefined (curmod, :__tmp_api__ ) && print (" => " , m_eval (curmod, :__tmp_api__ ))
175
185
println ()
176
186
end
177
- ex = :( export @api , ModuleInterfaceTools ; global __tmp_api__ = ModuleInterfaceTools. TMP_API ($ curmod) )
178
- isdefined (curmod, :__tmp_api__ ) || m_eval (curmod, ex)
187
+ _init_api (curmod)
179
188
if grp == :base!
180
189
for ex in exprs
181
190
if isa (ex, Expr) && ex. head == :tuple
@@ -212,18 +221,21 @@ function _add_symbols(curmod, grp, exprs)
212
221
nothing
213
222
end
214
223
224
+ has_api (mod) = isdefined (mod, :__api__ )
225
+ get_api (mod) = m_eval (mod, :__api__ )
226
+
215
227
function _api_extend (curmod, modules, cpy:: Bool )
216
228
for nam in modules
217
229
mod = m_eval (curmod, nam)
218
- if isdefined (mod, :__api__ )
219
- api = m_eval (mod, :__api__ )
220
- _do_list (curmod, cpy, :import , :Base , :base , api)
221
- _do_list (curmod, cpy, :import , nam, :public! , api)
222
- _do_list (curmod, cpy, :import , nam, :develop! , api)
223
- _do_list (curmod, cpy, :using , nam, :public , api)
224
- _do_list (curmod, cpy, :using , nam, :develop , api)
230
+ if has_api (mod)
231
+ api = get_api (mod)
232
+ _do_list (curmod, cpy, :import , Base, :Base , :base , api)
233
+ _do_list (curmod, cpy, :import , mod, nam, :public! , api)
234
+ _do_list (curmod, cpy, :import , mod, nam, :develop! , api)
235
+ _do_list (curmod, cpy, :using , mod, nam, :public , api)
236
+ _do_list (curmod, cpy, :using , mod, nam, :develop , api)
225
237
else
226
- _do_list (curmod, cpy, :import , nam, :public! , names (mod))
238
+ _do_list (curmod, cpy, :import , mod, nam, :public! , names (mod))
227
239
end
228
240
end
229
241
nothing
@@ -232,12 +244,12 @@ end
232
244
function _api_use (curmod, modules, cpy:: Bool )
233
245
for nam in modules
234
246
mod = m_eval (curmod, nam)
235
- if isdefined (mod, :__api__ )
236
- api = m_eval (mod, :__api__ )
237
- _do_list (curmod, cpy, :using , nam, :public , api)
238
- _do_list (curmod, cpy, :using , nam, :public! , api)
247
+ if has_api (mod)
248
+ api = get_api (mod)
249
+ _do_list (curmod, cpy, :using , mod, nam, :public , api)
250
+ _do_list (curmod, cpy, :using , mod, nam, :public! , api)
239
251
else
240
- _do_list (curmod, cpy, :using , nam, :public! , names (mod))
252
+ _do_list (curmod, cpy, :using , mod, nam, :public! , names (mod))
241
253
end
242
254
end
243
255
nothing
246
258
function _api_export (curmod, modules)
247
259
for nam in modules
248
260
mod = m_eval (curmod, nam)
249
- if isdefined (mod, :__api__ )
250
- api = m_eval (mod, :__api__ )
261
+ api = get_api (mod)
262
+ if has_api (mod)
263
+ api = get_api (mod)
251
264
m_eval (curmod, Expr ( :export , getfield (api, :modules )... ))
252
265
m_eval (curmod, Expr ( :export , getfield (api, :public )... ))
253
266
m_eval (curmod, Expr ( :export , getfield (api, :public! )... ))
@@ -300,48 +313,60 @@ function _api(curmod::Module, cmd::Symbol, exprs)
300
313
301
314
for nam in modules
302
315
mod = m_eval (curmod, nam)
303
- for sym in getfield (m_eval (mod, :__api__ ), :modules )
304
- m_eval (curmod, :(using $ nam.$ sym))
316
+ if has_api (mod)
317
+ for sym in getfield (get_api (mod), :modules )
318
+ if isdefined (mod, sym)
319
+ m_eval (curmod, :(using $ nam.$ sym))
320
+ else
321
+ println (_stderr (), " Warning: Exported symbol $sym is not defined in $nam " )
322
+ end
323
+ end
305
324
end
306
325
end
307
326
308
327
# Be nice and set up standard Test
309
328
cmd == :test && m_eval (curmod, V6_COMPAT ? :(using Base. Test) : :(using Test))
310
329
330
+ cpy = (cmd == :use! ) || (cmd == :extend! )
331
+
332
+ cpy && _init_api (curmod)
311
333
((cmd == :use || cmd == :use! )
312
- ? _api_use (curmod, modules, cmd == :use! )
313
- : _api_extend (curmod, modules, cmd == :extend! ))
334
+ ? _api_use (curmod, modules, cpy )
335
+ : _api_extend (curmod, modules, cpy ))
314
336
end
315
337
316
338
@static V6_COMPAT || (_dot_name (nam) = Expr (:., nam))
317
339
318
- _do_list (curmod, cpy, cmd, mod, grp, api:: API ) =
319
- _do_list (curmod, cpy, cmd, mod, grp, getfield (api, grp))
340
+ _do_list (curmod, cpy, cmd, mod, nam, grp, api:: API ) =
341
+ _do_list (curmod, cpy, cmd, mod, nam, grp, getfield (api, grp))
320
342
321
- function _do_list (curmod, cpy, cmd, mod, grp, lst)
322
- isempty (lst) && return
323
- @static if V6_COMPAT
324
- for nam in lst
325
- exp = Expr (cmd, mod, nam)
326
- debug[] && println (" V6: $cmd , $mod , $mod , $exp " )
327
- m_eval (curmod, exp)
328
- end
329
- else
330
- exp = Expr (cmd, Expr (:(:), _dot_name (mod), _dot_name .(lst)... ))
331
- debug[] && println (" V7: $cmd , $mod , $mod , $exp " )
332
- try
333
- m_eval (curmod, exp)
334
- catch ex
335
- println (" ModuleInterfaceTools: Error evaluating $exp " )
336
- dump (exp)
337
- println (sprint (showerror, ex, catch_backtrace ()))
343
+ function _do_list (curmod, cpy, cmd, mod, nam, grp, lst)
344
+ for sym in lst
345
+ if isdefined (mod, sym)
346
+ m_eval (curmod, Expr (cmd, nam, sym))
347
+ cpy && m_eval (curmod, :( push! (__tmp_api__.$ grp, $ (QuoteNode (sym)) )))
348
+ else
349
+ println (_stderr (), " Warning: Exported symbol $sym is not defined in $nam " )
338
350
end
339
351
end
352
+ end
353
+
354
+ #=
355
+ function _do_list(curmod, cpy, cmd, mod, nam, grp, lst)
356
+ exp = Expr(cmd, Expr(:(:), _dot_name(nam), _dot_name.(lst)...))
357
+ try
358
+ m_eval(curmod, exp)
359
+ catch ex
360
+ println("ModuleInterfaceTools: Error evaluating $exp")
361
+ dump(exp)
362
+ println(sprint(showerror, ex, catch_backtrace()))
363
+ end
340
364
cpy && for sym in lst; m_eval(curmod, :( push!(__tmp_api__.$grp, $(QuoteNode(sym)) ))); end
341
365
end
366
+ =#
342
367
343
368
macro api (cmd:: Symbol , exprs... )
344
- @static V6_COMPAT ? _api ( current_module (), cmd, exprs) : _api (__module__ , cmd, exprs)
369
+ _api (( @static V6_COMPAT ? current_module () : @__MODULE__ ) , cmd, exprs)
345
370
end
346
371
347
372
end # module ModuleInterfaceTools
0 commit comments