@@ -148,31 +148,17 @@ end
148148
149149pop_structure_dict! (dict, key) = length (dict[key]) == 0 && pop! (dict, key)
150150
151- function update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
151+ function update_kwargs_and_metadata! (dict, kwargs, a, def, type,
152152 varclass, where_types, meta)
153- if indices isa Nothing
154- if ! isnothing (meta) && haskey (meta, VariableUnit)
155- uvar = gensym ()
156- push! (where_types, uvar)
157- push! (kwargs, Expr (:kw , :($ a:: Union{Nothing, $uvar} ), nothing ))
158- else
159- push! (kwargs, Expr (:kw , :($ a:: Union{Nothing, $type} ), nothing ))
160- end
161- dict[:kwargs ][a] = Dict (:value => def, :type => type)
153+ if ! isnothing (meta) && haskey (meta, VariableUnit)
154+ uvar = gensym ()
155+ push! (where_types, uvar)
156+ push! (kwargs, Expr (:kw , :($ a:: Union{Nothing, $uvar} ), nothing ))
162157 else
163- vartype = gensym (:T )
164- push! (kwargs,
165- Expr (:kw ,
166- Expr (:(:: ), a,
167- Expr (:curly , :Union , :Nothing , Expr (:curly , :AbstractArray , vartype))),
168- nothing ))
169- if ! isnothing (meta) && haskey (meta, VariableUnit)
170- push! (where_types, vartype)
171- else
172- push! (where_types, :($ vartype <: $type ))
173- end
174- dict[:kwargs ][a] = Dict (:value => def, :type => AbstractArray{type})
158+ push! (kwargs, Expr (:kw , :($ a:: Union{Nothing, $type} ), nothing ))
175159 end
160+ dict[:kwargs ][a] = Dict (:value => def, :type => type)
161+
176162 if dict[varclass] isa Vector
177163 dict[varclass][1 ][a][:type ] = AbstractArray{type}
178164 else
@@ -207,8 +193,8 @@ function update_readable_metadata!(varclass_dict, meta::Dict, varname)
207193 end
208194end
209195
210- function push_array_kwargs_and_metadata ! (
211- dict, indices, meta, type, varclass, varname, varval)
196+ function update_array_kwargs_and_metadata ! (
197+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
212198 dict[varclass] = get! (dict, varclass) do
213199 Dict {Symbol, Dict{Symbol, Any}} ()
214200 end
@@ -221,6 +207,18 @@ function push_array_kwargs_and_metadata!(
221207 :type => type
222208 )))
223209
210+ vartype = gensym (:T )
211+ push! (kwargs,
212+ Expr (:kw ,
213+ Expr (:(:: ), varname,
214+ Expr (:curly , :Union , :Nothing , Expr (:curly , :AbstractArray , vartype))),
215+ nothing ))
216+ if ! isnothing (meta) && haskey (meta, VariableUnit)
217+ push! (where_types, vartype)
218+ else
219+ push! (where_types, :($ vartype <: $type ))
220+ end
221+
224222 # Useful keys for kwargs entry are: value, type and size.
225223 dict[:kwargs ][varname] = varclass_dict[][varname]
226224
@@ -237,13 +235,12 @@ function unit_handled_variable_value(meta, varname)
237235end
238236
239237function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
240- def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
241- type:: Type = Real, meta = Dict {DataType, Expr} ())
238+ def = nothing , type:: Type = Real, meta = Dict {DataType, Expr} ())
242239 arg isa LineNumberNode && return
243240 MLStyle. @match arg begin
244241 a:: Symbol => begin
245- var = generate_var! (dict, a, varclass; indices, type)
246- update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
242+ var = generate_var! (dict, a, varclass; type)
243+ update_kwargs_and_metadata! (dict, kwargs, a, def, type,
247244 varclass, where_types, meta)
248245 return var, def, Dict ()
249246 end
@@ -259,8 +256,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
259256 dict, mod, a, varclass, kwargs, where_types; def, type, meta)
260257 end
261258 Expr (:call , a, b) => begin
262- var = generate_var! (dict, a, b, varclass, mod; indices, type)
263- update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var ,
259+ var = generate_var! (dict, a, b, varclass, mod; type)
260+ update_kwargs_and_metadata! (dict, kwargs, a, def, type,
264261 varclass, where_types, meta)
265262 return var, def, Dict ()
266263 end
@@ -270,7 +267,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
270267 Expr (:tuple , Expr (:ref , a, indices... ), meta_val) => begin
271268 (@isdefined type) || (type = Real)
272269 varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
273- push! (kwargs, Expr (:kw , varname, nothing ))
274270 meta = parse_metadata (mod, meta_val)
275271 varval = (@isdefined default_val) ? default_val :
276272 unit_handled_variable_value (meta, varname)
@@ -285,8 +281,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
285281 var = :($ varname = $ first (@variables ($ a[$ (indices)]:: $type = $ varval),
286282 $ meta_val))
287283 end
288- push_array_kwargs_and_metadata ! (
289- dict, indices, meta, type, varclass, varname, varval)
284+ update_array_kwargs_and_metadata ! (
285+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
290286 (:($ varname... ), var), nothing , Dict ()
291287 end
292288 Expr (:(= ), Expr (:(:: ), Expr (:ref , a, indices... ), type), def_n_meta) ||
@@ -297,7 +293,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
297293 meta = parse_metadata (mod, def_n_meta)
298294 varval = unit_handled_variable_value (meta, varname)
299295 val, def_n_meta = (def_n_meta. args[1 ], def_n_meta. args[2 : end ])
300- push! (kwargs, Expr (:kw , varname, nothing ))
301296 if varclass == :parameters
302297 Meta. isexpr (a, :call ) &&
303298 assert_unique_independent_var (dict, a. args[end ])
@@ -314,7 +309,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
314309 $ (def_n_meta... )))
315310 end
316311 else
317- push! (kwargs, Expr (:kw , varname, nothing ))
318312 if varclass == :parameters
319313 Meta. isexpr (a, :call ) &&
320314 assert_unique_independent_var (dict, a. args[end ])
@@ -329,15 +323,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
329323 end
330324 varval, meta = def_n_meta, nothing
331325 end
332- push_array_kwargs_and_metadata ! (
333- dict, indices, meta, type, varclass, varname, varval)
326+ update_array_kwargs_and_metadata ! (
327+ dict, indices, kwargs, meta, type, varclass, varname, varval, where_types )
334328 (:($ varname... ), var), nothing , Dict ()
335329 end
336330 Expr (:(:: ), Expr (:ref , a, indices... ), type) ||
337331 Expr (:ref , a, indices... ) => begin
338332 (@isdefined type) || (type = Real)
339333 varname = a isa Expr && a. head == :call ? a. args[1 ] : a
340- push! (kwargs, Expr (:kw , varname, nothing ))
341334 if varclass == :parameters
342335 Meta. isexpr (a, :call ) && assert_unique_independent_var (dict, a. args[end ])
343336 var = :($ varname = $ first (@parameters $ a[$ (indices... )]:: $type = $ varname))
@@ -350,8 +343,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
350343 throw (" Symbolic array with arbitrary length is not handled for $varclass .
351344 Please open an issue with an example." )
352345 end
353- push_array_kwargs_and_metadata ! (
354- dict, indices, nothing , type, varclass, varname, nothing )
346+ update_array_kwargs_and_metadata ! (
347+ dict, indices, kwargs, nothing , type, varclass, varname, nothing , where_types )
355348 (:($ varname... ), var), nothing , Dict ()
356349 end
357350 Expr (:(= ), a, b) => begin
@@ -386,11 +379,8 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
386379 end
387380end
388381
389- function generate_var (a, varclass;
390- indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
391- type = Real)
392- var = indices === nothing ? Symbolics. variable (a; T = type) :
393- first (@variables $ a[indices... ]:: type )
382+ function generate_var (a, varclass; type = Real)
383+ var = Symbolics. variable (a; T = type)
394384 if varclass == :parameters
395385 var = toparam (var)
396386 elseif varclass == :independent_variables
@@ -420,7 +410,7 @@ function generate_var!(dict, a, varclass;
420410 vd isa Vector && (vd = first (vd))
421411 vd[a] = Dict {Symbol, Any} ()
422412 indices != = nothing && (vd[a][:size ] = Tuple (lastindex .(indices)))
423- generate_var (a, varclass; indices, type)
413+ generate_var (a, varclass; type)
424414end
425415
426416function assert_unique_independent_var (dict, iv:: Num )
0 commit comments