239239function  parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
240240        def =  nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing}  =  nothing ,
241241        type:: Type  =  Real, meta =  Dict {DataType, Expr} ())
242-     metatypes =  [(:connection_type , VariableConnectType),
243-         (:description , VariableDescription),
244-         (:unit , VariableUnit),
245-         (:bounds , VariableBounds),
246-         (:noise , VariableNoiseType),
247-         (:input , VariableInput),
248-         (:output , VariableOutput),
249-         (:irreducible , VariableIrreducible),
250-         (:state_priority , VariableStatePriority),
251-         (:misc , VariableMisc),
252-         (:disturbance , VariableDisturbance),
253-         (:tunable , VariableTunable),
254-         (:dist , VariableDistribution)]
255- 
256242    arg isa  LineNumberNode &&  return 
257243    MLStyle. @match  arg begin 
258244        a:: Symbol  =>  begin 
@@ -278,27 +264,86 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
278264                varclass, where_types, meta)
279265            return  var, def, Dict ()
280266        end 
267+         Expr (:tuple , Expr (:(:: ), Expr (:ref , a, indices... ), type), meta_val) || 
268+         Expr (:tuple , Expr (:ref , a, indices... ), meta_val) =>  begin 
269+             (@isdefined  type) ||  (type =  Real)
270+             varname =  Meta. isexpr (a, :call ) ?  a. args[1 ] :  a
271+             push! (kwargs, Expr (:kw , varname, nothing ))
272+             meta =  parse_metadata (mod, meta_val)
273+             varval =  (@isdefined  default_val) ?  default_val : 
274+                      unit_handled_variable_value (meta, varname)
275+             if  varclass ==  :parameters 
276+                 var =  :($ varname =  $ first (@parameters  ($ a[$ (indices... )]:: $type  =  $ varval),
277+                 $ meta_val))
278+             else 
279+                 var =  :($ varname =  $ first (@variables  ($ a[$ (indices)]:: $type  =  $ varval),
280+                 $ meta_val))
281+             end 
282+             push_array_kwargs_and_metadata! (
283+                 dict, indices, meta, type, varclass, varname, varval)
284+             (:($ varname... ), var), nothing , Dict ()
285+         end 
286+         Expr (:(= ), Expr (:(:: ), Expr (:ref , a, indices... ), type), def_n_meta) || 
287+         Expr (:(= ), Expr (:ref , a, indices... ), def_n_meta) =>  begin 
288+             (@isdefined  type) ||  (type =  Real)
289+             varname =  Meta. isexpr (a, :call ) ?  a. args[1 ] :  a
290+             if  Meta. isexpr (def_n_meta, :tuple )
291+                 meta =  parse_metadata (mod, def_n_meta)
292+                 varval =  unit_handled_variable_value (meta, varname)
293+                 val, def_n_meta =  (def_n_meta. args[1 ], def_n_meta. args[2 : end ])
294+                 push! (kwargs, Expr (:kw , varname, nothing ))
295+                 if  varclass ==  :parameters 
296+                     var =  :($ varname =  $ varname ===  nothing  ?  $ val :  $ varname;
297+                     $ varname =  $ first (@parameters  ($ a[$ (indices... )]:: $type  =  $ varval),
298+                     $ (def_n_meta... )))
299+                 else 
300+                     var =  :($ varname =  $ varname ===  nothing  ?  $ val :  $ varname;
301+                     $ varname =  $ first (@variables  $ a[$ (indices... )]:: $type  =  (
302+                         $ varval),
303+                     $ (def_n_meta... )))
304+                 end 
305+             else 
306+                 push! (kwargs, Expr (:kw , varname, nothing ))
307+                 if  varclass ==  :parameters 
308+                     var =  :($ varname =  $ varname ===  nothing  ?  $ def_n_meta :  $ varname;
309+                     $ varname =  $ first (@parameters  $ a[$ (indices... )]:: $type  =  $ varname))
310+                 else 
311+                     var =  :($ varname =  $ varname ===  nothing  ?  $ def_n_meta :  $ varname;
312+                     $ varname =  $ first (@variables  $ a[$ (indices... )]:: $type  =  $ varname))
313+                 end 
314+                 varval, meta =  def_n_meta, nothing 
315+             end 
316+             push_array_kwargs_and_metadata! (
317+                 dict, indices, meta, type, varclass, varname, varval)
318+             (:($ varname... ), var), nothing , Dict ()
319+         end 
320+         Expr (:(:: ), Expr (:ref , a, indices... ), type) || 
321+         Expr (:ref , a, indices... ) =>  begin 
322+             (@isdefined  type) ||  (type =  Real)
323+             varname =  a isa  Expr &&  a. head ==  :call  ?  a. args[1 ] :  a
324+             push! (kwargs, Expr (:kw , varname, nothing ))
325+             if  varclass ==  :parameters 
326+                 var =  :($ varname =  $ first (@parameters  $ a[$ (indices... )]:: $type  =  $ varname))
327+             elseif  varclass ==  :variables 
328+                 var =  :($ varname =  $ first (@variables  $ a[$ (indices... )]:: $type  =  $ varname))
329+             else 
330+                 throw (" Symbolic array with arbitrary length is not handled for $varclass .
331+                     Please open an issue with an example."  )
332+             end 
333+             push_array_kwargs_and_metadata! (
334+                 dict, indices, nothing , type, varclass, varname, nothing )
335+             (:($ varname... ), var), nothing , Dict ()
336+         end 
281337        Expr (:(= ), a, b) =>  begin 
282338            Base. remove_linenums! (b)
283339            def, meta =  parse_default (mod, b)
284340            var, def, _ =  parse_variable_def! (
285341                dict, mod, a, varclass, kwargs, where_types; def, type, meta)
286-             if  dict[varclass] isa  Vector
287-                 dict[varclass][1 ][getname (var)][:default ] =  def
288-             else 
289-                 dict[varclass][getname (var)][:default ] =  def
290-             end 
342+             varclass_dict =  dict[varclass] isa  Vector ?  Ref (dict[varclass][1 ]) : 
343+                             Ref (dict[varclass])
344+             varclass_dict[][getname (var)][:default ] =  def
291345            if  meta != =  nothing 
292-                 for  (type, key) in  metatypes
293-                     if  (mt =  get (meta, key, nothing )) != =  nothing 
294-                         key ==  VariableConnectType &&  (mt =  nameof (mt))
295-                         if  dict[varclass] isa  Vector
296-                             dict[varclass][1 ][getname (var)][type] =  mt
297-                         else 
298-                             dict[varclass][getname (var)][type] =  mt
299-                         end 
300-                     end 
301-                 end 
346+                 update_readable_metadata! (varclass_dict[], meta, getname (var))
302347                var, metadata_with_exprs =  set_var_metadata (var, meta)
303348                return  var, def, metadata_with_exprs
304349            end 
@@ -308,17 +353,10 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
308353            meta =  parse_metadata (mod, b)
309354            var, def, _ =  parse_variable_def! (
310355                dict, mod, a, varclass, kwargs, where_types; type, meta)
356+             varclass_dict =  dict[varclass] isa  Vector ?  Ref (dict[varclass][1 ]) : 
357+                             Ref (dict[varclass])
311358            if  meta != =  nothing 
312-                 for  (type, key) in  metatypes
313-                     if  (mt =  get (meta, key, nothing )) != =  nothing 
314-                         key ==  VariableConnectType &&  (mt =  nameof (mt))
315-                         if  dict[varclass] isa  Vector
316-                             dict[varclass][1 ][getname (var)][type] =  mt
317-                         else 
318-                             dict[varclass][getname (var)][type] =  mt
319-                         end 
320-                     end 
321-                 end 
359+                 update_readable_metadata! (varclass_dict[], meta, getname (var))
322360                var, metadata_with_exprs =  set_var_metadata (var, meta)
323361                return  var, def, metadata_with_exprs
324362            end 
0 commit comments