Skip to content

Commit fb7d334

Browse files
committed
Evaluate default at runtime to handle parametric defaults
1 parent 5f56f04 commit fb7d334

File tree

2 files changed

+12
-18
lines changed

2 files changed

+12
-18
lines changed

src/systems/model_parsing.jl

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, def = nothing)
6161
arg isa LineNumberNode && return
6262
MLStyle.@match arg begin
6363
a::Symbol => begin
64-
push!(kwargs, Expr(:kw, a, def))
64+
push!(kwargs, Expr(:kw, a, nothing))
6565
var = generate_var!(dict, a, varclass)
6666
dict[:kwargs][getname(var)] = def
6767
(var, nothing)
6868
end
6969
Expr(:call, a, b) => begin
70-
push!(kwargs, Expr(:kw, a, def))
70+
push!(kwargs, Expr(:kw, a, nothing))
7171
var = generate_var!(dict, a, b, varclass)
7272
dict[:kwargs][getname(var)] = def
7373
(var, nothing)
@@ -77,14 +77,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, def = nothing)
7777
def, meta = parse_default(mod, b)
7878
var, _ = parse_variable_def!(dict, mod, a, varclass, kwargs, def)
7979
dict[varclass][getname(var)][:default] = def
80-
if typeof(def) != Symbol
81-
var = setdefault(var, def)
82-
def = nothing
83-
else
84-
def in [keys(dict[:kwargs])...;] ||
85-
error("$def is not a known parameter or variable")
86-
var = setdefault(var, def)
87-
end
8880
if !isnothing(meta)
8981
if (ct = get(meta, VariableConnectType, nothing)) !== nothing
9082
dict[varclass][getname(var)][:connection_type] = nameof(ct)
@@ -94,12 +86,12 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, def = nothing)
9486
(var, def)
9587
end
9688
Expr(:tuple, a, b) => begin
97-
var, _ = parse_variable_def!(dict, mod, a, varclass, kwargs)
89+
var, def = parse_variable_def!(dict, mod, a, varclass, kwargs)
9890
meta = parse_metadata(mod, b)
9991
if (ct = get(meta, VariableConnectType, nothing)) !== nothing
10092
dict[varclass][getname(var)][:connection_type] = nameof(ct)
10193
end
102-
(set_var_metadata(var, meta), nothing)
94+
(set_var_metadata(var, meta), def)
10395
end
10496
_ => error("$arg cannot be parsed")
10597
end
@@ -336,11 +328,12 @@ function parse_extend!(exprs, ext, dict, body)
336328
end
337329

338330
function parse_variable_arg!(expr, vs, dict, mod, arg, varclass, kwargs)
339-
vv, _ = parse_variable_def!(dict, mod, arg, varclass, kwargs)
331+
vv, def = parse_variable_def!(dict, mod, arg, varclass, kwargs)
340332
v = Num(vv)
341333
name = getname(v)
342334
push!(vs, name)
343-
push!(expr.args, :($name = $name === nothing ? $vv : $setdefault($vv, $name)))
335+
push!(expr.args,
336+
:($name = $name === nothing ? $setdefault($vv, $def) : $setdefault($vv, $name)))
344337
end
345338

346339
function parse_variables!(exprs, vs, dict, mod, body, varclass, kwargs)

test/model_parsing.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ end
152152
cval
153153
jval
154154
kval
155-
c(t) = cval + cval
155+
c(t) = cval + jval
156156
d = 2
157157
e, [description = "e"]
158158
f = 3, [description = "f"]
@@ -173,11 +173,12 @@ kval = 5
173173
@test hasmetadata(model.j, VariableDescription)
174174
@test hasmetadata(model.k, VariableDescription)
175175

176+
model = complete(model)
176177
@test getdefault(model.cval) == 1
177-
@test getdefault(model.c) == 2
178+
@test isequal(getdefault(model.c), model.cval + model.jval)
178179
@test getdefault(model.d) == 2
179180
@test_throws KeyError getdefault(model.e)
180181
@test getdefault(model.f) == 3
181182
@test getdefault(model.i) == 4
182-
@test getdefault(model.j) == :jval
183-
@test getdefault(model.k) == kval
183+
@test isequal(getdefault(model.j), model.jval)
184+
@test isequal(getdefault(model.k), model.kval)

0 commit comments

Comments
 (0)