@@ -29,6 +29,14 @@ public bool IsAttrib( string key, string value )
29
29
&& attribs . TryGetValue ( key , out Strings values )
30
30
&& values . Contains ( value ) ;
31
31
32
+ // Enumerate (depth first) through all contained Stmt and itself
33
+ // Only overloaded in Stmt which contain more Stmt itself
34
+ // Filter results with e.g. EnumerateDF.OfType<ReturnStmt>()
35
+ [ Pure ]
36
+ public virtual IEnumerable < Stmt > EnumerateDF {
37
+ get { yield return this ; }
38
+ }
39
+
32
40
public virtual void AssignAttribs ( Attribs inAttribs )
33
41
{
34
42
attribs = inAttribs ;
@@ -189,6 +197,21 @@ public class IfStmt : Stmt
189
197
public List < CondThen > ifThens ;
190
198
public Stmt ? elseStmt ;
191
199
200
+ [ Pure ]
201
+ public override IEnumerable < Stmt > EnumerateDF {
202
+ get {
203
+ foreach ( CondThen ifThen in ifThens )
204
+ foreach ( Stmt subStmt in ifThen . thenStmt . EnumerateDF )
205
+ yield return subStmt ;
206
+
207
+ if ( elseStmt != null )
208
+ foreach ( Stmt subStmt in elseStmt . EnumerateDF )
209
+ yield return subStmt ;
210
+
211
+ yield return this ;
212
+ }
213
+ }
214
+
192
215
public override Strings Gen ( int level )
193
216
{
194
217
Strings ret = new ( ) ;
@@ -211,10 +234,10 @@ public override Strings Gen( int level )
211
234
}
212
235
}
213
236
214
- public class CaseStmt : Stmt
237
+ public struct CaseStmt
215
238
{
216
- public List < Expr > caseExprs ;
217
- public List < Stmt > bodyStmts ;
239
+ public List < Expr > caseExprs ; // can have multiple ORed conditions
240
+ public MultiStmt bodyStmt ;
218
241
public bool autoBreak ;
219
242
}
220
243
@@ -224,6 +247,22 @@ public class SwitchStmt : Stmt
224
247
public List < CaseStmt > caseStmts ;
225
248
public List < Stmt > ? elseStmts ;
226
249
250
+ [ Pure ]
251
+ public override IEnumerable < Stmt > EnumerateDF {
252
+ get {
253
+ foreach ( CaseStmt caseStmt in caseStmts )
254
+ foreach ( Stmt subStmt in caseStmt . bodyStmt . EnumerateDF )
255
+ yield return subStmt ;
256
+
257
+ if ( elseStmts != null )
258
+ foreach ( Stmt elseStmt in elseStmts )
259
+ foreach ( Stmt subStmt in elseStmt . EnumerateDF )
260
+ yield return subStmt ;
261
+
262
+ yield return this ;
263
+ }
264
+ }
265
+
227
266
public override Strings Gen ( int level )
228
267
{
229
268
throw new NotImplementedException ( ) ;
@@ -235,6 +274,16 @@ public class LoopStmt : Stmt
235
274
{
236
275
public Stmt bodyStmt ;
237
276
277
+ [ Pure ]
278
+ public override IEnumerable < Stmt > EnumerateDF {
279
+ get {
280
+ foreach ( Stmt subStmt in bodyStmt . EnumerateDF )
281
+ yield return subStmt ;
282
+
283
+ yield return this ;
284
+ }
285
+ }
286
+
238
287
public override Strings Gen ( int level )
239
288
{
240
289
Strings ret = new ( ) ;
@@ -255,6 +304,21 @@ public class ForStmt : LoopStmt
255
304
public Expr iterExpr ;
256
305
public Stmt ? elseStmt ;
257
306
307
+ [ Pure ]
308
+ public override IEnumerable < Stmt > EnumerateDF {
309
+ get {
310
+ foreach ( Stmt subStmt in initStmt . EnumerateDF )
311
+ yield return subStmt ;
312
+
313
+ if ( elseStmt != null )
314
+ foreach ( Stmt subStmt in elseStmt . EnumerateDF )
315
+ yield return subStmt ;
316
+
317
+ foreach ( Stmt baseStmt in base . EnumerateDF )
318
+ yield return baseStmt ;
319
+ }
320
+ }
321
+
258
322
public override Strings Gen ( int level )
259
323
{
260
324
if ( elseStmt != null )
@@ -280,6 +344,18 @@ public class WhileStmt : LoopStmt
280
344
public Expr condExpr ;
281
345
public Stmt ? elseStmt ;
282
346
347
+ [ Pure ]
348
+ public override IEnumerable < Stmt > EnumerateDF {
349
+ get {
350
+ if ( elseStmt != null )
351
+ foreach ( Stmt subStmt in elseStmt . EnumerateDF )
352
+ yield return subStmt ;
353
+
354
+ foreach ( Stmt baseStmt in base . EnumerateDF )
355
+ yield return baseStmt ;
356
+ }
357
+ }
358
+
283
359
public override Strings Gen ( int level )
284
360
{
285
361
if ( elseStmt != null )
@@ -347,6 +423,17 @@ public class MultiStmt : Stmt
347
423
// TODO merge this with Block?
348
424
// public bool IsBlock { get; init; }
349
425
426
+ [ Pure ]
427
+ public override IEnumerable < Stmt > EnumerateDF {
428
+ get {
429
+ foreach ( Stmt stmt in stmts )
430
+ foreach ( Stmt subStmt in stmt . EnumerateDF )
431
+ yield return subStmt ;
432
+
433
+ yield return this ;
434
+ }
435
+ }
436
+
350
437
public override void AssignAttribs ( Attribs inAttribs )
351
438
{
352
439
stmts . ForEach ( v => v . AssignAttribs ( inAttribs ) ) ;
@@ -366,6 +453,17 @@ public class Block : Stmt
366
453
{
367
454
public List < Stmt > stmts ;
368
455
456
+ [ Pure ]
457
+ public override IEnumerable < Stmt > EnumerateDF {
458
+ get {
459
+ foreach ( Stmt stmt in stmts )
460
+ foreach ( Stmt subStmt in stmt . EnumerateDF )
461
+ yield return subStmt ;
462
+
463
+ yield return this ;
464
+ }
465
+ }
466
+
369
467
// only overriden here
370
468
public override Strings GenWithoutCurly ( int level )
371
469
{
0 commit comments