Skip to content

Commit 805811b

Browse files
authored
Merge pull request #882 from SciML/myb/propname
Overload `propertynames` and add `@nonamespace`
2 parents e8d2838 + b07c154 commit 805811b

File tree

3 files changed

+54
-6
lines changed

3 files changed

+54
-6
lines changed

src/ModelingToolkit.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,6 @@ export simplify, substitute
176176
export build_function
177177
export modelingtoolkitize
178178
export @variables, @parameters
179-
export @named
179+
export @named, @nonamespace
180180

181181
end # module

src/systems/abstractsystem.jl

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,28 @@ end
185185

186186
rename(x::AbstractSystem, name) = @set x.name = name
187187

188-
function Base.getproperty(sys::AbstractSystem, name::Symbol)
188+
function Base.propertynames(sys::AbstractSystem; private=false)
189+
if private
190+
return fieldnames(typeof(sys))
191+
else
192+
names = Symbol[]
193+
for s in get_systems(sys)
194+
push!(names, getname(s))
195+
end
196+
has_states(sys) && for s in get_states(sys)
197+
push!(names, getname(s))
198+
end
199+
has_ps(sys) && for s in get_ps(sys)
200+
push!(names, getname(s))
201+
end
202+
has_observed(sys) && for s in get_observed(sys)
203+
push!(names, getname(s.lhs))
204+
end
205+
return names
206+
end
207+
end
208+
209+
function Base.getproperty(sys::AbstractSystem, name::Symbol; namespace=true)
189210
sysname = nameof(sys)
190211
systems = get_systems(sys)
191212
if isdefined(sys, name)
@@ -194,30 +215,30 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
194215
elseif !isempty(systems)
195216
i = findfirst(x->nameof(x)==name,systems)
196217
if i !== nothing
197-
return rename(systems[i],renamespace(sysname,name))
218+
return namespace ? rename(systems[i],renamespace(sysname,name)) : systems[i]
198219
end
199220
end
200221

201222
sts = get_states(sys)
202223
i = findfirst(x->getname(x) == name, sts)
203224

204225
if i !== nothing
205-
return rename(sts[i],renamespace(sysname,name))
226+
return namespace ? rename(sts[i],renamespace(sysname,name)) : sts[i]
206227
end
207228

208229
if has_ps(sys)
209230
ps = get_ps(sys)
210231
i = findfirst(x->getname(x) == name,ps)
211232
if i !== nothing
212-
return rename(ps[i],renamespace(sysname,name))
233+
return namespace ? rename(ps[i],renamespace(sysname,name)) : ps[i]
213234
end
214235
end
215236

216237
if has_observed(sys)
217238
obs = get_observed(sys)
218239
i = findfirst(x->getname(x.lhs)==name,obs)
219240
if i !== nothing
220-
return rename(obs[i].lhs,renamespace(sysname,name))
241+
return namespace ? rename(obs[i].lhs,renamespace(sysname,name)) : obs[i]
221242
end
222243
end
223244

@@ -469,10 +490,35 @@ function _named(expr)
469490
:($name = $call)
470491
end
471492

493+
"""
494+
$(SIGNATURES)
495+
496+
Rewrite `@named y = foo(x)` to `y = foo(x; name=:y)`.
497+
"""
472498
macro named(expr)
473499
esc(_named(expr))
474500
end
475501

502+
function _nonamespace(expr)
503+
if Meta.isexpr(expr, :.)
504+
return :($getproperty($(map(_nonamespace, expr.args)...); namespace=false))
505+
elseif expr isa Expr && !isempty(expr.args)
506+
return Expr(expr.head, map(_nonamespace, expr.args)...)
507+
else
508+
expr
509+
end
510+
end
511+
512+
"""
513+
$(SIGNATURES)
514+
515+
Rewrite `@nonamespace a.b.c` to
516+
`getproperty(getproperty(a, :b; namespace = false), :c; namespace = false)`.
517+
"""
518+
macro nonamespace(expr)
519+
esc(_nonamespace(expr))
520+
end
521+
476522
"""
477523
$(SIGNATURES)
478524

test/reduction.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ connected = ODESystem([s ~ a + lorenz1.x
7474
lorenz2.y ~ s
7575
lorenz1.F ~ lorenz2.u
7676
lorenz2.F ~ lorenz1.u],t,systems=[lorenz1,lorenz2])
77+
@test length(Base.propertynames(connected)) == 10
78+
@test isequal((@nonamespace connected.lorenz1.x), x)
7779

7880
# Reduced Flattened System
7981

0 commit comments

Comments
 (0)