1
1
using System . Collections ;
2
- using HydraScript . Lib . FrontEnd . GetTokens . Data ;
3
2
using HydraScript . Lib . IR . CheckSemantics . Variables ;
4
3
5
4
namespace HydraScript . Lib . IR . Ast ;
6
5
7
6
public abstract class AbstractSyntaxTreeNode :
8
- IEnumerable < AbstractSyntaxTreeNode > ,
7
+ IReadOnlyList < AbstractSyntaxTreeNode > ,
9
8
IVisitable < AbstractSyntaxTreeNode >
10
9
{
11
- public AbstractSyntaxTreeNode ? Parent { get ; set ; }
10
+ public AbstractSyntaxTreeNode Parent { get ; set ; } = default ! ;
11
+
12
+ protected virtual bool IsRoot => false ;
12
13
13
14
public SymbolTable SymbolTable { get ; set ; } = default ! ;
14
15
15
- public Segment Segment { get ; init ; } = default ! ;
16
+ public string Segment { get ; init ; } = string . Empty ;
17
+
18
+ protected virtual IReadOnlyList < AbstractSyntaxTreeNode > Children { get ; } = [ ] ;
19
+
20
+ public IEnumerator < AbstractSyntaxTreeNode > GetEnumerator ( ) =>
21
+ Children . ToList ( ) . GetEnumerator ( ) ;
22
+
23
+ IEnumerator IEnumerable . GetEnumerator ( ) =>
24
+ GetEnumerator ( ) ;
25
+
26
+ public int Count => Children . Count ;
27
+
28
+ public AbstractSyntaxTreeNode this [ int index ] =>
29
+ Children [ index ] ;
16
30
17
31
internal List < AbstractSyntaxTreeNode > GetAllNodes ( )
18
32
{
19
- var result = new List < AbstractSyntaxTreeNode >
20
- {
21
- this
22
- } ;
23
- foreach ( var child in this )
24
- {
25
- result . AddRange ( child . GetAllNodes ( ) ) ;
26
- }
33
+ List < AbstractSyntaxTreeNode > result = [ this ] ;
34
+ for ( var index = 0 ; index < Children . Count ; index ++ )
35
+ result . AddRange ( Children [ index ] . GetAllNodes ( ) ) ;
27
36
28
37
return result ;
29
38
}
30
39
31
40
public bool ChildOf < T > ( ) where T : AbstractSyntaxTreeNode
32
41
{
33
42
var parent = Parent ;
34
- while ( parent != null )
43
+ while ( ! parent . IsRoot )
35
44
{
36
45
if ( parent is T )
37
46
{
@@ -44,11 +53,6 @@ public bool ChildOf<T>() where T : AbstractSyntaxTreeNode
44
53
return false ;
45
54
}
46
55
47
- public abstract IEnumerator < AbstractSyntaxTreeNode > GetEnumerator ( ) ;
48
-
49
- IEnumerator IEnumerable . GetEnumerator ( ) =>
50
- GetEnumerator ( ) ;
51
-
52
56
public virtual TReturn Accept < TReturn > ( IVisitor < AbstractSyntaxTreeNode , TReturn > visitor ) =>
53
57
visitor . DefaultVisit ;
54
58
0 commit comments