Skip to content

Commit

Permalink
#59 - переход на IReadOnlyList (#70)
Browse files Browse the repository at this point in the history
* #31 - change nullability of Parent

* #31 unbound ast node from segment

* #59 - переход на IReadOnlyList
  • Loading branch information
Stepami authored Jul 26, 2024
1 parent 884deae commit ca57c69
Show file tree
Hide file tree
Showing 55 changed files with 256 additions and 371 deletions.
3 changes: 3 additions & 0 deletions src/HydraScript.Lib/FrontEnd/GetTokens/Data/Token.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public record Segment(Coordinates Start, Coordinates End)

public static Segment operator +(Segment left, Segment right) =>
new(left.Start, right.End);

public static implicit operator string(Segment segment) =>
segment.ToString();
}

[ExcludeFromCodeCoverage]
Expand Down
5 changes: 4 additions & 1 deletion src/HydraScript.Lib/FrontEnd/TopDownParse/Impl/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,10 @@ private Expression ConditionalExpression()
var consequent = Expression();
Expect("Colon");
var alternate = Expression();
return new ConditionalExpression(test, consequent, alternate);
return new ConditionalExpression(test, consequent, alternate)
{
Segment = consequent.Segment + alternate.Segment
};
}

return test;
Expand Down
40 changes: 22 additions & 18 deletions src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs
Original file line number Diff line number Diff line change
@@ -1,37 +1,46 @@
using System.Collections;
using HydraScript.Lib.FrontEnd.GetTokens.Data;
using HydraScript.Lib.IR.CheckSemantics.Variables;

namespace HydraScript.Lib.IR.Ast;

public abstract class AbstractSyntaxTreeNode :
IEnumerable<AbstractSyntaxTreeNode>,
IReadOnlyList<AbstractSyntaxTreeNode>,
IVisitable<AbstractSyntaxTreeNode>
{
public AbstractSyntaxTreeNode? Parent { get; set; }
public AbstractSyntaxTreeNode Parent { get; set; } = default!;

protected virtual bool IsRoot => false;

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

public Segment Segment { get; init; } = default!;
public string Segment { get; init; } = string.Empty;

protected virtual IReadOnlyList<AbstractSyntaxTreeNode> Children { get; } = [];

public IEnumerator<AbstractSyntaxTreeNode> GetEnumerator() =>
Children.ToList().GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() =>
GetEnumerator();

public int Count => Children.Count;

public AbstractSyntaxTreeNode this[int index] =>
Children[index];

internal List<AbstractSyntaxTreeNode> GetAllNodes()
{
var result = new List<AbstractSyntaxTreeNode>
{
this
};
foreach (var child in this)
{
result.AddRange(child.GetAllNodes());
}
List<AbstractSyntaxTreeNode> result = [this];
for (var index = 0; index < Children.Count; index++)
result.AddRange(Children[index].GetAllNodes());

return result;
}

public bool ChildOf<T>() where T : AbstractSyntaxTreeNode
{
var parent = Parent;
while (parent != null)
while (!parent.IsRoot)
{
if (parent is T)
{
Expand All @@ -44,11 +53,6 @@ public bool ChildOf<T>() where T : AbstractSyntaxTreeNode
return false;
}

public abstract IEnumerator<AbstractSyntaxTreeNode> GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() =>
GetEnumerator();

public virtual TReturn Accept<TReturn>(IVisitor<AbstractSyntaxTreeNode, TReturn> visitor) =>
visitor.DefaultVisit;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class FunctionDeclaration : AfterTypesAreLoadedDeclaration
{
private IReadOnlyCollection<ReturnStatement>? _returnStatements;
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children => [Statements];

public IdentifierReference Name { get; }
public TypeValue ReturnTypeValue { get; }
Expand All @@ -25,25 +25,18 @@ public FunctionDeclaration(

Statements = blockStatement;
Statements.Parent = this;
}

public bool HasReturnStatement()
{
_returnStatements ??= GetReturnStatements();
return _returnStatements.Count > 0;
}

public IReadOnlyCollection<ReturnStatement> GetReturnStatements() =>
_returnStatements ??= Statements
ReturnStatements = Statements
.GetAllNodes()
.OfType<ReturnStatement>()
.ToArray();

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Statements;
}

public bool HasReturnStatement() =>
ReturnStatements.Count > 0;

public IReadOnlyCollection<ReturnStatement> ReturnStatements { get; }

protected override string NodeRepresentation() =>
"function " + Name;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class LexicalDeclaration(bool readOnly) : AfterTypesAreLoadedDeclaration
{
private readonly List<AssignmentExpression> _assignments = [];
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
_assignments;

public bool ReadOnly { get; } = readOnly;
public List<AssignmentExpression> Assignments { get; } = [];
public IReadOnlyList<AssignmentExpression> Assignments =>
_assignments;

public void AddAssignment(AssignmentExpression assignment)
{
assignment.Parent = this;
Assignments.Add(assignment);
_assignments.Add(assignment);
}

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator() =>
Assignments.GetEnumerator();

protected override string NodeRepresentation() =>
ReadOnly ? "const" : "let";
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,13 @@
namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations;

[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class TypeDeclaration : Declaration
public partial class TypeDeclaration(IdentifierReference typeId, TypeValue typeValue) : Declaration
{
private readonly TypeValue _typeValue;
public IdentifierReference TypeId { get; }

public TypeDeclaration(IdentifierReference typeId, TypeValue typeValue)
{
TypeId = typeId;
_typeValue = typeValue;
}
public IdentifierReference TypeId { get; } = typeId;

public Type BuildType() =>
_typeValue.BuildType(SymbolTable);

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield break;
}
typeValue.BuildType(SymbolTable);

protected override string NodeRepresentation() =>
$"type {TypeId.Name} = {_typeValue}";
$"type {TypeId.Name} = {typeValue}";
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class DotAccess : AccessExpression
{
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
HasNext() ? [Property, Next!] : [Property];

public IdentifierReference Property { get; }

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

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Property;
if (HasNext())
{
yield return Next!;
}
}

protected override string NodeRepresentation() => ".";
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class IndexAccess : AccessExpression
{
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
HasNext() ? [Index, Next!] : [Index];

public Expression Index { get; }

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

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Index;
if (HasNext())
{
yield return Next!;
}
}

protected override string NodeRepresentation() => "[]";
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class AssignmentExpression : Expression
{
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
[Destination, Source];

public LeftHandSideExpression Destination { get; }
public Expression Source { get; }
public TypeValue? DestinationType { get; }
Expand All @@ -23,11 +26,5 @@ public AssignmentExpression(
DestinationType = destinationType;
}

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Destination;
yield return Source;
}

protected override string NodeRepresentation() => "=";
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class BinaryExpression : Expression
{
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
[Left, Right];

public Expression Left { get; }
public string Operator { get; }
public Expression Right { get; }
Expand All @@ -18,11 +21,5 @@ public BinaryExpression(Expression left, string @operator, Expression right)
Right.Parent = this;
}

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Left;
yield return Right;
}

protected override string NodeRepresentation() => Operator;
}
27 changes: 10 additions & 17 deletions src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,26 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class CallExpression : LeftHandSideExpression
{
private readonly List<Expression> _parameters;

protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
[Member, .._parameters];

public MemberExpression Member { get; }
public List<Expression> Parameters { get; }
public IReadOnlyList<Expression> Parameters => _parameters;

public CallExpression(MemberExpression member, IEnumerable<Expression> expressions)
{
Member = member;
Member.Parent = this;

Parameters = new List<Expression>(expressions);
Parameters.ForEach(expr => expr.Parent = this);
_parameters = new List<Expression>(expressions);
_parameters.ForEach(expr => expr.Parent = this);
}

public override IdentifierReference Id =>
Member.Id;

public override bool Empty() =>
Member.Empty();
public override IdentifierReference Id => Member.Id;

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
var nodes = new List<AbstractSyntaxTreeNode>
{
Member
};
nodes.AddRange(Parameters);
return nodes.GetEnumerator();
}
public override bool Empty() => Member.Empty();

protected override string NodeRepresentation() => "()";
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class CastAsExpression : Expression
{
protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
[Expression];

public Expression Expression { get; }
public TypeValue Cast { get; }

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

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator()
{
yield return Expression;
}

protected override string NodeRepresentation() => $"as {Cast}";
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.ComplexLiterals;
[AutoVisitable<AbstractSyntaxTreeNode>]
public partial class ArrayLiteral : ComplexLiteral
{
public List<Expression> Expressions { get; }
private readonly List<Expression> _expressions;

protected override IReadOnlyList<AbstractSyntaxTreeNode> Children =>
_expressions;

public IReadOnlyList<Expression> Expressions => _expressions;

public ArrayLiteral(IEnumerable<Expression> expressions)
{
Expressions = new List<Expression>(expressions);
Expressions.ForEach(expr => expr.Parent = this);
_expressions = new List<Expression>(expressions);
_expressions.ForEach(expr => expr.Parent = this);
}

public override IEnumerator<AbstractSyntaxTreeNode> GetEnumerator() =>
Expressions.GetEnumerator();

protected override string NodeRepresentation() => "[]";
}
Loading

0 comments on commit ca57c69

Please sign in to comment.