@@ -51,7 +51,7 @@ function _model_macro(mod, name, expr, isconnector)
51
51
c_evts = []
52
52
d_evts = []
53
53
kwargs = OrderedCollections. OrderedSet ()
54
- where_types = Expr[]
54
+ where_types = Union{Symbol, Expr} []
55
55
56
56
push! (exprs. args, :(variables = []))
57
57
push! (exprs. args, :(parameters = []))
143
143
pop_structure_dict! (dict, key) = length (dict[key]) == 0 && pop! (dict, key)
144
144
145
145
function update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
146
- varclass, where_types)
146
+ varclass, where_types, meta )
147
147
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 ))
149
157
dict[:kwargs ][getname (var)] = Dict (:value => def, :type => type)
150
158
else
151
159
vartype = gensym (:T )
166
174
167
175
function parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types;
168
176
def = nothing , indices:: Union{Vector{UnitRange{Int}}, Nothing} = nothing ,
169
- type:: Type = Real)
177
+ meta = nothing , type:: Type = Real)
170
178
metatypes = [(:connection_type , VariableConnectType),
171
179
(:description , VariableDescription),
172
180
(:unit , VariableUnit),
@@ -186,7 +194,7 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
186
194
a:: Symbol => begin
187
195
var = generate_var! (dict, a, varclass; indices, type)
188
196
update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
189
- varclass, where_types)
197
+ varclass, where_types, meta )
190
198
return var, def, Dict ()
191
199
end
192
200
Expr (:(:: ), a, type) => begin
@@ -201,14 +209,14 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
201
209
Expr (:call , a, b) => begin
202
210
var = generate_var! (dict, a, b, varclass, mod; indices, type)
203
211
update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
204
- varclass, where_types)
212
+ varclass, where_types, meta )
205
213
return var, def, Dict ()
206
214
end
207
215
Expr (:(= ), a, b) => begin
208
216
Base. remove_linenums! (b)
209
217
def, meta = parse_default (mod, b)
210
218
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)
212
220
if dict[varclass] isa Vector
213
221
dict[varclass][1 ][getname (var)][:default ] = def
214
222
else
@@ -231,9 +239,9 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
231
239
return var, def, Dict ()
232
240
end
233
241
Expr (:tuple , a, b) => begin
234
- var, def, _ = parse_variable_def! (
235
- dict, mod, a, varclass, kwargs, where_types; type)
236
242
meta = parse_metadata (mod, b)
243
+ var, def, _ = parse_variable_def! (
244
+ dict, mod, a, varclass, kwargs, where_types; meta, type)
237
245
if meta != = nothing
238
246
for (type, key) in metatypes
239
247
if (mt = get (meta, key, nothing )) != = nothing
@@ -616,11 +624,22 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
616
624
dict, mod, arg, varclass, kwargs, where_types)
617
625
name = getname (vv)
618
626
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
624
643
end
625
644
end
626
645
0 commit comments