Skip to content

Commit af79dfa

Browse files
committed
Apply scope recursively
1 parent 38aaf21 commit af79dfa

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

src/systems/abstractsystem.jl

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -357,30 +357,53 @@ function Base.setproperty!(sys::AbstractSystem, prop::Symbol, val)
357357
end
358358
end
359359

360+
function apply_to_variables(f::F, ex) where {F}
361+
if isvariable(ex)
362+
return f(ex)
363+
end
364+
istree(ex) || return ex
365+
similarterm(ex, apply_to_variables(operation(ex)),
366+
map(apply_to_variables, arguments(ex)),
367+
metadata = metadata(ex))
368+
end
369+
360370
abstract type SymScope end
361371

362372
struct LocalScope <: SymScope end
363-
LocalScope(sym::Union{Num, Symbolic}) = setmetadata(sym, SymScope, LocalScope())
373+
function LocalScope(sym::Union{Num, Symbolic})
374+
apply_to_variables(sym) do sym
375+
setmetadata(sym, SymScope, LocalScope())
376+
end
377+
end
364378

365379
struct ParentScope <: SymScope
366380
parent::SymScope
367381
end
368382
function ParentScope(sym::Union{Num, Symbolic})
369-
setmetadata(sym, SymScope, ParentScope(getmetadata(value(sym), SymScope, LocalScope())))
383+
apply_to_variables(sym) do sym
384+
setmetadata(sym, SymScope,
385+
ParentScope(getmetadata(value(sym), SymScope, LocalScope())))
386+
end
370387
end
371388

372389
struct DelayParentScope <: SymScope
373390
parent::SymScope
374391
N::Int
375392
end
376393
function DelayParentScope(sym::Union{Num, Symbolic}, N)
377-
setmetadata(sym, SymScope,
378-
DelayParentScope(getmetadata(value(sym), SymScope, LocalScope()), N))
394+
apply_to_variables(sym) do sym
395+
setmetadata(sym, SymScope,
396+
DelayParentScope(getmetadata(value(sym), SymScope, LocalScope()), N))
397+
end
379398
end
380399
DelayParentScope(sym::Union{Num, Symbolic}) = DelayParentScope(sym, 1)
381400

382401
struct GlobalScope <: SymScope end
383-
GlobalScope(sym::Union{Num, Symbolic}) = setmetadata(sym, SymScope, GlobalScope())
402+
function GlobalScope(sym::Union{Num, Symbolic})
403+
apply_to_variables(sym) do sym
404+
setmetadata(sym, SymScope, GlobalScope())
405+
end
406+
end
384407

385408
renamespace(sys, eq::Equation) = namespace_equation(eq, sys)
386409

@@ -996,7 +1019,15 @@ end
9961019

9971020
function default_to_parentscope(v)
9981021
uv = unwrap(v)
999-
uv isa Symbolic && !hasmetadata(uv, SymScope) ? ParentScope(v) : v
1022+
uv isa Symbolic || return v
1023+
apply_to_variables(v) do sym
1024+
if !hasmetadata(uv, SymScope)
1025+
setmetadata(sym, SymScope,
1026+
ParentScope(getmetadata(value(sym), SymScope, LocalScope())))
1027+
else
1028+
sym
1029+
end
1030+
end
10001031
end
10011032

10021033
function _config(expr, namespace)

0 commit comments

Comments
 (0)