Skip to content

Commit 563f04f

Browse files
Merge pull request #2310 from SciML/myb/extend
Simplify `at extend`
2 parents 298a9a5 + bdc45d1 commit 563f04f

File tree

2 files changed

+39
-23
lines changed

2 files changed

+39
-23
lines changed

src/systems/model_parsing.jl

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,28 @@ function extend_args!(a, b, dict, expr, kwargs, varexpr, has_param = false)
372372
end
373373
end
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+
375397
function 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
416432
end
417433

418434
function parse_variable_arg!(expr, vs, dict, mod, arg, varclass, kwargs)

test/model_parsing.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ end
100100
@parameters begin
101101
C, [unit = u"F"]
102102
end
103-
@extend oneport = OnePort(; v = 0.0)
103+
@extend OnePort(; v = 0.0)
104104
@icon "https://upload.wikimedia.org/wikipedia/commons/7/78/Capacitor_symbol.svg"
105105
@equations begin
106106
D(v) ~ i / C

0 commit comments

Comments
 (0)