@@ -296,8 +296,49 @@ function component_args!(a, b, dict, expr, varexpr, kwargs)
296296 end
297297end
298298
299+ function extend_args! (a, b, dict, expr, kwargs, varexpr, has_param = false )
300+ # Whenever `b` is a function call, skip the first arg aka the function name.
301+ # Whenver it is a kwargs list, include it.
302+ start = b. head == :call ? 2 : 1
303+ for i in start: lastindex (b. args)
304+ arg = b. args[i]
305+ arg isa LineNumberNode && continue
306+ MLStyle. @match arg begin
307+ x:: Symbol => begin
308+ if b. head != :parameters
309+ if has_param
310+ popat! (b. args, i)
311+ push! (b. args[2 ]. args, x)
312+ else
313+ b. args[i] = Expr (:parameters , x)
314+ end
315+ end
316+ push! (kwargs, Expr (:kw , x, nothing ))
317+ dict[:kwargs ][x] = nothing
318+ end
319+ Expr (:kw , x) => begin
320+ push! (kwargs, Expr (:kw , x, nothing ))
321+ dict[:kwargs ][x] = nothing
322+ end
323+ Expr (:kw , x, y) => begin
324+ b. args[i] = Expr (:kw , x, x)
325+ push! (varexpr. args, :($ x = $ x === nothing ? $ y : $ x))
326+ push! (kwargs, Expr (:kw , x, nothing ))
327+ dict[:kwargs ][x] = nothing
328+ end
329+ Expr (:parameters , x... ) => begin
330+ has_param = true
331+ extend_args! (a, arg, dict, expr, kwargs, varexpr, has_param)
332+ end
333+ _ => error (" Could not parse $arg of component $a " )
334+ end
335+ end
336+ end
337+
299338function parse_extend! (exprs, ext, dict, body, kwargs)
300339 expr = Expr (:block )
340+ varexpr = Expr (:block )
341+ push! (exprs, varexpr)
301342 push! (exprs, expr)
302343 body = deepcopy (body)
303344 MLStyle. @match body begin
@@ -309,13 +350,15 @@ function parse_extend!(exprs, ext, dict, body, kwargs)
309350 error (" `@extend` destructuring only takes an tuple as LHS. Got $body " )
310351 end
311352 a, b = b. args
312- component_args ! (a, b, expr, kwargs)
353+ extend_args ! (a, b, dict, expr, kwargs, varexpr )
313354 vars, a, b
314355 end
315356 ext[] = a
316357 push! (b. args, Expr (:kw , :name , Meta. quot (a)))
317- dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
318358 push! (expr. args, :($ a = $ b))
359+
360+ dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
361+
319362 if vars != = nothing
320363 push! (expr. args, :(@unpack $ vars = $ a))
321364 end
0 commit comments