Skip to content

Commit bf0502a

Browse files
committed
Change to do more an compile time
1 parent 60eb385 commit bf0502a

File tree

1 file changed

+59
-48
lines changed

1 file changed

+59
-48
lines changed

src/APITools.jl

Lines changed: 59 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ function _api_freeze(mod::Module)
120120
nothing
121121
end
122122

123-
const _cmduse = (:use, :test, :extend, :export)
123+
const _cmduse = (:use, :test, :extend, :export, :list)
124124
const _cmdadd =
125125
(:define_module, :define_public, :define_develop, :public, :develop, :base, :maybe_public)
126126

@@ -178,29 +178,24 @@ function _add_symbols(curmod, grp, exprs)
178178
nothing
179179
end
180180

181-
function _make_modules(curmod, cmd, exprs)
182-
modlst = SymSet()
181+
function _api(curmod::Module, cmd::Symbol, exprs)
182+
ind = _ff(_cmdadd, cmd)
183+
ind == 0 || return _add_symbols(curmod, cmd, exprs)
184+
185+
_ff(_cmduse, cmd) == 0 && error("Syntax error: @api $cmd $exprs")
186+
187+
modules = SymSet()
183188
for ex in exprs
184189
if isa(ex, Expr) && ex.head == :tuple
185-
push!(modlst, ex.args...)
190+
push!(modules, ex.args...)
186191
for sym in ex.args ; eval(curmod, :(import $sym)) ; end
187192
elseif isa(ex, Symbol)
188-
push!(modlst, ex)
193+
push!(modules, ex)
189194
eval(curmod, :(import $ex))
190195
else
191196
error("@api $cmd: syntax error $ex")
192197
end
193198
end
194-
modlst
195-
end
196-
197-
function _api(curmod::Module, cmd::Symbol, exprs)
198-
ind = _ff(_cmdadd, cmd)
199-
ind == 0 || return _add_symbols(curmod, cmd, exprs)
200-
201-
ind = _ff(_cmduse, cmd)
202-
203-
modules = _make_modules(curmod, cmd, exprs)
204199

205200
cmd == :export &&
206201
return esc(Expr(:toplevel,
@@ -212,50 +207,66 @@ function _api(curmod::Module, cmd::Symbol, exprs)
212207
[:(eval(APITools._api_display($mod))) for mod in modules]...,
213208
nothing)
214209

215-
lst = Expr[]
216-
for mod in modules
217-
exp = "APITools._make_module_list($(QuoteNode(mod)), $mod.__api__.define_module)"
218-
push!(lst, :(eval($(Meta.parse(exp)))))
210+
for nam in modules
211+
mod = eval(curmod, nam)
212+
api = eval(mod, :__api__)
213+
lst = getfield(api, :define_module)
214+
for sym in lst
215+
eval(curmod, :(using $mod.$sym))
216+
end
219217
end
220218

221-
if cmd == :use
222-
grplst = (:public, :define_public)
223-
elseif cmd == :test
224-
grplst = (:public, :develop, :define_public, :define_develop)
225-
push!(lst, V6_COMPAT ? :(using Base.Test) : :(using Test))
226-
elseif cmd == :extend
227-
grplst = (:define_public, :define_develop)
228-
for mod in modules, grp in (:base, :public, :develop)
229-
push!(lst, _make_exprs(:import, mod, grp))
219+
if cmd == :extend
220+
for nam in modules
221+
mod = eval(curmod, nam)
222+
if isdefined(mod, :__api__)
223+
api = eval(mod, :__api__)
224+
_import_list(curmod, api, :Base, :base)
225+
_import_list(curmod, api, nam, :public)
226+
_import_list(curmod, api, nam, :develop)
227+
_using_list(curmod, api, nam, :define_public)
228+
_using_list(curmod, api, nam, :define_develop)
229+
else
230+
println("API not found for module: $mod")
231+
end
230232
end
231-
else
232-
error("@api unrecognized command: $cmd")
233+
return nothing
233234
end
234-
for mod in modules, grp in grplst
235-
push!(lst, _make_exprs(:using, mod, grp))
235+
236+
# Be nice and set up standard Test
237+
cmd == :test && eval(curmod, V6_COMPAT ? :(using Base.Test) : :(using Test))
238+
239+
for nam in modules
240+
mod = eval(curmod, nam)
241+
if isdefined(mod, :__api__)
242+
api = eval(mod, :__api__)
243+
_using_list(curmod, api, nam, :public)
244+
_using_list(curmod, api, nam, :define_public)
245+
if cmd == :test
246+
_using_list(curmod, api, nam, :public)
247+
_using_list(curmod, api, nam, :define_public)
248+
end
249+
end
236250
end
237-
esc(Expr(:toplevel, lst..., nothing))
238-
end
239251

240-
macro api(cmd::Symbol, exprs...)
241-
@static V6_COMPAT ? _api(current_module(), cmd, exprs) : _api(__module__, cmd, exprs)
252+
nothing
242253
end
243254

244-
function _make_module_list(mod, lst)
245-
isempty(lst) && return nothing
246-
length(lst) == 1 ? :(import $mod.$(lst[1])) :
247-
Expr(:toplevel, [:(import $mod.$nam) for nam in lst]..., nothing)
255+
function _using_list(curmod, api, mod, grp)
256+
lst = getfield(api, grp)
257+
for sym in lst
258+
eval(curmod, :(using $mod.$sym))
259+
end
248260
end
249-
250-
function _make_list(cmd, mod, lst)
251-
isempty(lst) && return nothing
252-
length(lst) > 1 ?
253-
Expr(:toplevel, [Expr(cmd, mod, nam) for nam in lst]...) : Expr(cmd, mod, lst[1])
261+
function _import_list(curmod, api, mod, grp)
262+
lst = getfield(api, grp)
263+
for sym in lst
264+
eval(curmod, :(import $mod.$sym))
265+
end
254266
end
255267

256-
function _make_exprs(cmd, mod, grp)
257-
from = QuoteNode(grp == :base ? :Base : mod)
258-
:(eval($(Meta.parse("APITools._make_list($(QuoteNode(cmd)), $from, $mod.__api__.$grp)"))))
268+
macro api(cmd::Symbol, exprs...)
269+
@static V6_COMPAT ? _api(current_module(), cmd, exprs) : _api(__module__, cmd, exprs)
259270
end
260271

261272
end # module APITools

0 commit comments

Comments
 (0)