@@ -372,6 +372,28 @@ function extend_args!(a, b, dict, expr, kwargs, varexpr, has_param = false)
372
372
end
373
373
end
374
374
375
+ const EMPTY_DICT = Dict ()
376
+ const EMPTY_VoVoSYMBOL = Vector{Symbol}[]
377
+
378
+ function Base. names (model:: Model )
379
+ vars = keys (get (model. structure, :variables , EMPTY_DICT))
380
+ vars = union (vars, keys (get (model. structure, :parameters , EMPTY_DICT)))
381
+ vars = union (vars,
382
+ map (first, get (model. structure, :components , EMPTY_VoVoSYMBOL)))
383
+ collect (vars)
384
+ end
385
+
386
+ function _parse_extend! (ext, a, b, dict, expr, kwargs, varexpr, vars)
387
+ extend_args! (a, b, dict, expr, kwargs, varexpr)
388
+ ext[] = a
389
+ push! (b. args, Expr (:kw , :name , Meta. quot (a)))
390
+ push! (expr. args, :($ a = $ b))
391
+
392
+ dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
393
+
394
+ push! (expr. args, :(@unpack $ vars = $ a))
395
+ end
396
+
375
397
function parse_extend! (exprs, ext, dict, mod, body, kwargs)
376
398
expr = Expr (:block )
377
399
varexpr = Expr (:block )
@@ -386,33 +408,27 @@ function parse_extend!(exprs, ext, dict, mod, body, kwargs)
386
408
error (" `@extend` destructuring only takes an tuple as LHS. Got $body " )
387
409
end
388
410
a, b = b. args
389
- elseif Meta. isexpr (b, :call )
390
- if (model = getproperty (mod, b. args[1 ])) isa Model
391
- _vars = keys (get (model. structure, :variables , Dict ()))
392
- _vars = union (_vars, keys (get (model. structure, :parameters , Dict ())))
393
- _vars = union (_vars,
394
- map (first, get (model. structure, :components , Vector{Symbol}[])))
395
- vars = Expr (:tuple )
396
- append! (vars. args, collect (_vars))
397
- else
398
- error (" Cannot infer the exact `Model` that `@extend $(body) ` refers." *
399
- " Please specify the names that it brings into scope by:" *
400
- " `@extend a, b = oneport = OnePort()`." )
401
- end
411
+ _parse_extend! (ext, a, b, dict, expr, kwargs, varexpr, vars)
412
+ else
413
+ error (" When explicitly destructing in `@extend` please use the syntax: `@extend a, b = oneport = OnePort()`." )
402
414
end
403
- extend_args! (a, b, dict, expr, kwargs, varexpr)
404
- ext[] = a
405
- push! (b. args, Expr (:kw , :name , Meta. quot (a)))
406
- push! (expr. args, :($ a = $ b))
407
-
408
- dict[:extend ] = [Symbol .(vars. args), a, b. args[1 ]]
409
-
410
- if vars != = nothing
411
- push! (expr. args, :(@unpack $ vars = $ a))
415
+ end
416
+ Expr (:call , a′, _... ) => begin
417
+ a = Symbol (Symbol (" #mtkmodel" ), :__anonymous__ , a′)
418
+ b = body
419
+ if (model = getproperty (mod, b. args[1 ])) isa Model
420
+ vars = Expr (:tuple )
421
+ append! (vars. args, names (model))
422
+ _parse_extend! (ext, a, b, dict, expr, kwargs, varexpr, vars)
423
+ else
424
+ error (" Cannot infer the exact `Model` that `@extend $(body) ` refers." *
425
+ " Please specify the names that it brings into scope by:" *
426
+ " `@extend a, b = oneport = OnePort()`." )
412
427
end
413
428
end
414
429
_ => error (" `@extend` only takes an assignment expression. Got $body " )
415
430
end
431
+ return nothing
416
432
end
417
433
418
434
function parse_variable_arg! (expr, vs, dict, mod, arg, varclass, kwargs)
0 commit comments