Skip to content

Commit 21f49ec

Browse files
committed
init: whenever there is an undef var assigned to @variables or @parameters, a kwargs list is created with those
With this, we can pass the them as kwargs while calling the Model
1 parent 50cf8f9 commit 21f49ec

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

src/systems/model_parsing.jl

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ function connector_macro(mod, name, body)
3232
parse_icon!(icon, dict, dict, arg.args[end])
3333
continue
3434
end
35-
push!(vs, Num(parse_variable_def!(dict, mod, arg, :variables)))
35+
push!(vs, Num(parse_variable_def!(dict, mod, arg, :variables, kwargs)))
3636
end
3737
iv = get(dict, :independent_variable, nothing)
3838
if iv === nothing
@@ -49,18 +49,19 @@ function connector_macro(mod, name, body)
4949
end
5050
end
5151

52-
function parse_variable_def!(dict, mod, arg, varclass)
52+
function parse_variable_def!(dict, mod, arg, varclass, kwargs)
5353
MLStyle.@match arg begin
5454
::Symbol => generate_var!(dict, arg, varclass)
5555
Expr(:call, a, b) => generate_var!(dict, a, b, varclass)
5656
Expr(:(=), a, b) => begin
57-
var = parse_variable_def!(dict, mod, a, varclass)
58-
def = parse_default(mod, b)
57+
var = parse_variable_def!(dict, mod, a, varclass, kwargs)
58+
def = parse_default(mod, b, kwargs)
5959
dict[varclass][getname(var)][:default] = def
60-
setdefault(var, def)
60+
var = setdefault(var, def)
61+
var
6162
end
6263
Expr(:tuple, a, b) => begin
63-
var = parse_variable_def!(dict, mod, a, varclass)
64+
var = parse_variable_def!(dict, mod, a, varclass, kwargs)
6465
meta = parse_metadata(mod, b)
6566
if (ct = get(meta, VariableConnectType, nothing)) !== nothing
6667
dict[varclass][getname(var)][:connection_type] = nameof(ct)
@@ -102,10 +103,16 @@ function generate_var!(dict, a, b, varclass)
102103
end
103104
var
104105
end
105-
function parse_default(mod, a)
106+
107+
function set_kwargs!(kwargs, a)
108+
push!(kwargs, a)
109+
return a
110+
end
111+
112+
function parse_default(mod, a, kwargs)
106113
a = Base.remove_linenums!(deepcopy(a))
107114
MLStyle.@match a begin
108-
Expr(:block, a) => get_var(mod, a)
115+
Expr(:block, a) => set_kwargs!(kwargs, a)
109116
::Symbol => get_var(mod, a)
110117
::Number => a
111118
_ => error("Cannot parse default $a")
@@ -141,10 +148,11 @@ function model_macro(mod, name, expr)
141148
ps = Symbol[]
142149
eqs = Expr[]
143150
icon = Ref{Union{String, URI}}()
151+
kwargs = []
144152
for arg in expr.args
145153
arg isa LineNumberNode && continue
146154
arg.head == :macrocall || error("$arg is not valid syntax. Expected a macro call.")
147-
parse_model!(exprs.args, comps, ext, eqs, vs, ps, icon, dict, mod, arg)
155+
parse_model!(exprs.args, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs)
148156
end
149157
iv = get(dict, :independent_variable, nothing)
150158
if iv === nothing
@@ -159,20 +167,21 @@ function model_macro(mod, name, expr)
159167
else
160168
push!(exprs.args, :($extend($sys, $(ext[]))))
161169
end
162-
:($name = $Model((; name) -> $exprs, $dict))
170+
@info "Exprs: $exprs"
171+
:($name = $Model((; name, kwargs...) -> $exprs, $dict))
163172
end
164173

165-
function parse_model!(exprs, comps, ext, eqs, vs, ps, icon, dict, mod, arg)
174+
function parse_model!(exprs, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs)
166175
mname = arg.args[1]
167176
body = arg.args[end]
168177
if mname == Symbol("@components")
169178
parse_components!(exprs, comps, dict, body)
170179
elseif mname == Symbol("@extend")
171180
parse_extend!(exprs, ext, dict, body)
172181
elseif mname == Symbol("@variables")
173-
parse_variables!(exprs, vs, dict, mod, body, :variables)
182+
parse_variables!(exprs, vs, dict, mod, body, :variables, kwargs)
174183
elseif mname == Symbol("@parameters")
175-
parse_variables!(exprs, ps, dict, mod, body, :parameters)
184+
parse_variables!(exprs, ps, dict, mod, body, :parameters, kwargs)
176185
elseif mname == Symbol("@equations")
177186
parse_equations!(exprs, eqs, dict, body)
178187
elseif mname == Symbol("@icon")
@@ -231,12 +240,12 @@ function parse_extend!(exprs, ext, dict, body)
231240
end
232241
end
233242

234-
function parse_variables!(exprs, vs, dict, mod, body, varclass)
243+
function parse_variables!(exprs, vs, dict, mod, body, varclass, kwargs)
235244
expr = Expr(:block)
236245
push!(exprs, expr)
237246
for arg in body.args
238247
arg isa LineNumberNode && continue
239-
vv = parse_variable_def!(dict, mod, arg, varclass)
248+
vv = parse_variable_def!(dict, mod, arg, varclass, kwargs)
240249
v = Num(vv)
241250
name = getname(v)
242251
push!(vs, name)

0 commit comments

Comments
 (0)