@@ -296,8 +296,49 @@ function component_args!(a, b, dict, expr, varexpr, kwargs)
296
296
end
297
297
end
298
298
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
+
299
338
function parse_extend! (exprs, ext, dict, body, kwargs)
300
339
expr = Expr (:block )
340
+ varexpr = Expr (:block )
341
+ push! (exprs, varexpr)
301
342
push! (exprs, expr)
302
343
body = deepcopy (body)
303
344
MLStyle. @match body begin
@@ -309,13 +350,15 @@ function parse_extend!(exprs, ext, dict, body, kwargs)
309
350
error (" `@extend` destructuring only takes an tuple as LHS. Got $body " )
310
351
end
311
352
a, b = b. args
312
- component_args ! (a, b, expr, kwargs)
353
+ extend_args ! (a, b, dict, expr, kwargs, varexpr )
313
354
vars, a, b
314
355
end
315
356
ext[] = a
316
357
push! (b. args, Expr (:kw , :name , Meta. quot (a)))
317
- dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
318
358
push! (expr. args, :($ a = $ b))
359
+
360
+ dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
361
+
319
362
if vars != = nothing
320
363
push! (expr. args, :(@unpack $ vars = $ a))
321
364
end
0 commit comments