@@ -372,6 +372,28 @@ function extend_args!(a, b, dict, expr, kwargs, varexpr, has_param = false)
372372 end
373373end
374374
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+
375397function parse_extend! (exprs, ext, dict, mod, body, kwargs)
376398 expr = Expr (:block )
377399 varexpr = Expr (:block )
@@ -386,33 +408,27 @@ function parse_extend!(exprs, ext, dict, mod, body, kwargs)
386408 error (" `@extend` destructuring only takes an tuple as LHS. Got $body " )
387409 end
388410 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()`." )
402414 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()`." )
412427 end
413428 end
414429 _ => error (" `@extend` only takes an assignment expression. Got $body " )
415430 end
431+ return nothing
416432end
417433
418434function parse_variable_arg! (expr, vs, dict, mod, arg, varclass, kwargs)
0 commit comments