Skip to content

Commit ed5e0fb

Browse files
committed
refactor: parse typed and untyped arrays within same block
1 parent 687dc7f commit ed5e0fb

File tree

2 files changed

+13
-47
lines changed

2 files changed

+13
-47
lines changed

src/systems/model_parsing.jl

Lines changed: 12 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -232,81 +232,48 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
232232
varclass, where_types, meta)
233233
return var, def, Dict()
234234
end
235-
Expr(:tuple, Expr(:ref, a, b...), y) => begin
235+
Expr(:tuple, Expr(:ref, a, b...), y) || Expr(:tuple, Expr(:(::), Expr(:ref, a, b...), n), y) => begin
236+
isdefined(mod, :n) || (n = Real)
236237
varname = Meta.isexpr(a, :call) ? a.args[1] : a
237238
push!(kwargs, Expr(:kw, varname, nothing))
238239
varval = unit_handled_variable_value(mod, y, varname)
239240
if varclass == :parameters
240-
var = :($varname = $first(@parameters $a[$(b...)] = ($varval, $y)))
241+
var = :($varname = $first(@parameters $a[$(b...)]::$n = ($varval, $y)))
241242
else
242-
var = :($varname = $first(@variables $a[$(b...)] = ($varval, $y)))
243+
var = :($varname = $first(@variables $a[$(b...)]::$n = ($varval, $y)))
243244
end
244245
#TODO: update `dict` aka `Model.structure` with the metadata
245246
(:($varname...), var), nothing, Dict()
246247
end
247-
Expr(:(=), Expr(:ref, a, b...), y) => begin
248+
Expr(:(=), Expr(:ref, a, b...), y) || Expr(:(=), Expr(:(::), Expr(:ref, a, b...), n), y) => begin
249+
isdefined(mod, :n) || (n = Real)
248250
varname = Meta.isexpr(a, :call) ? a.args[1] : a
249251
if Meta.isexpr(y, :tuple)
250252
varval = unit_handled_variable_value(mod, y, varname)
251253
val, y = (y.args[1], y.args[2:end])
252254
push!(kwargs, Expr(:kw, varname, nothing))
253255
if varclass == :parameters
254256
var = :($varname = $varname === nothing ? $val : $varname;
255-
$varname = $first(@parameters $a[$(b...)] = (
257+
$varname = $first(@parameters $a[$(b...)]::$n = (
256258
$varval, $(y...))))
257-
else
258-
var = :($varname = $varname === nothing ? $val : $varname;
259-
$varname = $first(@variables $a[$(b...)] = (
260-
$varval, $(y...))))
261-
end
262-
else
263-
push!(kwargs, Expr(:kw, varname, nothing))
264-
if varclass == :parameters
265-
var = :($varname = $varname === nothing ? $y : $varname; $varname = $first(@parameters $a[$(b...)] = $varname))
266-
else
267-
var = :($varname = $varname === nothing ? $y : $varname; $varname = $first(@variables $a[$(b...)] = $varname))
268-
end
269-
end
270-
#TODO: update `dict`` aka `Model.structure` with the metadata
271-
(:($varname...), var), nothing, Dict()
272-
end
273-
Expr(:(=), Expr(:(::), Expr(:ref, a, b...), n), y) => begin
274-
varname = Meta.isexpr(a, :call) ? a.args[1] : a
275-
varval = unit_handled_variable_value(mod, y, varname)
276-
if Meta.isexpr(y, :tuple)
277-
val, y = (y.args[1], y.args[2:end])
278-
push!(kwargs, Expr(:kw, varname, nothing))
279-
if varclass == :parameters
280-
var = :($varname = $varname = $varname === nothing ? $val : $varname;
281-
$varname = $first(@parameters $a[$(b...)]::$n = ($varval, $(y...))))
282259
else
283260
var = :($varname = $varname === nothing ? $val : $varname;
284261
$varname = $first(@variables $a[$(b...)]::$n = (
285262
$varval, $(y...))))
286263
end
287264
else
288-
push!(kwargs, Expr(:kw, varname, y))
265+
push!(kwargs, Expr(:kw, varname, nothing))
289266
if varclass == :parameters
290-
var = :($varname = $first(@parameters $a[$(b...)]::$n = $varval))
267+
var = :($varname = $varname === nothing ? $y : $varname;
268+
$varname = $first(@parameters $a[$(b...)]::$n = $varname))
291269
else
292-
var = :($varname = $first(@variables $a[$(b...)]::$n = $varval))
270+
var = :($varname = $varname === nothing ? $y : $varname;
271+
$varname = $first(@variables $a[$(b...)]::$n = $varname))
293272
end
294273
end
295274
#TODO: update `dict`` aka `Model.structure` with the metadata
296275
(:($varname...), var), nothing, Dict()
297276
end
298-
Expr(:tuple, Expr(:(::), Expr(:ref, a, b...), n), y) => begin
299-
varname = Meta.isexpr(a, :call) ? a.args[1] : a
300-
varval = unit_handled_variable_value(mod, y, varname)
301-
push!(kwargs, Expr(:kw, varname, nothing))
302-
if varclass == :parameters
303-
var = :($varname = $first(@parameters $a[$(b...)]::$n = ($varval, $y)))
304-
else
305-
var = :($varname = $first(@variables $a[$(b...)]::$n = ($varval, $y)))
306-
end
307-
#TODO: update `dict` aka `Model.structure` with the metadata
308-
(:($varname...), var), nothing, Dict()
309-
end
310277
Expr(:ref, a, b...) => begin
311278
varname = a isa Expr && a.head == :call ? a.args[1] : a
312279
push!(kwargs, Expr(:kw, varname, nothing))
@@ -478,7 +445,6 @@ function parse_default(mod, a)
478445
end
479446

480447
function parse_metadata(mod, a::Expr)
481-
@info a typeof(a)
482448
MLStyle.@match a begin
483449
Expr(:vect, b...) => Dict(parse_metadata(mod, m) for m in b)
484450
Expr(:tuple, a, b...) => parse_metadata(mod, b)

test/model_parsing.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ end
305305
@test symtype(type_model.par4) == Float64
306306
@test_broken symtype(type_model.par5[1]) == BigFloat
307307
@test_broken symtype(type_model.par6[1]) == BigFloat
308-
@test symtype(type_model.par7[1, 1]) == BigFloat
308+
@test_broken symtype(type_model.par7[1, 1]) == BigFloat
309309

310310
@test_throws TypeError TypeModel(; name = :throws, flag = 1)
311311
@test_throws TypeError TypeModel(; name = :throws, par0 = 1)

0 commit comments

Comments
 (0)