@@ -357,30 +357,54 @@ function Base.setproperty!(sys::AbstractSystem, prop::Symbol, val)
357
357
end
358
358
end
359
359
360
+ function apply_to_variables (f:: F , ex) where {F}
361
+ ex = value (ex)
362
+ if isvariable (ex)
363
+ return f (ex)
364
+ end
365
+ istree (ex) || return ex
366
+ similarterm (ex, apply_to_variables (f, operation (ex)),
367
+ map (Base. Fix1 (apply_to_variables, f), arguments (ex)),
368
+ metadata = metadata (ex))
369
+ end
370
+
360
371
abstract type SymScope end
361
372
362
373
struct LocalScope <: SymScope end
363
- LocalScope (sym:: Union{Num, Symbolic} ) = setmetadata (sym, SymScope, LocalScope ())
374
+ function LocalScope (sym:: Union{Num, Symbolic} )
375
+ apply_to_variables (sym) do sym
376
+ setmetadata (sym, SymScope, LocalScope ())
377
+ end
378
+ end
364
379
365
380
struct ParentScope <: SymScope
366
381
parent:: SymScope
367
382
end
368
383
function ParentScope (sym:: Union{Num, Symbolic} )
369
- setmetadata (sym, SymScope, ParentScope (getmetadata (value (sym), SymScope, LocalScope ())))
384
+ apply_to_variables (sym) do sym
385
+ setmetadata (sym, SymScope,
386
+ ParentScope (getmetadata (value (sym), SymScope, LocalScope ())))
387
+ end
370
388
end
371
389
372
390
struct DelayParentScope <: SymScope
373
391
parent:: SymScope
374
392
N:: Int
375
393
end
376
394
function DelayParentScope (sym:: Union{Num, Symbolic} , N)
377
- setmetadata (sym, SymScope,
378
- DelayParentScope (getmetadata (value (sym), SymScope, LocalScope ()), N))
395
+ apply_to_variables (sym) do sym
396
+ setmetadata (sym, SymScope,
397
+ DelayParentScope (getmetadata (value (sym), SymScope, LocalScope ()), N))
398
+ end
379
399
end
380
400
DelayParentScope (sym:: Union{Num, Symbolic} ) = DelayParentScope (sym, 1 )
381
401
382
402
struct GlobalScope <: SymScope end
383
- GlobalScope (sym:: Union{Num, Symbolic} ) = setmetadata (sym, SymScope, GlobalScope ())
403
+ function GlobalScope (sym:: Union{Num, Symbolic} )
404
+ apply_to_variables (sym) do sym
405
+ setmetadata (sym, SymScope, GlobalScope ())
406
+ end
407
+ end
384
408
385
409
renamespace (sys, eq:: Equation ) = namespace_equation (eq, sys)
386
410
@@ -996,7 +1020,15 @@ end
996
1020
997
1021
function default_to_parentscope (v)
998
1022
uv = unwrap (v)
999
- uv isa Symbolic && ! hasmetadata (uv, SymScope) ? ParentScope (v) : v
1023
+ uv isa Symbolic || return v
1024
+ apply_to_variables (v) do sym
1025
+ if ! hasmetadata (uv, SymScope)
1026
+ setmetadata (sym, SymScope,
1027
+ ParentScope (getmetadata (value (sym), SymScope, LocalScope ())))
1028
+ else
1029
+ sym
1030
+ end
1031
+ end
1000
1032
end
1001
1033
1002
1034
function _config (expr, namespace)
0 commit comments