@@ -51,7 +51,7 @@ function _model_macro(mod, name, expr, isconnector)
5151 c_evts = []
5252 d_evts = []
5353 kwargs = OrderedCollections. OrderedSet ()
54- where_types = Expr[]
54+ where_types = Union{Symbol, Expr} []
5555
5656 push! (exprs. args, :(variables = []))
5757 push! (exprs. args, :(parameters = []))
143143pop_structure_dict! (dict, key) = length (dict[key]) == 0 && pop! (dict, key)
144144
145145function update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
146- varclass, where_types)
146+ varclass, where_types, meta )
147147 if indices isa Nothing
148- push! (kwargs, Expr (:kw , Expr (:(:: ), a, Union{Nothing, type}), nothing ))
148+ kwtype = if ! isnothing (meta) && haskey (meta, VariableUnit)
149+ dim = dimension (eval (meta[VariableUnit]))
150+ units = gensym (:U )
151+ push! (where_types, units)
152+ Expr (:curly , Union, :Nothing , Expr (:curly , Quantity, Expr (:(< :), type), dim, units))
153+ else
154+ Expr (:curly , Union, Nothing, type)
155+ end
156+ push! (kwargs, Expr (:kw , Expr (:(:: ), a, kwtype), nothing ))
149157 dict[:kwargs ][getname (var)] = Dict (:value => def, :type => type)
150158 else
151159 vartype = gensym (:T )
166174
167175function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
168176 def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
169- type:: Type = Real)
177+ meta = nothing , type:: Type = Real)
170178 metatypes = [(:connection_type , VariableConnectType),
171179 (:description , VariableDescription),
172180 (:unit , VariableUnit),
@@ -186,7 +194,7 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
186194 a:: Symbol => begin
187195 var = generate_var! (dict, a, varclass; indices, type)
188196 update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
189- varclass, where_types)
197+ varclass, where_types, meta )
190198 return var, def, Dict ()
191199 end
192200 Expr (:(:: ), a, type) => begin
@@ -201,14 +209,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
201209 Expr (:call , a, b) => begin
202210 var = generate_var! (dict, a, b, varclass, mod; indices, type)
203211 update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
204- varclass, where_types)
212+ varclass, where_types, meta )
205213 return var, def, Dict ()
206214 end
207215 Expr (:(= ), a, b) => begin
208216 Base. remove_linenums! (b)
209217 def, meta = parse_default (mod, b)
210218 var, def, _ = parse_variable_def! (
211- dict, mod, a, varclass, kwargs, where_types; def, type)
219+ dict, mod, a, varclass, kwargs, where_types; def, meta, type)
212220 if dict[varclass] isa Vector
213221 dict[varclass][1 ][getname (var)][:default ] = def
214222 else
@@ -231,9 +239,9 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
231239 return var, def, Dict ()
232240 end
233241 Expr (:tuple , a, b) => begin
234- var, def, _ = parse_variable_def! (
235- dict, mod, a, varclass, kwargs, where_types; type)
236242 meta = parse_metadata (mod, b)
243+ var, def, _ = parse_variable_def! (
244+ dict, mod, a, varclass, kwargs, where_types; meta, type)
237245 if meta != = nothing
238246 for (type, key) in metatypes
239247 if (mt = get (meta, key, nothing )) != = nothing
@@ -616,11 +624,22 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
616624 dict, mod, arg, varclass, kwargs, where_types)
617625 name = getname (vv)
618626
619- varexpr = quote
620- $ name = if $ name === nothing
621- $ setdefault ($ vv, $ def)
622- else
623- $ setdefault ($ vv, $ name)
627+ varexpr = if haskey (metadata_with_exprs, VariableUnit)
628+ unit = metadata_with_exprs[VariableUnit]
629+ quote
630+ $ name = if $ name === nothing
631+ $ setdefault ($ vv, $ def)
632+ else
633+ $ setdefault ($ vv, $ ustrip ($ unit, $ name))
634+ end
635+ end
636+ else
637+ quote
638+ $ name = if $ name === nothing
639+ $ setdefault ($ vv, $ def)
640+ else
641+ $ setdefault ($ vv, $ name)
642+ end
624643 end
625644 end
626645
0 commit comments