@@ -226,22 +226,22 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol; namespace=true)
226
226
i = findfirst (x-> getname (x) == name, sts)
227
227
228
228
if i != = nothing
229
- return namespace ? rename ( sts[i], renamespace (sysname,name) ) : sts[i]
229
+ return namespace ? renamespace (sysname, sts[i]) : sts[i]
230
230
end
231
231
232
232
if has_ps (sys)
233
233
ps = get_ps (sys)
234
234
i = findfirst (x-> getname (x) == name,ps)
235
235
if i != = nothing
236
- return namespace ? rename ( ps[i], renamespace (sysname,name) ) : ps[i]
236
+ return namespace ? renamespace (sysname, ps[i]) : ps[i]
237
237
end
238
238
end
239
239
240
240
if has_observed (sys)
241
241
obs = get_observed (sys)
242
242
i = findfirst (x-> getname (x. lhs)== name,obs)
243
243
if i != = nothing
244
- return namespace ? rename ( obs[i]. lhs, renamespace (sysname,name) ) : obs[i]
244
+ return namespace ? renamespace (sysname, obs[i]) : obs[i]
245
245
end
246
246
end
247
247
@@ -268,11 +268,32 @@ function Base.setproperty!(sys::AbstractSystem, prop::Symbol, val)
268
268
end
269
269
end
270
270
271
+ abstract type SymScope end
272
+
273
+ struct LocalScope <: SymScope end
274
+ LocalScope (sym:: Union{Num, Sym} ) = setmetadata (sym, SymScope, LocalScope ())
275
+
276
+ struct ParentScope <: SymScope
277
+ parent:: SymScope
278
+ end
279
+ ParentScope (sym:: Union{Num, Sym} ) = setmetadata (sym, SymScope, ParentScope (getmetadata (value (sym), SymScope, LocalScope ())))
280
+
281
+ struct GlobalScope <: SymScope end
282
+ GlobalScope (sym:: Union{Num, Sym} ) = setmetadata (sym, SymScope, GlobalScope ())
283
+
271
284
function renamespace (namespace, x)
272
285
if x isa Num
273
286
renamespace (namespace, value (x))
274
287
elseif x isa Symbolic
275
- rename (x, renamespace (namespace, getname (x)))
288
+ let scope = getmetadata (x, SymScope, LocalScope ())
289
+ if scope isa LocalScope
290
+ rename (x, renamespace (namespace, getname (x)))
291
+ elseif scope isa ParentScope
292
+ setmetadata (x, SymScope, scope. parent)
293
+ else # GlobalScope
294
+ x
295
+ end
296
+ end
276
297
else
277
298
Symbol (namespace,:₊ ,x)
278
299
end
@@ -300,7 +321,7 @@ function namespace_equation(eq::Equation,name,iv)
300
321
end
301
322
302
323
function namespace_expr (O:: Sym ,name,iv)
303
- isequal (O, iv) ? O : rename (O, renamespace (name,nameof (O)) )
324
+ isequal (O, iv) ? O : renamespace (name,O )
304
325
end
305
326
306
327
_symparam (s:: Symbolic{T} ) where {T} = T
@@ -309,7 +330,7 @@ function namespace_expr(O,name,iv) where {T}
309
330
if istree (O)
310
331
renamed = map (a-> namespace_expr (a,name,iv), arguments (O))
311
332
if operation (O) isa Sym
312
- renamed_op = rename (O,renamespace (name, getname ( O)))
333
+ rename (O,getname ( renamespace (name, O)))
313
334
else
314
335
similarterm (O,operation (O),renamed)
315
336
end
0 commit comments