@@ -187,7 +187,7 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
187
187
var = generate_var! (dict, a, varclass; indices, type)
188
188
update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
189
189
varclass, where_types)
190
- ( var, def)
190
+ return var, def, Dict ( )
191
191
end
192
192
Expr (:(:: ), a, type) => begin
193
193
type = getfield (mod, type)
@@ -201,13 +201,13 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
201
201
Expr (:call , a, b) => begin
202
202
var = generate_var! (dict, a, b, varclass, mod; indices, type)
203
203
update_kwargs_and_metadata! (dict, kwargs, a, def, indices, type, var,
204
- varclass, where_types)
205
- ( var, def)
204
+ varclass, where_types)
205
+ return var, def, Dict ( )
206
206
end
207
207
Expr (:(= ), a, b) => begin
208
208
Base. remove_linenums! (b)
209
209
def, meta = parse_default (mod, b)
210
- var, def = parse_variable_def! (
210
+ var, def, _ = parse_variable_def! (
211
211
dict, mod, a, varclass, kwargs, where_types; def, type)
212
212
if dict[varclass] isa Vector
213
213
dict[varclass][1 ][getname (var)][:default ] = def
@@ -225,12 +225,13 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
225
225
end
226
226
end
227
227
end
228
- var = set_var_metadata (var, meta)
228
+ var, metadata_with_exprs = set_var_metadata (var, meta)
229
+ return var, def, metadata_with_exprs
229
230
end
230
- ( var, def)
231
+ return var, def, Dict ( )
231
232
end
232
233
Expr (:tuple , a, b) => begin
233
- var, def = parse_variable_def! (
234
+ var, def, _ = parse_variable_def! (
234
235
dict, mod, a, varclass, kwargs, where_types; type)
235
236
meta = parse_metadata (mod, b)
236
237
if meta != = nothing
@@ -244,9 +245,10 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
244
245
end
245
246
end
246
247
end
247
- var = set_var_metadata (var, meta)
248
+ var, metadata_with_exprs = set_var_metadata (var, meta)
249
+ return var, def, metadata_with_exprs
248
250
end
249
- ( var, def)
251
+ return var, def, Dict ( )
250
252
end
251
253
Expr (:ref , a, b... ) => begin
252
254
indices = map (i -> UnitRange (i. args[2 ], i. args[end ]), b)
@@ -350,21 +352,27 @@ function parse_metadata(mod, a)
350
352
end
351
353
end
352
354
355
+ function _set_var_metadata! (metadata_with_exprs, a, m, v:: Expr )
356
+ push! (metadata_with_exprs, m => v)
357
+ a
358
+ end
359
+ _set_var_metadata! (metadata_with_exprs, a, m, v) = wrap (set_scalar_metadata (unwrap (a), m, v))
360
+
353
361
function set_var_metadata (a, ms)
362
+ metadata_with_exprs = Dict {DataType, Expr} ()
354
363
for (m, v) in ms
355
- a = wrap (set_scalar_metadata (unwrap (a), m, v))
364
+ m == VariableGuess && v isa Symbol && (v = quote $ v end )
365
+ a = _set_var_metadata! (metadata_with_exprs, a, m, v)
356
366
end
357
- a
367
+ a, metadata_with_exprs
358
368
end
359
369
360
370
function get_var (mod:: Module , b)
361
371
if b isa Symbol
362
- getproperty (mod, b)
363
- elseif b isa Expr
364
- Core. eval (mod, b)
365
- else
366
- b
372
+ isdefined (mod, b) && return getproperty (mod, b)
373
+ isdefined (@__MODULE__ , b) && return getproperty (@__MODULE__ , b)
367
374
end
375
+ b
368
376
end
369
377
370
378
function parse_model! (exprs, comps, ext, eqs, icon, vs, ps, sps, c_evts, d_evts,
@@ -595,10 +603,24 @@ function parse_variable_arg!(exprs, vs, dict, mod, arg, varclass, kwargs, where_
595
603
end
596
604
597
605
function parse_variable_arg (dict, mod, arg, varclass, kwargs, where_types)
598
- vv, def = parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types)
606
+ vv, def, metadata_with_exprs = parse_variable_def! (dict, mod, arg, varclass, kwargs, where_types)
599
607
name = getname (vv)
600
- return vv isa Num ? name : :($ name... ),
601
- :($ name = $ name === nothing ? $ setdefault ($ vv, $ def) : $ setdefault ($ vv, $ name))
608
+
609
+ varexpr = quote
610
+ $ name = if $ name === nothing
611
+ $ setdefault ($ vv, $ def)
612
+ else
613
+ $ setdefault ($ vv, $ name)
614
+ end
615
+ end
616
+
617
+ metadata_expr = Expr (:block )
618
+ for (k,v) in metadata_with_exprs
619
+ push! (metadata_expr. args, :($ name = $ wrap ($ set_scalar_metadata ($ unwrap ($ name), $ k, $ v))))
620
+ end
621
+
622
+ push! (varexpr. args, metadata_expr)
623
+ return vv isa Num ? name : :($ name... ), varexpr
602
624
end
603
625
604
626
function handle_conditional_vars! (
@@ -882,7 +904,7 @@ function _parse_components!(body, kwargs)
882
904
Base. remove_linenums! (body)
883
905
arg = body. args[end ]
884
906
885
- MLStyle. @match arg begin
907
+ MLStyle. @match arg begin
886
908
Expr (:(= ), a, Expr (:comprehension , Expr (:generator , b, Expr (:(= ), c, d)))) => begin
887
909
array_varexpr = Expr (:block )
888
910
@@ -901,10 +923,10 @@ function _parse_components!(body, kwargs)
901
923
# Note that `e` is of the form `Tuple{Expr(:(=), c, d)}`
902
924
error (" More than one index isn't supported while building component array" )
903
925
end
904
- Expr (:block ) => begin
905
- # TODO : Do we need this?
906
- error (" Multiple `@components` block detected within a single block" )
907
- end
926
+ Expr (:block ) => begin
927
+ # TODO : Do we need this?
928
+ error (" Multiple `@components` block detected within a single block" )
929
+ end
908
930
Expr (:(= ), a, Expr (:for , Expr (:(= ), c, d), b)) => begin
909
931
Base. remove_linenums! (b)
910
932
array_varexpr = Expr (:block )
@@ -917,21 +939,21 @@ function _parse_components!(body, kwargs)
917
939
918
940
expr = _named_idxs (a, d, :($ c -> $ (b. args[end ])); extra_args = array_varexpr)
919
941
end
920
- Expr (:(= ), a, b) => begin
921
- arg = deepcopy (arg)
922
- b = deepcopy (arg. args[2 ])
942
+ Expr (:(= ), a, b) => begin
943
+ arg = deepcopy (arg)
944
+ b = deepcopy (arg. args[2 ])
923
945
924
946
component_args! (a, b, varexpr, kwargs)
925
947
926
- arg. args[2 ] = b
948
+ arg. args[2 ] = b
927
949
expr = :(@named $ arg)
928
- push! (comp_names, a)
929
- if (isa (b. args[1 ], Symbol) || Meta. isexpr (b. args[1 ], :.))
930
- push! (comps, [a, b. args[1 ]])
950
+ push! (comp_names, a)
951
+ if (isa (b. args[1 ], Symbol) || Meta. isexpr (b. args[1 ], :.))
952
+ push! (comps, [a, b. args[1 ]])
953
+ end
931
954
end
955
+ _ => error (" Couldn't parse the component body: $arg " )
932
956
end
933
- _ => error (" Couldn't parse the component body: $arg " )
934
- end
935
957
936
958
return comp_names, comps, expr, varexpr
937
959
end
0 commit comments