236236
237237function parse_components! (exprs, cs, dict, body, kwargs)
238238 expr = Expr (:block )
239- push! (exprs, expr)
239+ varexpr = Expr (:block )
240+ push! (exprs, varexpr)
240241 comps = Vector{Symbol}[]
241242 for arg in body. args
242243 arg isa LineNumberNode && continue
@@ -247,23 +248,25 @@ function parse_components!(exprs, cs, dict, body, kwargs)
247248 arg = deepcopy (arg)
248249 b = deepcopy (arg. args[2 ])
249250
250- component_args! (a, b, expr, kwargs)
251+ component_args! (a, b, dict, expr, varexpr , kwargs)
251252
252- push! (b. args, Expr (:kw , :name , Meta. quot (a)))
253253 arg. args[2 ] = b
254254 push! (expr. args, arg)
255255 end
256256 _ => error (" `@components` only takes assignment expressions. Got $arg " )
257257 end
258258 end
259+
260+ push! (exprs, :(@named $ expr))
261+
259262 dict[:components ] = comps
260263end
261264
262265function _rename (compname, varname)
263266 compname = Symbol (compname, :__ , varname)
264267end
265268
266- function component_args! (a, b, expr, kwargs)
269+ function component_args! (a, b, dict, expr, varexpr , kwargs)
267270 # Whenever `b` is a function call, skip the first arg aka the function name.
268271 # Whenever it is a kwargs list, include it.
269272 start = b. head == :call ? 2 : 1
@@ -274,15 +277,19 @@ function component_args!(a, b, expr, kwargs)
274277 x:: Symbol || Expr (:kw , x) => begin
275278 _v = _rename (a, x)
276279 b. args[i] = Expr (:kw , x, _v)
280+ push! (varexpr. args, :((@isdefined $ x) && ($ _v = $ x)))
277281 push! (kwargs, Expr (:kw , _v, nothing ))
282+ dict[:kwargs ][_v] = nothing
278283 end
279284 Expr (:parameters , x... ) => begin
280- component_args! (a, arg, expr, kwargs)
285+ component_args! (a, arg, dict, expr, varexpr , kwargs)
281286 end
282287 Expr (:kw , x, y) => begin
283288 _v = _rename (a, x)
284289 b. args[i] = Expr (:kw , x, _v)
285- push! (kwargs, Expr (:kw , _v, y))
290+ push! (varexpr. args, :($ _v = $ _v === nothing ? $ y : $ _v))
291+ push! (kwargs, Expr (:kw , _v, nothing ))
292+ dict[:kwargs ][_v] = nothing
286293 end
287294 _ => error (" Could not parse $arg of component $a " )
288295 end
0 commit comments