Skip to content

Commit 2b0c920

Browse files
committed
Update to conditionally define symbols
1 parent 761b103 commit 2b0c920

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

src/APITools.jl

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,38 @@ macro api(cmd::Symbol)
9090
end
9191
end
9292

93-
const _cmdadd = (:define_public, :define_develop, :public, :develop, :base)
93+
const _cmdadd = (:define_public, :define_develop, :public, :develop, :base, :maybe_public)
9494
const _cmduse = (:use, :test, :extend, :export)
9595

9696
@static V6_COMPAT && (const _ff = findfirst)
9797
@static V6_COMPAT || (_ff(lst, val) = coalesce(findfirst(isequal(val), lst), 0))
9898

99+
_add_def!(deflst, explst, sym) = (push!(deflst, sym); push!(explst, esc(:(function $sym end))))
100+
101+
"""Conditionally define functions, or import from Base"""
102+
function _maybe_public(exprs)
103+
implst = Symbol[]
104+
deflst = Symbol[]
105+
explst = Expr[]
106+
for ex in exprs
107+
if isa(ex, Expr) && ex.head == :tuple
108+
for sym in ex.args
109+
isa(sym, Symbol) || error("@api $grp: $sym not a Symbol")
110+
isdefined(Base, sym) ? push!(implst, sym) : _add_def!(deflst, explst, sym)
111+
end
112+
elseif isa(ex, Symbol)
113+
isdefined(Base, ex) ? push!(implst, ex) : _add_def!(deflst, explst, ex)
114+
else
115+
error("@api $grp: syntax error $ex")
116+
end
117+
end
118+
lst = _add_symbols(:base, implst)
119+
isempty(deflst) && return lst
120+
Expr(:toplevel, lst, explst..., esc(:( append!(__tmp_api__.public, $deflst))))
121+
end
122+
99123
function _add_symbols(grp, exprs)
124+
grp == :maybe_public && return _maybe_public(exprs)
100125
symbols = Symbol[]
101126
for ex in exprs
102127
if isa(ex, Expr) && ex.head == :tuple
@@ -111,10 +136,9 @@ function _add_symbols(grp, exprs)
111136
syms = SymList(symbols)
112137
expr = "APITools._make_list($(QuoteNode(:import)), $(QuoteNode(:Base)), $syms)"
113138
parsed = Meta.parse(expr)
114-
dump(parsed)
115139
Expr(:toplevel,
116140
V6_COMPAT ? :(eval(current_module(), $parsed)) : :(eval(@__MODULE__, $parsed)),
117-
esc(:( append!(__tmp_api__.$grp, $symbols))))
141+
esc(:( append!(__tmp_api__.base, $symbols))))
118142
else
119143
esc(:( append!(__tmp_api__.$grp, $symbols) ))
120144
end
@@ -126,7 +150,7 @@ function _make_modules(exprs)
126150
for ex in exprs
127151
if isa(ex, Expr) && ex.head == :tuple
128152
append!(modlst, ex.args)
129-
for e in ex.args ; push!(uselst, :(using $sym)) ; end
153+
for sym in ex.args ; push!(uselst, :(using $sym)) ; end
130154
elseif isa(ex, Symbol)
131155
push!(modlst, ex)
132156
push!(uselst, :(using $ex))
@@ -181,9 +205,7 @@ end
181205

182206
function _make_exprs(cmd, mod, grp)
183207
from = QuoteNode(grp == :base ? :Base : mod)
184-
x = :(eval($(Meta.parse("APITools._make_list($(QuoteNode(cmd)), $from, $mod.__api__.$grp)"))))
185-
println("_make_exprs($cmd, $mod, $grp) => $x")
186-
x
208+
:(eval($(Meta.parse("APITools._make_list($(QuoteNode(cmd)), $from, $mod.__api__.$grp)"))))
187209
end
188210

189211
end # module APITools

0 commit comments

Comments
 (0)