Skip to content

Commit ca57c69

Browse files
authored
#59 - переход на IReadOnlyList (#70)
* #31 - change nullability of Parent * #31 unbound ast node from segment * #59 - переход на IReadOnlyList
1 parent 884deae commit ca57c69

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+256
-371
lines changed

src/HydraScript.Lib/FrontEnd/GetTokens/Data/Token.cs

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public record Segment(Coordinates Start, Coordinates End)
3131

3232
public static Segment operator +(Segment left, Segment right) =>
3333
new(left.Start, right.End);
34+
35+
public static implicit operator string(Segment segment) =>
36+
segment.ToString();
3437
}
3538

3639
[ExcludeFromCodeCoverage]

src/HydraScript.Lib/FrontEnd/TopDownParse/Impl/Parser.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,10 @@ private Expression ConditionalExpression()
492492
var consequent = Expression();
493493
Expect("Colon");
494494
var alternate = Expression();
495-
return new ConditionalExpression(test, consequent, alternate);
495+
return new ConditionalExpression(test, consequent, alternate)
496+
{
497+
Segment = consequent.Segment + alternate.Segment
498+
};
496499
}
497500

498501
return test;

src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs

+22-18
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,46 @@
11
using System.Collections;
2-
using HydraScript.Lib.FrontEnd.GetTokens.Data;
32
using HydraScript.Lib.IR.CheckSemantics.Variables;
43

54
namespace HydraScript.Lib.IR.Ast;
65

76
public abstract class AbstractSyntaxTreeNode :
8-
IEnumerable<AbstractSyntaxTreeNode>,
7+
IReadOnlyList<AbstractSyntaxTreeNode>,
98
IVisitable<AbstractSyntaxTreeNode>
109
{
11-
public AbstractSyntaxTreeNode? Parent { get; set; }
10+
public AbstractSyntaxTreeNode Parent { get; set; } = default!;
11+
12+
protected virtual bool IsRoot => false;
1213

1314
public SymbolTable SymbolTable { get; set; } = default!;
1415

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];
1630

1731
internal List<AbstractSyntaxTreeNode> GetAllNodes()
1832
{
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());
2736

2837
return result;
2938
}
3039

3140
public bool ChildOf<T>() where T : AbstractSyntaxTreeNode
3241
{
3342
var parent = Parent;
34-
while (parent != null)
43+
while (!parent.IsRoot)
3544
{
3645
if (parent is T)
3746
{
@@ -44,11 +53,6 @@ public bool ChildOf<T>() where T : AbstractSyntaxTreeNode
4453
return false;
4554
}
4655

47-
public abstract IEnumerator<AbstractSyntaxTreeNode> GetEnumerator();
48-
49-
IEnumerator IEnumerable.GetEnumerator() =>
50-
GetEnumerator();
51-
5256
public virtual TReturn Accept<TReturn>(IVisitor<AbstractSyntaxTreeNode, TReturn> visitor) =>
5357
visitor.DefaultVisit;
5458

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/FunctionDeclaration.cs

+7-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded;
66
[AutoVisitable<AbstractSyntaxTreeNode>]
77
public partial class FunctionDeclaration : AfterTypesAreLoadedDeclaration
88
{
9-
private IReadOnlyCollection<ReturnStatement>? _returnStatements;
9+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children => [Statements];
1010

1111
public IdentifierReference Name { get; }
1212
public TypeValue ReturnTypeValue { get; }
@@ -25,25 +25,18 @@ public FunctionDeclaration(
2525

2626
Statements = blockStatement;
2727
Statements.Parent = this;
28-
}
29-
30-
public bool HasReturnStatement()
31-
{
32-
_returnStatements ??= GetReturnStatements();
33-
return _returnStatements.Count > 0;
34-
}
3528

36-
public IReadOnlyCollection<ReturnStatement> GetReturnStatements() =>
37-
_returnStatements ??= Statements
29+
ReturnStatements = Statements
3830
.GetAllNodes()
3931
.OfType<ReturnStatement>()
4032
.ToArray();
41-
42-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
43-
{
44-
yield return Statements;
4533
}
4634

35+
public bool HasReturnStatement() =>
36+
ReturnStatements.Count > 0;
37+
38+
public IReadOnlyCollection<ReturnStatement> ReturnStatements { get; }
39+
4740
protected override string NodeRepresentation() =>
4841
"function " + Name;
4942
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/LexicalDeclaration.cs

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded;
55
[AutoVisitable<AbstractSyntaxTreeNode>]
66
public partial class LexicalDeclaration(bool readOnly) : AfterTypesAreLoadedDeclaration
77
{
8+
private readonly List<AssignmentExpression> _assignments = [];
9+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
10+
_assignments;
11+
812
public bool ReadOnly { get; } = readOnly;
9-
public List<AssignmentExpression> Assignments { get; } = [];
13+
public IReadOnlyList<AssignmentExpression> Assignments =>
14+
_assignments;
1015

1116
public void AddAssignment(AssignmentExpression assignment)
1217
{
1318
assignment.Parent = this;
14-
Assignments.Add(assignment);
19+
_assignments.Add(assignment);
1520
}
1621

17-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator() =>
18-
Assignments.GetEnumerator();
19-
2022
protected override string NodeRepresentation() =>
2123
ReadOnly ? "const" : "let";
2224
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeDeclaration.cs

+4-16
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,13 @@
33
namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations;
44

55
[AutoVisitable<AbstractSyntaxTreeNode>]
6-
public partial class TypeDeclaration : Declaration
6+
public partial class TypeDeclaration(IdentifierReference typeId, TypeValue typeValue) : Declaration
77
{
8-
private readonly TypeValue _typeValue;
9-
public IdentifierReference TypeId { get; }
10-
11-
public TypeDeclaration(IdentifierReference typeId, TypeValue typeValue)
12-
{
13-
TypeId = typeId;
14-
_typeValue = typeValue;
15-
}
8+
public IdentifierReference TypeId { get; } = typeId;
169

1710
public Type BuildType() =>
18-
_typeValue.BuildType(SymbolTable);
19-
20-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
21-
{
22-
yield break;
23-
}
11+
typeValue.BuildType(SymbolTable);
2412

2513
protected override string NodeRepresentation() =>
26-
$"type {TypeId.Name} = {_typeValue}";
14+
$"type {TypeId.Name} = {typeValue}";
2715
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/DotAccess.cs

+3-9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions;
55
[AutoVisitable<AbstractSyntaxTreeNode>]
66
public partial class DotAccess : AccessExpression
77
{
8+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
9+
HasNext() ? [Property, Next!] : [Property];
10+
811
public IdentifierReference Property { get; }
912

1013
public DotAccess(IdentifierReference property, AccessExpression? prev = null) : base(prev)
@@ -13,14 +16,5 @@ public DotAccess(IdentifierReference property, AccessExpression? prev = null) :
1316
Property.Parent = this;
1417
}
1518

16-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
17-
{
18-
yield return Property;
19-
if (HasNext())
20-
{
21-
yield return Next!;
22-
}
23-
}
24-
2519
protected override string NodeRepresentation() => ".";
2620
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/IndexAccess.cs

+3-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions;
33
[AutoVisitable<AbstractSyntaxTreeNode>]
44
public partial class IndexAccess : AccessExpression
55
{
6+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
7+
HasNext() ? [Index, Next!] : [Index];
8+
69
public Expression Index { get; }
710

811
public IndexAccess(Expression index, AccessExpression? prev = null) : base(prev)
@@ -11,14 +14,5 @@ public IndexAccess(Expression index, AccessExpression? prev = null) : base(prev)
1114
Index.Parent = this;
1215
}
1316

14-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
15-
{
16-
yield return Index;
17-
if (HasNext())
18-
{
19-
yield return Next!;
20-
}
21-
}
22-
2317
protected override string NodeRepresentation() => "[]";
2418
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AssignmentExpression.cs

+3-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
55
[AutoVisitable<AbstractSyntaxTreeNode>]
66
public partial class AssignmentExpression : Expression
77
{
8+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
9+
[Destination, Source];
10+
811
public LeftHandSideExpression Destination { get; }
912
public Expression Source { get; }
1013
public TypeValue? DestinationType { get; }
@@ -23,11 +26,5 @@ public AssignmentExpression(
2326
DestinationType = destinationType;
2427
}
2528

26-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
27-
{
28-
yield return Destination;
29-
yield return Source;
30-
}
31-
3229
protected override string NodeRepresentation() => "=";
3330
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/BinaryExpression.cs

+3-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
33
[AutoVisitable<AbstractSyntaxTreeNode>]
44
public partial class BinaryExpression : Expression
55
{
6+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
7+
[Left, Right];
8+
69
public Expression Left { get; }
710
public string Operator { get; }
811
public Expression Right { get; }
@@ -18,11 +21,5 @@ public BinaryExpression(Expression left, string @operator, Expression right)
1821
Right.Parent = this;
1922
}
2023

21-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
22-
{
23-
yield return Left;
24-
yield return Right;
25-
}
26-
2724
protected override string NodeRepresentation() => Operator;
2825
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs

+10-17
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,26 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
55
[AutoVisitable<AbstractSyntaxTreeNode>]
66
public partial class CallExpression : LeftHandSideExpression
77
{
8+
private readonly List<Expression> _parameters;
9+
10+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
11+
[Member, .._parameters];
12+
813
public MemberExpression Member { get; }
9-
public List<Expression> Parameters { get; }
14+
public IReadOnlyList<Expression> Parameters => _parameters;
1015

1116
public CallExpression(MemberExpression member, IEnumerable<Expression> expressions)
1217
{
1318
Member = member;
1419
Member.Parent = this;
1520

16-
Parameters = new List<Expression>(expressions);
17-
Parameters.ForEach(expr => expr.Parent = this);
21+
_parameters = new List<Expression>(expressions);
22+
_parameters.ForEach(expr => expr.Parent = this);
1823
}
1924

20-
public override IdentifierReference Id =>
21-
Member.Id;
22-
23-
public override bool Empty() =>
24-
Member.Empty();
25+
public override IdentifierReference Id => Member.Id;
2526

26-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
27-
{
28-
var nodes = new List<AbstractSyntaxTreeNode>
29-
{
30-
Member
31-
};
32-
nodes.AddRange(Parameters);
33-
return nodes.GetEnumerator();
34-
}
27+
public override bool Empty() => Member.Empty();
3528

3629
protected override string NodeRepresentation() => "()";
3730
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CastAsExpression.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
55
[AutoVisitable<AbstractSyntaxTreeNode>]
66
public partial class CastAsExpression : Expression
77
{
8+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
9+
[Expression];
10+
811
public Expression Expression { get; }
912
public TypeValue Cast { get; }
1013

@@ -16,10 +19,5 @@ public CastAsExpression(Expression expression, TypeValue cast)
1619
Cast = cast;
1720
}
1821

19-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
20-
{
21-
yield return Expression;
22-
}
23-
2422
protected override string NodeRepresentation() => $"as {Cast}";
2523
}

src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ArrayLiteral.cs

+8-6
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.ComplexLiterals;
33
[AutoVisitable<AbstractSyntaxTreeNode>]
44
public partial class ArrayLiteral : ComplexLiteral
55
{
6-
public List<Expression> Expressions { get; }
6+
private readonly List<Expression> _expressions;
7+
8+
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
9+
_expressions;
10+
11+
public IReadOnlyList<Expression> Expressions => _expressions;
712

813
public ArrayLiteral(IEnumerable<Expression> expressions)
914
{
10-
Expressions = new List<Expression>(expressions);
11-
Expressions.ForEach(expr => expr.Parent = this);
15+
_expressions = new List<Expression>(expressions);
16+
_expressions.ForEach(expr => expr.Parent = this);
1217
}
1318

14-
public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator() =>
15-
Expressions.GetEnumerator();
16-
1719
protected override string NodeRepresentation() => "[]";
1820
}

0 commit comments

Comments
 (0)