Skip to content

Commit 97e330d

Browse files
committed
feat: parse the components to appropriately add its args to model arglist
1 parent b11a497 commit 97e330d

File tree

1 file changed

+51
-47
lines changed

1 file changed

+51
-47
lines changed

src/systems/model_parsing.jl

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,13 @@ function model_macro(mod, name, expr)
178178
ps, pss = [], []
179179
for arg in expr.args
180180
arg isa LineNumberNode && continue
181-
arg.head == :macrocall || error("$arg is not valid syntax. Expected a macro call.")
182-
parse_model!(exprs.args, comps, ext, eqs, icon, dict, mod, arg, kwargs)
181+
if arg.head == :macrocall
182+
parse_model!(exprs.args, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict, mod, arg, kwargs)
183+
elseif arg.head == :block
184+
push!(exprs.args, arg)
185+
else
186+
error("$arg is not valid syntax. Expected a macro call.")
187+
end
183188
end
184189
iv = get(dict, :independent_variable, nothing)
185190
if iv === nothing
@@ -194,11 +199,10 @@ function model_macro(mod, name, expr)
194199
else
195200
push!(exprs.args, :($extend($sys, $(ext[]))))
196201
end
197-
@info "\nexprs $exprs final kwargs: $kwargs"
198202
:($name = $Model((; name, $(kwargs...)) -> $exprs, $dict))
199203
end
200204

201-
function parse_model!(exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
205+
function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict, mod, arg, kwargs)
202206
mname = arg.args[1]
203207
body = arg.args[end]
204208
if mname == Symbol("@components")
@@ -218,47 +222,7 @@ function parse_model!(exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
218222
end
219223
end
220224

221-
function var_rename(compname, varname::Expr, arglist)
222-
@info typeof(varname)
223-
compname = Symbol(compname, :__, varname.args[1])
224-
push!(arglist, Expr(:(=), compname, varname.args[2]))
225-
@info "$(typeof(varname)) | the arglist @220 is $arglist"
226-
return Expr(:kw, varname, compname)
227-
end
228-
229-
function var_rename(compname, varname, arglist)
230-
compname = Symbol(compname, :__, varname)
231-
push!(arglist, :($compname))
232-
@info "$(typeof(varname)) | the arglist @229 is $arglist"
233-
return Expr(:kw, varname, compname)
234-
end
235-
236-
function component_args!(compname, comparg, arglist, varnamed)
237-
for arg in comparg.args
238-
arg isa LineNumberNode && continue
239-
MLStyle.@match arg begin
240-
Expr(:parameters, a, b) => begin
241-
component_args!(compname, arg, arglist, varnamed)
242-
end
243-
Expr(:parameters, Expr) => begin
244-
# push!(varnamed , var_rename(compname, a, arglist))
245-
push!(varnamed , var_rename.(Ref(compname), arg.args, Ref(arglist)))
246-
end
247-
Expr(:parameters, a) => begin
248-
# push!(varnamed , var_rename(compname, a, arglist))
249-
for a_arg in a.args
250-
push!(varnamed , var_rename(compname, a_arg, arglist))
251-
end
252-
end
253-
Expr(:kw, a, b) => begin
254-
push!(varnamed , var_rename(compname, a, arglist))
255-
end
256-
::Symbol => continue
257-
_ => @info "got $arg"
258-
end
259-
end
260-
end
261-
225+
# components
262226
function parse_components!(exprs, cs, dict, body, kwargs)
263227
expr = Expr(:block)
264228
push!(exprs, expr)
@@ -269,23 +233,63 @@ function parse_components!(exprs, cs, dict, body, kwargs)
269233
MLStyle.@match arg begin
270234
Expr(:(=), a, b) => begin
271235
push!(cs, a)
272-
component_args!(a, b, kwargs, varnamed)
273236
push!(comps, [String(a), String(b.args[1])])
274237
arg = deepcopy(arg)
275238
b = deepcopy(arg.args[2])
276239

277-
b.args[2] = varnamed[1][1]
240+
component_args!(a, b, expr, kwargs)
278241

279242
push!(b.args, Expr(:kw, :name, Meta.quot(a)))
280243
arg.args[2] = b
281244
push!(expr.args, arg)
245+
@info "\n\nExpr $expr, b: $b\n\n"
282246
end
283247
_ => error("`@components` only takes assignment expressions. Got $arg")
284248
end
285249
end
286250
dict[:components] = comps
287251
end
288252

253+
function var_rename(compname, varname)
254+
compname = Symbol(compname, :__, varname)
255+
end
256+
257+
function component_args!(a, b, expr, kwargs)
258+
for i in 1:lastindex(b.args)
259+
arg = b.args[i]
260+
MLStyle.@match arg begin
261+
::Symbol => begin
262+
if b.head == :parameters
263+
_v = varname2(a, arg)
264+
push!(kwargs, _v)
265+
b.args[i] = Expr(:kw, arg, _v)
266+
end
267+
continue
268+
end
269+
Expr(:parameters, x...) => begin
270+
component_args!(a, arg, expr, kwargs)
271+
end
272+
Expr(:kw, x) => begin
273+
_v = varname2(a, x)
274+
b.args[i] = Expr(:kw, x, _v)
275+
push!(kwargs, _v)
276+
end
277+
Expr(:kw, x, y::Number) => begin
278+
_v = varname2(a, x)
279+
b.args[i] = Expr(:kw, x, _v)
280+
push!(kwargs, Expr(:kw, _v, y))
281+
end
282+
Expr(:kw, x, y) => begin
283+
_v = varname2(a, x)
284+
push!(expr.args, :($y = $_v))
285+
push!(kwargs, Expr(:kw, _v, y))
286+
end
287+
_ => "Got this: $arg"
288+
end
289+
end
290+
end
291+
292+
#
289293
function parse_extend!(exprs, ext, dict, body)
290294
expr = Expr(:block)
291295
push!(exprs, expr)

0 commit comments

Comments
 (0)