185
185
186
186
rename (x:: AbstractSystem , name) = @set x. name = name
187
187
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 )
189
210
sysname = nameof (sys)
190
211
systems = get_systems (sys)
191
212
if isdefined (sys, name)
@@ -194,30 +215,30 @@ function Base.getproperty(sys::AbstractSystem, name::Symbol)
194
215
elseif ! isempty (systems)
195
216
i = findfirst (x-> nameof (x)== name,systems)
196
217
if i != = nothing
197
- return rename (systems[i],renamespace (sysname,name))
218
+ return namespace ? rename (systems[i],renamespace (sysname,name)) : systems[i]
198
219
end
199
220
end
200
221
201
222
sts = get_states (sys)
202
223
i = findfirst (x-> getname (x) == name, sts)
203
224
204
225
if i != = nothing
205
- return rename (sts[i],renamespace (sysname,name))
226
+ return namespace ? rename (sts[i],renamespace (sysname,name)) : sts[i]
206
227
end
207
228
208
229
if has_ps (sys)
209
230
ps = get_ps (sys)
210
231
i = findfirst (x-> getname (x) == name,ps)
211
232
if i != = nothing
212
- return rename (ps[i],renamespace (sysname,name))
233
+ return namespace ? rename (ps[i],renamespace (sysname,name)) : ps[i]
213
234
end
214
235
end
215
236
216
237
if has_observed (sys)
217
238
obs = get_observed (sys)
218
239
i = findfirst (x-> getname (x. lhs)== name,obs)
219
240
if i != = nothing
220
- return rename (obs[i]. lhs,renamespace (sysname,name))
241
+ return namespace ? rename (obs[i]. lhs,renamespace (sysname,name)) : obs[i]
221
242
end
222
243
end
223
244
@@ -469,10 +490,35 @@ function _named(expr)
469
490
:($ name = $ call)
470
491
end
471
492
493
+ """
494
+ $(SIGNATURES)
495
+
496
+ Rewrite `@named y = foo(x)` to `y = foo(x; name=:y)`.
497
+ """
472
498
macro named (expr)
473
499
esc (_named (expr))
474
500
end
475
501
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
+
476
522
"""
477
523
$(SIGNATURES)
478
524
0 commit comments