From d8e8c4436846c8112ac52492d238539808f63935 Mon Sep 17 00:00:00 2001 From: Stepami Date: Fri, 26 Jul 2024 15:30:08 +0300 Subject: [PATCH] #31 - visitor.NET upgrade --- src/HydraScript.Lib/HydraScript.Lib.csproj | 3 +- .../IR/Ast/AbstractSyntaxTreeNode.cs | 31 ++------ .../IR/Ast/Impl/AbstractSyntaxTree.cs | 10 +-- .../AfterTypesAreLoadedDeclaration.cs | 5 +- .../FunctionDeclaration.cs | 18 +---- .../AfterTypesAreLoaded/LexicalDeclaration.cs | 25 +------ .../Nodes/Declarations/TypeDeclaration.cs | 11 +-- .../Ast/Impl/Nodes/Declarations/TypeValue.cs | 17 ++--- .../AccessExpressions/AccessExpression.cs | 5 +- .../AccessExpressions/DotAccess.cs | 12 +-- .../AccessExpressions/IndexAccess.cs | 13 +--- .../Nodes/Expressions/AssignmentExpression.cs | 12 +-- .../Nodes/Expressions/BinaryExpression.cs | 13 +--- .../Impl/Nodes/Expressions/CallExpression.cs | 12 +-- .../Nodes/Expressions/CastAsExpression.cs | 12 +-- .../ComplexLiterals/ArrayLiteral.cs | 13 +--- .../ComplexLiterals/ObjectLiteral.cs | 13 +--- .../Expressions/ComplexLiterals/Property.cs | 8 +- .../Expressions/ConditionalExpression.cs | 13 +--- .../Ast/Impl/Nodes/Expressions/Expression.cs | 12 +-- .../Nodes/Expressions/MemberExpression.cs | 12 +-- .../PrimaryExpressions/IdentifierReference.cs | 7 +- .../PrimaryExpressions/ImplicitLiteral.cs | 7 +- .../Expressions/PrimaryExpressions/Literal.cs | 11 +-- .../PrimaryExpressions/PrimaryExpression.cs | 8 +- .../Impl/Nodes/Expressions/UnaryExpression.cs | 13 +--- .../IR/Ast/Impl/Nodes/ScriptBody.cs | 19 +---- .../IR/Ast/Impl/Nodes/StatementListItem.cs | 6 +- .../Impl/Nodes/Statements/BlockStatement.cs | 16 +--- .../Nodes/Statements/ExpressionStatement.cs | 13 +--- .../Ast/Impl/Nodes/Statements/IfStatement.cs | 13 +--- .../Nodes/Statements/InsideStatementJump.cs | 20 +---- .../Impl/Nodes/Statements/ReturnStatement.cs | 13 +--- .../Impl/Nodes/Statements/WhileStatement.cs | 13 +--- .../Visitors/ExpressionInstructionProvider.cs | 40 +++++----- .../IR/Ast/Visitors/InstructionProvider.cs | 43 ++++++----- .../Visitors/DeclarationVisitor.cs | 13 ++-- .../Visitors/SemanticChecker.cs | 75 ++++++++++--------- .../Visitors/SymbolTableInitializer.cs | 19 +++-- .../Visitors/TypeSystemLoader.cs | 13 ++-- 40 files changed, 191 insertions(+), 441 deletions(-) diff --git a/src/HydraScript.Lib/HydraScript.Lib.csproj b/src/HydraScript.Lib/HydraScript.Lib.csproj index 49bd9e07..83689500 100644 --- a/src/HydraScript.Lib/HydraScript.Lib.csproj +++ b/src/HydraScript.Lib/HydraScript.Lib.csproj @@ -8,7 +8,8 @@ - + + diff --git a/src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs b/src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs index 7a815441..b4ef320e 100644 --- a/src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs +++ b/src/HydraScript.Lib/IR/Ast/AbstractSyntaxTreeNode.cs @@ -1,18 +1,12 @@ using System.Collections; -using HydraScript.Lib.BackEnd; using HydraScript.Lib.FrontEnd.GetTokens.Data; -using HydraScript.Lib.IR.Ast.Visitors; using HydraScript.Lib.IR.CheckSemantics.Variables; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast; -public abstract class AbstractSyntaxTreeNode : IEnumerable, - IVisitable, - IVisitable, - IVisitable, - IVisitable, - IVisitable +public abstract class AbstractSyntaxTreeNode : + IEnumerable, + IVisitable { public AbstractSyntaxTreeNode? Parent { get; set; } @@ -55,23 +49,8 @@ public bool ChildOf() where T : AbstractSyntaxTreeNode IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - #region Visitors - - public virtual Unit Accept(SymbolTableInitializer visitor) => - visitor.Visit(this); - - public virtual Unit Accept(TypeSystemLoader visitor) => - visitor.Visit(this); - - public virtual Unit Accept(DeclarationVisitor visitor) => - visitor.Visit(this); - - public virtual Type Accept(SemanticChecker visitor) => - "undefined"; - - public abstract AddressedInstructions Accept(InstructionProvider visitor); - - #endregion + public virtual TReturn Accept(IVisitor visitor) => + visitor.DefaultVisit; protected abstract string NodeRepresentation(); diff --git a/src/HydraScript.Lib/IR/Ast/Impl/AbstractSyntaxTree.cs b/src/HydraScript.Lib/IR/Ast/Impl/AbstractSyntaxTree.cs index 3d36f9d0..011dae26 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/AbstractSyntaxTree.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/AbstractSyntaxTree.cs @@ -10,12 +10,12 @@ public class AbstractSyntaxTree : IAbstractSyntaxTree { private readonly AbstractSyntaxTreeNode _root; - private readonly SymbolTableInitializer _symbolTableInitializer; - private readonly TypeSystemLoader _typeSystemLoader; - private readonly DeclarationVisitor _declarationVisitor; + private readonly IVisitor _symbolTableInitializer; + private readonly IVisitor _typeSystemLoader; + private readonly IVisitor _declarationVisitor; - private readonly SemanticChecker _semanticChecker; - private readonly InstructionProvider _instructionProvider; + private readonly IVisitor _semanticChecker; + private readonly IVisitor _instructionProvider; public AbstractSyntaxTree(AbstractSyntaxTreeNode root) { diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/AfterTypesAreLoadedDeclaration.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/AfterTypesAreLoadedDeclaration.cs index 4feb4636..57261a54 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/AfterTypesAreLoadedDeclaration.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/AfterTypesAreLoadedDeclaration.cs @@ -1,8 +1,7 @@ -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded; public abstract class AfterTypesAreLoadedDeclaration : Declaration { - public abstract override Unit Accept(DeclarationVisitor visitor); + public abstract override TReturn Accept( + IVisitor visitor); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/FunctionDeclaration.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/FunctionDeclaration.cs index ceb2c634..947e7ced 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/FunctionDeclaration.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/FunctionDeclaration.cs @@ -1,12 +1,10 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; using HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded; -public class FunctionDeclaration : AfterTypesAreLoadedDeclaration +[AutoVisitable] +public partial class FunctionDeclaration : AfterTypesAreLoadedDeclaration { private IReadOnlyCollection? _returnStatements; @@ -48,16 +46,4 @@ public override IEnumerator GetEnumerator() protected override string NodeRepresentation() => "function " + Name; - - public override Unit Accept(SymbolTableInitializer visitor) => - visitor.Visit(this); - - public override Unit Accept(DeclarationVisitor visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/LexicalDeclaration.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/LexicalDeclaration.cs index 35fe9bea..4374f6d9 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/LexicalDeclaration.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/AfterTypesAreLoaded/LexicalDeclaration.cs @@ -1,20 +1,12 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded; -public class LexicalDeclaration : AfterTypesAreLoadedDeclaration +[AutoVisitable] +public partial class LexicalDeclaration(bool readOnly) : AfterTypesAreLoadedDeclaration { - public bool ReadOnly { get; } - public List Assignments { get; } - - public LexicalDeclaration(bool readOnly) - { - ReadOnly = readOnly; - Assignments = new(); - } + public bool ReadOnly { get; } = readOnly; + public List Assignments { get; } = []; public void AddAssignment(AssignmentExpression assignment) { @@ -27,13 +19,4 @@ public override IEnumerator GetEnumerator() => protected override string NodeRepresentation() => ReadOnly ? "const" : "let"; - - public override Unit Accept(DeclarationVisitor visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeDeclaration.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeDeclaration.cs index bdb8a300..aef76c8e 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeDeclaration.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeDeclaration.cs @@ -1,11 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations; -public class TypeDeclaration : Declaration +[AutoVisitable] +public partial class TypeDeclaration : Declaration { private readonly TypeValue _typeValue; public IdentifierReference TypeId { get; } @@ -26,9 +24,4 @@ public override IEnumerator GetEnumerator() protected override string NodeRepresentation() => $"type {TypeId.Name} = {_typeValue}"; - - public override AddressedInstructions Accept(InstructionProvider visitor) => new(); - - public override Unit Accept(TypeSystemLoader visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeValue.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeValue.cs index bea24412..9f5c69aa 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeValue.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Declarations/TypeValue.cs @@ -11,9 +11,7 @@ public abstract record TypeValue public abstract Type BuildType(SymbolTable symbolTable); } -public record TypeIdentValue( - IdentifierReference TypeId -) : TypeValue +public record TypeIdentValue(IdentifierReference TypeId) : TypeValue { public override Type BuildType(SymbolTable symbolTable) => symbolTable.FindSymbol(TypeId)?.Type ?? @@ -22,9 +20,7 @@ public override Type BuildType(SymbolTable symbolTable) => public override string ToString() => TypeId; } -public record ArrayTypeValue( - TypeValue TypeValue -) : TypeValue +public record ArrayTypeValue(TypeValue TypeValue) : TypeValue { public override Type BuildType(SymbolTable symbolTable) => new ArrayType(TypeValue.BuildType(symbolTable)); @@ -32,9 +28,7 @@ public override Type BuildType(SymbolTable symbolTable) => public override string ToString() => $"{TypeValue}[]"; } -public record NullableTypeValue( - TypeValue TypeValue -) : TypeValue +public record NullableTypeValue(TypeValue TypeValue) : TypeValue { public override Type BuildType(SymbolTable symbolTable) => new NullableType(TypeValue.BuildType(symbolTable)); @@ -48,11 +42,10 @@ public record PropertyTypeValue( { public override string ToString() => $"{Key}: {TypeValue}"; -}; +} public record ObjectTypeValue( - IEnumerable Properties -) : TypeValue + IEnumerable Properties) : TypeValue { public override Type BuildType(SymbolTable symbolTable) => new ObjectType( diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/AccessExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/AccessExpression.cs index 31e3d4dc..8e2c8185 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/AccessExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/AccessExpression.cs @@ -1,5 +1,3 @@ -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions; public abstract class AccessExpression : Expression @@ -26,5 +24,6 @@ public bool HasNext() => public bool HasPrev() => Prev is not null; - public abstract override Type Accept(SemanticChecker visitor); + public abstract override TReturn Accept( + IVisitor visitor); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/DotAccess.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/DotAccess.cs index 36be5133..bb9094ac 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/DotAccess.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/DotAccess.cs @@ -1,11 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions; -public class DotAccess : AccessExpression +[AutoVisitable] +public partial class DotAccess : AccessExpression { public IdentifierReference Property { get; } @@ -25,10 +23,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "."; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/IndexAccess.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/IndexAccess.cs index 08e6d4c1..4216f2b6 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/IndexAccess.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AccessExpressions/IndexAccess.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions; -public class IndexAccess : AccessExpression +[AutoVisitable] +public partial class IndexAccess : AccessExpression { public Expression Index { get; } @@ -24,10 +21,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "[]"; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AssignmentExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AssignmentExpression.cs index f677e4aa..d41f5f2d 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AssignmentExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/AssignmentExpression.cs @@ -1,11 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class AssignmentExpression : Expression +[AutoVisitable] +public partial class AssignmentExpression : Expression { public LeftHandSideExpression Destination { get; } public Expression Source { get; } @@ -32,10 +30,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "="; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/BinaryExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/BinaryExpression.cs index 07be9f14..bbebf623 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/BinaryExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/BinaryExpression.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class BinaryExpression : Expression +[AutoVisitable] +public partial class BinaryExpression : Expression { public Expression Left { get; } public string Operator { get; } @@ -28,10 +25,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => Operator; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs index 8dacc95c..dca0bb29 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CallExpression.cs @@ -1,11 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class CallExpression : LeftHandSideExpression +[AutoVisitable] +public partial class CallExpression : LeftHandSideExpression { public MemberExpression Member { get; } public List Parameters { get; } @@ -36,10 +34,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "()"; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CastAsExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CastAsExpression.cs index 4ea335d6..4cf1e118 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CastAsExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/CastAsExpression.cs @@ -1,11 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class CastAsExpression : Expression +[AutoVisitable] +public partial class CastAsExpression : Expression { public Expression Expression { get; } public TypeValue Cast { get; } @@ -24,10 +22,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => $"as {Cast}"; - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ArrayLiteral.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ArrayLiteral.cs index 29d7c60d..2b301e6c 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ArrayLiteral.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ArrayLiteral.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.ComplexLiterals; -public class ArrayLiteral : ComplexLiteral +[AutoVisitable] +public partial class ArrayLiteral : ComplexLiteral { public List Expressions { get; } @@ -18,10 +15,4 @@ public override IEnumerator GetEnumerator() => Expressions.GetEnumerator(); protected override string NodeRepresentation() => "[]"; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ObjectLiteral.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ObjectLiteral.cs index be97943d..02a88dc0 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ObjectLiteral.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/ObjectLiteral.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.ComplexLiterals; -public class ObjectLiteral : ComplexLiteral +[AutoVisitable] +public partial class ObjectLiteral : ComplexLiteral { public List Properties { get; } @@ -18,10 +15,4 @@ public override IEnumerator GetEnumerator() => Properties.GetEnumerator(); protected override string NodeRepresentation() => "{}"; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/Property.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/Property.cs index 2afcf034..adbf2691 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/Property.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ComplexLiterals/Property.cs @@ -1,10 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -using HydraScript.Lib.IR.Ast.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.ComplexLiterals; -public class Property : Expression +[AutoVisitable] +public partial class Property : Expression { public IdentifierReference Id { get; } public Expression Expression { get; } @@ -34,7 +33,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => ":"; - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ConditionalExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ConditionalExpression.cs index 620de68b..0a0fafc6 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ConditionalExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/ConditionalExpression.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class ConditionalExpression : Expression +[AutoVisitable] +public partial class ConditionalExpression : Expression { public Expression Test { get; } public Expression Consequent { get; } @@ -29,10 +26,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "?:"; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/Expression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/Expression.cs index 9da02668..613ba9fa 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/Expression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/Expression.cs @@ -1,13 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public abstract class Expression : AbstractSyntaxTreeNode, - IVisitable +public abstract class Expression : AbstractSyntaxTreeNode { - public abstract AddressedInstructions Accept(ExpressionInstructionProvider visitor); - - public sealed override AddressedInstructions Accept(InstructionProvider visitor) => - throw new NotSupportedException(); + public abstract override TReturn Accept( + IVisitor visitor); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/MemberExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/MemberExpression.cs index 9b7fe8f8..55206062 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/MemberExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/MemberExpression.cs @@ -1,12 +1,10 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.AccessExpressions; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class MemberExpression : LeftHandSideExpression +[AutoVisitable] +public partial class MemberExpression : LeftHandSideExpression { private readonly IdentifierReference _identifierReference; @@ -53,10 +51,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => nameof(MemberExpression); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/IdentifierReference.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/IdentifierReference.cs index 07bc31bb..cc61ae9f 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/IdentifierReference.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/IdentifierReference.cs @@ -1,9 +1,9 @@ using HydraScript.Lib.BackEnd.Values; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -public class IdentifierReference(string name) : PrimaryExpression +[AutoVisitable] +public partial class IdentifierReference(string name) : PrimaryExpression { public string Name { get; } = name; @@ -11,9 +11,6 @@ public class IdentifierReference(string name) : PrimaryExpression public override IValue ToValue() => new Name(Name); - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - public static implicit operator string(IdentifierReference identifierReference) => identifierReference.Name; } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/ImplicitLiteral.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/ImplicitLiteral.cs index 42f26320..7d3d6df2 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/ImplicitLiteral.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/ImplicitLiteral.cs @@ -1,10 +1,10 @@ using HydraScript.Lib.BackEnd.Values; using HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -public class ImplicitLiteral(TypeValue typeValue) : PrimaryExpression +[AutoVisitable] +public partial class ImplicitLiteral(TypeValue typeValue) : PrimaryExpression { public TypeValue TypeValue { get; } = typeValue; public object? ComputedDefaultValue { private get; set; } @@ -18,7 +18,4 @@ public override IValue ToValue() => ComputedDefaultValue is null ? "null" : ComputedDefaultValue.ToString()!); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/Literal.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/Literal.cs index b91ae3e4..358f31a6 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/Literal.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/Literal.cs @@ -1,13 +1,13 @@ using HydraScript.Lib.BackEnd.Values; using HydraScript.Lib.FrontEnd.GetTokens.Data; using HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations; -using HydraScript.Lib.IR.CheckSemantics.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -public class Literal : PrimaryExpression +[AutoVisitable] +public partial class Literal : PrimaryExpression { - private readonly TypeValue _type; + public TypeValue Type { get; } private readonly object? _value; private readonly string _label; @@ -17,7 +17,7 @@ public Literal( Segment segment, string? label = null) { - _type = type; + Type = type; _label = (label ?? value?.ToString())!; _value = value; Segment = segment; @@ -27,7 +27,4 @@ public Literal( public override IValue ToValue() => new Constant(_value, _label); - - public override Type Accept(SemanticChecker visitor) => - _type.BuildType(Parent!.SymbolTable); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/PrimaryExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/PrimaryExpression.cs index 1ba91197..59b23fb6 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/PrimaryExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/PrimaryExpressions/PrimaryExpression.cs @@ -1,10 +1,9 @@ -using HydraScript.Lib.BackEnd; using HydraScript.Lib.BackEnd.Values; -using HydraScript.Lib.IR.Ast.Visitors; namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions.PrimaryExpressions; -public abstract class PrimaryExpression : Expression +[AutoVisitable] +public abstract partial class PrimaryExpression : Expression { public override IEnumerator GetEnumerator() { @@ -12,7 +11,4 @@ public override IEnumerator GetEnumerator() } public abstract IValue ToValue(); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/UnaryExpression.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/UnaryExpression.cs index 8b486c90..553cebc6 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/UnaryExpression.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Expressions/UnaryExpression.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; -public class UnaryExpression : Expression +[AutoVisitable] +public partial class UnaryExpression : Expression { public string Operator { get; } public Expression Expression { get; } @@ -23,10 +20,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => Operator; - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(ExpressionInstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/ScriptBody.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/ScriptBody.cs index cfd21691..d1772bcd 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/ScriptBody.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/ScriptBody.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes; -public class ScriptBody : AbstractSyntaxTreeNode +[AutoVisitable] +public partial class ScriptBody : AbstractSyntaxTreeNode { public List StatementList { get; } @@ -18,16 +15,4 @@ public override IEnumerator GetEnumerator() => StatementList.GetEnumerator(); protected override string NodeRepresentation() => "Script"; - - public override Unit Accept(SymbolTableInitializer visitor) => - visitor.Visit(this); - - public override Unit Accept(TypeSystemLoader visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/StatementListItem.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/StatementListItem.cs index 7c277f50..dca2d3d4 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/StatementListItem.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/StatementListItem.cs @@ -1,10 +1,10 @@ namespace HydraScript.Lib.IR.Ast.Impl.Nodes; public abstract class StatementListItem : - AbstractSyntaxTreeNode { } + AbstractSyntaxTreeNode; public abstract class Statement : - StatementListItem { } + StatementListItem; public abstract class Declaration : - StatementListItem { } \ No newline at end of file + StatementListItem; \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/BlockStatement.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/BlockStatement.cs index 3feaca31..fee3b6a5 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/BlockStatement.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/BlockStatement.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class BlockStatement : Statement +[AutoVisitable] +public partial class BlockStatement : Statement { public List StatementList { get; } @@ -18,13 +15,4 @@ public override IEnumerator GetEnumerator() => StatementList.GetEnumerator(); protected override string NodeRepresentation() => "{}"; - - public override Unit Accept(SymbolTableInitializer visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ExpressionStatement.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ExpressionStatement.cs index c861c016..6fbfb516 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ExpressionStatement.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ExpressionStatement.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class ExpressionStatement : Statement +[AutoVisitable] +public partial class ExpressionStatement : Statement { public Expression Expression { get; } @@ -20,10 +17,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => nameof(ExpressionStatement); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/IfStatement.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/IfStatement.cs index 4bc356d9..3be48613 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/IfStatement.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/IfStatement.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class IfStatement : Statement +[AutoVisitable] +public partial class IfStatement : Statement { public Expression Test { get; } public Statement Then { get; } @@ -42,10 +39,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "if"; - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/InsideStatementJump.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/InsideStatementJump.cs index b1517eef..26f47e1b 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/InsideStatementJump.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/InsideStatementJump.cs @@ -1,20 +1,12 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class InsideStatementJump : Statement +[AutoVisitable] +public partial class InsideStatementJump(string keyword) : Statement { public const string Break = "break"; public const string Continue = "continue"; - public string Keyword { get; } - - public InsideStatementJump(string keyword) - { - Keyword = keyword; - } + public string Keyword { get; } = keyword; public override IEnumerator GetEnumerator() { @@ -22,10 +14,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => Keyword; - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ReturnStatement.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ReturnStatement.cs index ee8cf85b..44d4cb14 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ReturnStatement.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/ReturnStatement.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class ReturnStatement : Statement +[AutoVisitable] +public partial class ReturnStatement : Statement { public Expression? Expression { get; } @@ -28,10 +25,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "return"; - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/WhileStatement.cs b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/WhileStatement.cs index 4224a763..d9930095 100644 --- a/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/WhileStatement.cs +++ b/src/HydraScript.Lib/IR/Ast/Impl/Nodes/Statements/WhileStatement.cs @@ -1,10 +1,7 @@ -using HydraScript.Lib.BackEnd; -using HydraScript.Lib.IR.Ast.Visitors; -using HydraScript.Lib.IR.CheckSemantics.Visitors; - namespace HydraScript.Lib.IR.Ast.Impl.Nodes.Statements; -public class WhileStatement : Statement +[AutoVisitable] +public partial class WhileStatement : Statement { public Expression Condition { get; } public Statement Statement { get; } @@ -25,10 +22,4 @@ public override IEnumerator GetEnumerator() } protected override string NodeRepresentation() => "while"; - - public override AddressedInstructions Accept(InstructionProvider visitor) => - visitor.Visit(this); - - public override Type Accept(SemanticChecker visitor) => - visitor.Visit(this); } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/Ast/Visitors/ExpressionInstructionProvider.cs b/src/HydraScript.Lib/IR/Ast/Visitors/ExpressionInstructionProvider.cs index b3b5fe95..9d98e69f 100644 --- a/src/HydraScript.Lib/IR/Ast/Visitors/ExpressionInstructionProvider.cs +++ b/src/HydraScript.Lib/IR/Ast/Visitors/ExpressionInstructionProvider.cs @@ -15,7 +15,7 @@ namespace HydraScript.Lib.IR.Ast.Visitors; -public class ExpressionInstructionProvider : +public class ExpressionInstructionProvider : VisitorBase, IVisitor, IVisitor, IVisitor, @@ -51,7 +51,7 @@ public AddressedInstructions Visit(ArrayLiteral visitable) result.Add(new IndexAssignment(arrayName, index, primary.ToValue())); else { - result.AddRange(expression.Accept(this)); + result.AddRange(expression.Accept(This)); var last = new Name(result.OfType().Last().Left!); result.Add(new IndexAssignment(arrayName, index, last)); } @@ -69,7 +69,7 @@ public AddressedInstructions Visit(ObjectLiteral visitable) result.AddRange(visitable.Properties .SelectMany(property => - property.Accept(this))); + property.Accept(This))); return result; } @@ -84,7 +84,7 @@ public AddressedInstructions Visit(Property visitable) if (expression is PrimaryExpression primary) return [new DotAssignment(objectId, propertyId, primary.ToValue())]; - var instructions = expression.Accept(this); + var instructions = expression.Accept(This); var last = new Name(instructions.OfType().Last().Left!); instructions.Add(new DotAssignment(objectId, propertyId, last)); @@ -96,7 +96,7 @@ public AddressedInstructions Visit(UnaryExpression visitable) if (visitable.Expression is PrimaryExpression primary) return [new Simple(visitable.Operator, primary.ToValue())]; - var result = visitable.Expression.Accept(this); + var result = visitable.Expression.Accept(This); var last = new Name(result.OfType().Last().Left!); result.Add(new Simple(visitable.Operator, last)); @@ -115,7 +115,7 @@ public AddressedInstructions Visit(BinaryExpression visitable) left = primaryLeft.ToValue(); else { - result.AddRange(visitable.Left.Accept(this)); + result.AddRange(visitable.Left.Accept(This)); left = new Name(result.OfType().Last().Left!); } @@ -123,7 +123,7 @@ public AddressedInstructions Visit(BinaryExpression visitable) right = primaryRight.ToValue(); else { - result.AddRange(visitable.Right.Accept(this)); + result.AddRange(visitable.Right.Accept(This)); right = new Name(result.OfType().Last().Left!); } @@ -137,7 +137,7 @@ public AddressedInstructions Visit(CastAsExpression visitable) if (visitable.Expression is PrimaryExpression primary) return [new AsString(primary.ToValue())]; - var result = visitable.Expression.Accept(this); + var result = visitable.Expression.Accept(This); var last = new Name(result.OfType().Last().Left!); result.Add(new AsString(last)); @@ -156,17 +156,17 @@ public AddressedInstructions Visit(ConditionalExpression visitable) result.Add(new IfNotGoto(primary.ToValue(), startBlockLabel)); else { - result.AddRange(visitable.Test.Accept(this)); + result.AddRange(visitable.Test.Accept(This)); var last = new Name(result.OfType().Last().Left!); result.Add(new IfNotGoto(last, startBlockLabel)); } - result.AddRange(visitable.Consequent.Accept(this)); + result.AddRange(visitable.Consequent.Accept(This)); var temp = result.OfType().Last().Left!; result.Add(new Goto(endBlockLabel)); result.Add(new BeginBlock(BlockType.Condition, blockId), startBlockLabel.Name); - result.AddRange(visitable.Alternate.Accept(this)); + result.AddRange(visitable.Alternate.Accept(This)); result.OfType().Last().Left = temp; result.Add(new EndBlock(BlockType.Condition, blockId), endBlockLabel.Name); @@ -177,7 +177,7 @@ public AddressedInstructions Visit(ConditionalExpression visitable) public AddressedInstructions Visit(AssignmentExpression visitable) { - var result = visitable.Source.Accept(this); + var result = visitable.Source.Accept(This); if (visitable.Source is AssignmentExpression) { var last = result.OfType().Last(); @@ -192,7 +192,7 @@ public AddressedInstructions Visit(AssignmentExpression visitable) else { var last = new Name(result.OfType().Last().Left!); - result.AddRange(visitable.Destination.Accept(this)); + result.AddRange(visitable.Destination.Accept(This)); var lastRead = result.OfType().Last(); result.Replace(lastRead.ToInstruction(), lastRead.ToAssignment(last)); } @@ -203,7 +203,7 @@ public AddressedInstructions Visit(AssignmentExpression visitable) public AddressedInstructions Visit(MemberExpression visitable) => visitable.Empty() ? [] - : visitable.Tail?.Accept(this) ?? []; + : visitable.Tail?.Accept(This) ?? []; public AddressedInstructions Visit(DotAccess visitable) { @@ -212,7 +212,7 @@ public AddressedInstructions Visit(DotAccess visitable) if (!visitable.HasPrev() && visitable.Parent is LeftHandSideExpression lhs) return [new DotRead(new Name(lhs.Id), right)]; - var result = visitable.Prev?.Accept(this) ?? []; + var result = visitable.Prev?.Accept(This) ?? []; var left = new Name(result.OfType().Last().Left!); result.Add(new DotRead(left, right)); @@ -229,7 +229,7 @@ public AddressedInstructions Visit(IndexAccess visitable) right = primary.ToValue(); else { - result.AddRange(visitable.Index.Accept(this)); + result.AddRange(visitable.Index.Accept(This)); right = new Name(result.OfType().Last().Left!); } @@ -237,7 +237,7 @@ public AddressedInstructions Visit(IndexAccess visitable) result.Add(new IndexRead(new Name(lhs.Id), right)); else { - result.AddRange(visitable.Prev?.Accept(this) ?? []); + result.AddRange(visitable.Prev?.Accept(This) ?? []); var left = new Name(result.OfType().Last().Left!); result.Add(new IndexRead(left, right)); } @@ -255,7 +255,7 @@ public AddressedInstructions Visit(CallExpression visitable) if (param is PrimaryExpression prim) return [new Print(prim.ToValue())]; - var result = param.Accept(this); + var result = param.Accept(This); var last = new Name(result.OfType().Last().Left!); result.Add(new Print(last)); @@ -267,7 +267,7 @@ public AddressedInstructions Visit(CallExpression visitable) AddressedInstructions result = []; if (methodCall) { - var memberInstructions = visitable.Member.Accept(this); + var memberInstructions = visitable.Member.Accept(This); var lastMemberInstruction = (DotRead)memberInstructions[memberInstructions.End]; memberInstructions.Remove(lastMemberInstruction); result.AddRange(memberInstructions); @@ -297,7 +297,7 @@ public AddressedInstructions Visit(CallExpression visitable) result.Add(new PushParameter(symbol.Id, primary.ToValue())); else { - result.AddRange(expr.Accept(this)); + result.AddRange(expr.Accept(This)); var id = result.OfType().Last().Left!; result.Add(new PushParameter(symbol.Id, new Name(id))); } diff --git a/src/HydraScript.Lib/IR/Ast/Visitors/InstructionProvider.cs b/src/HydraScript.Lib/IR/Ast/Visitors/InstructionProvider.cs index fba62c24..d7f9f0e5 100644 --- a/src/HydraScript.Lib/IR/Ast/Visitors/InstructionProvider.cs +++ b/src/HydraScript.Lib/IR/Ast/Visitors/InstructionProvider.cs @@ -11,7 +11,7 @@ namespace HydraScript.Lib.IR.Ast.Visitors; -public class InstructionProvider : +public class InstructionProvider : VisitorBase, IVisitor, IVisitor, IVisitor, @@ -22,21 +22,28 @@ public class InstructionProvider : IVisitor, IVisitor { - private readonly ExpressionInstructionProvider _expressionVisitor = new(); - + private readonly IVisitor _expressionVisitor; + + public InstructionProvider() + { + _expressionVisitor = new ExpressionInstructionProvider(); + } + public AddressedInstructions Visit(ScriptBody visitable) { var result = new AddressedInstructions(); foreach (var item in visitable.StatementList) { - result.AddRange(item.Accept(this)); + result.AddRange(item.Accept(This)); } result.Add(new Halt()); - + return result; } + public override AddressedInstructions DefaultVisit { get; } = []; + public AddressedInstructions Visit(LexicalDeclaration visitable) { var result = new AddressedInstructions(); @@ -53,7 +60,7 @@ public AddressedInstructions Visit(BlockStatement visitable) var result = new AddressedInstructions(); foreach (var item in visitable.StatementList) { - result.AddRange(item.Accept(this)); + result.AddRange(item.Accept(This)); if (item is ReturnStatement) break; } @@ -109,13 +116,13 @@ public AddressedInstructions Visit(FunctionDeclaration visitable) functionInfo.Start.Name } }; - - result.AddRange(visitable.Statements.Accept(this)); + + result.AddRange(visitable.Statements.Accept(This)); if (!visitable.HasReturnStatement()) result.Add(new Return()); result.Add(new EndBlock(BlockType.Function, blockId: functionInfo.ToString()), functionInfo.End.Name); - + return result; } @@ -124,7 +131,7 @@ public AddressedInstructions Visit(WhileStatement visitable) var blockId = $"while_{visitable.GetHashCode()}"; var startBlockLabel = new Label($"Start_{blockId}"); var endBlockLabel = new Label($"End_{blockId}"); - + var result = new AddressedInstructions { { new BeginBlock(BlockType.Loop, blockId), startBlockLabel.Name } @@ -138,8 +145,8 @@ public AddressedInstructions Visit(WhileStatement visitable) var last = new Name(result.OfType().Last().Left!); result.Add(new IfNotGoto(last, endBlockLabel)); } - - result.AddRange(visitable.Statement.Accept(this)); + + result.AddRange(visitable.Statement.Accept(This)); result.OfType().Where(g => g.JumpType is not null) .ToList().ForEach(g => { @@ -169,9 +176,9 @@ public AddressedInstructions Visit(IfStatement visitable) var blockId = $"if_else_{visitable.GetHashCode()}"; var startBlockLabel = new Label($"Start_{blockId}"); var endBlockLabel = new Label($"End_{blockId}"); - + var result = new AddressedInstructions(); - + if (visitable.Test is PrimaryExpression primary) result.Add(new IfNotGoto(primary.ToValue(), startBlockLabel)); else @@ -184,16 +191,16 @@ public AddressedInstructions Visit(IfStatement visitable) : endBlockLabel) ); } - - result.AddRange(visitable.Then.Accept(this)); + + result.AddRange(visitable.Then.Accept(This)); result.Add(new Goto(endBlockLabel)); result.Add(new BeginBlock(BlockType.Condition, blockId), startBlockLabel.Name); if (visitable.HasElseBlock()) - result.AddRange(visitable.Else?.Accept(this) ?? []); + result.AddRange(visitable.Else?.Accept(This) ?? []); result.OfType().Where(g => g.JumpType is InsideStatementJumpType.Break) - .ToList().ForEach(g=> g.SetJump(endBlockLabel)); + .ToList().ForEach(g => g.SetJump(endBlockLabel)); result.Add(new EndBlock(BlockType.Condition, blockId), endBlockLabel.Name); diff --git a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/DeclarationVisitor.cs b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/DeclarationVisitor.cs index 1bb19bc2..41ce2efc 100644 --- a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/DeclarationVisitor.cs +++ b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/DeclarationVisitor.cs @@ -10,8 +10,7 @@ namespace HydraScript.Lib.IR.CheckSemantics.Visitors; -public class DeclarationVisitor : - IVisitor, +public class DeclarationVisitor : VisitorNoReturnBase, IVisitor, IVisitor { @@ -26,15 +25,15 @@ public DeclarationVisitor( _methodStorage = methodStorage; } - public Unit Visit(AbstractSyntaxTreeNode visitable) + public override VisitUnit Visit(AbstractSyntaxTreeNode visitable) { foreach (var child in visitable) - child.Accept(this); + child.Accept(This); return default; } - public Unit Visit(LexicalDeclaration visitable) + public VisitUnit Visit(LexicalDeclaration visitable) { foreach (var assignment in visitable.Assignments) { @@ -59,7 +58,7 @@ public Unit Visit(LexicalDeclaration visitable) return default; } - public Unit Visit(FunctionDeclaration visitable) + public VisitUnit Visit(FunctionDeclaration visitable) { if (visitable.Parent!.SymbolTable.ContainsSymbol(visitable.Name)) throw new DeclarationAlreadyExists(visitable.Name); @@ -94,6 +93,6 @@ public Unit Visit(FunctionDeclaration visitable) } visitable.Parent.SymbolTable.AddSymbol(functionSymbol); - return visitable.Statements.Accept(this); + return visitable.Statements.Accept(This); } } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SemanticChecker.cs b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SemanticChecker.cs index 62c1b398..0d954eda 100644 --- a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SemanticChecker.cs +++ b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SemanticChecker.cs @@ -1,3 +1,4 @@ +using HydraScript.Lib.IR.Ast; using HydraScript.Lib.IR.Ast.Impl.Nodes; using HydraScript.Lib.IR.Ast.Impl.Nodes.Declarations.AfterTypesAreLoaded; using HydraScript.Lib.IR.Ast.Impl.Nodes.Expressions; @@ -12,7 +13,7 @@ namespace HydraScript.Lib.IR.CheckSemantics.Visitors; -public class SemanticChecker : +public class SemanticChecker : VisitorBase, IVisitor, IVisitor, IVisitor, @@ -20,6 +21,7 @@ public class SemanticChecker : IVisitor, IVisitor, IVisitor, + IVisitor, IVisitor, IVisitor, IVisitor, @@ -50,38 +52,40 @@ public SemanticChecker( _methodStorage = methodStorage; } + public override Type DefaultVisit => "undefined"; + public Type Visit(ScriptBody visitable) { foreach (var statementListItem in visitable.StatementList) - statementListItem.Accept(this); + statementListItem.Accept(This); foreach (var funcDecl in _functionStorage.Flush()) - funcDecl.Accept(this); + funcDecl.Accept(This); return "undefined"; } public Type Visit(WhileStatement visitable) { - var condType = visitable.Condition.Accept(this); + var condType = visitable.Condition.Accept(This); Type boolean = "boolean"; if (!condType.Equals(boolean)) throw new NotBooleanTestExpression(visitable.Segment, condType); - visitable.Statement.Accept(this); + visitable.Statement.Accept(This); return "undefined"; } public Type Visit(IfStatement visitable) { - var testType = visitable.Test.Accept(this); + var testType = visitable.Test.Accept(This); Type boolean = "boolean"; if (!testType.Equals(boolean)) throw new NotBooleanTestExpression(visitable.Segment, testType); - visitable.Then.Accept(this); - visitable.Else?.Accept(this); + visitable.Then.Accept(This); + visitable.Else?.Accept(This); return "undefined"; } @@ -114,11 +118,11 @@ public Type Visit(ReturnStatement visitable) if (!visitable.ChildOf()) throw new ReturnOutsideFunction(visitable.Segment); - return visitable.Expression?.Accept(this) ?? "void"; + return visitable.Expression?.Accept(This) ?? "void"; } public Type Visit(ExpressionStatement visitable) => - visitable.Expression.Accept(this); + visitable.Expression.Accept(This); public Type Visit(IdentifierReference visitable) { @@ -126,6 +130,9 @@ public Type Visit(IdentifierReference visitable) return symbol?.Type ?? throw new UnknownIdentifierReference(visitable); } + public Type Visit(Literal visitable) => + visitable.Type.BuildType(visitable.Parent!.SymbolTable); + public Type Visit(ImplicitLiteral visitable) { var type = visitable.TypeValue.BuildType(visitable.Parent!.SymbolTable); @@ -138,8 +145,8 @@ public Type Visit(ArrayLiteral visitable) if (visitable.Expressions.Count == 0) return new ArrayType(new Any()); - var type = visitable.First().Accept(this); - if (visitable.Expressions.All(e => e.Accept(this).Equals(type))) + var type = visitable.First().Accept(This); + if (visitable.Expressions.All(e => e.Accept(This).Equals(type))) return new ArrayType(type); throw new WrongArrayLiteralDeclaration(visitable.Segment, type); @@ -149,7 +156,7 @@ public Type Visit(ObjectLiteral visitable) { var properties = visitable.Properties.Select(prop => { - var propType = prop.Expression.Accept(this); + var propType = prop.Expression.Accept(This); visitable.SymbolTable.AddSymbol(propType switch { ObjectType objectType => new ObjectSymbol(prop.Id, objectType), @@ -163,13 +170,13 @@ public Type Visit(ObjectLiteral visitable) public Type Visit(ConditionalExpression visitable) { - var tType = visitable.Test.Accept(this); + var tType = visitable.Test.Accept(This); Type boolean = "boolean"; if (!tType.Equals(boolean)) throw new NotBooleanTestExpression(visitable.Test.Segment, tType); - var cType = visitable.Consequent.Accept(this); - var aType = visitable.Alternate.Accept(this); + var cType = visitable.Consequent.Accept(This); + var aType = visitable.Alternate.Accept(This); if (cType.Equals(aType)) return cType; @@ -182,8 +189,8 @@ public Type Visit(ConditionalExpression visitable) public Type Visit(BinaryExpression visitable) { - var lType = visitable.Left.Accept(this); - var rType = visitable.Right.Accept(this); + var lType = visitable.Left.Accept(This); + var rType = visitable.Right.Accept(This); if (visitable.Operator != "::" && !lType.Equals(rType)) throw new IncompatibleTypesOfOperands( @@ -224,7 +231,7 @@ public Type Visit(BinaryExpression visitable) public Type Visit(UnaryExpression visitable) { - var eType = visitable.Expression.Accept(this); + var eType = visitable.Expression.Accept(This); Type number = "number"; Type boolean = "boolean"; @@ -246,7 +253,7 @@ public Type Visit(LexicalDeclaration visitable) { var registeredSymbol = visitable.SymbolTable.FindSymbol( assignment.Destination.Id); - var sourceType = assignment.Source.Accept(this); + var sourceType = assignment.Source.Accept(This); if (sourceType.Equals(undefined)) throw new CannotDefineType(assignment.Source.Segment); if (!registeredSymbol!.Type.Equals(undefined) && !registeredSymbol.Type.Equals(sourceType)) @@ -274,10 +281,10 @@ public Type Visit(AssignmentExpression visitable) if (visitable.Destination is CallExpression) throw new WrongAssignmentTarget(visitable.Destination); - var sourceType = visitable.Source.Accept(this); + var sourceType = visitable.Source.Accept(This); if (!visitable.Destination.Empty()) { - var destinationType = visitable.Destination.Accept(this); + var destinationType = visitable.Destination.Accept(This); if (!destinationType.Equals(sourceType)) throw new IncompatibleTypesOfOperands( visitable.Segment, @@ -305,9 +312,9 @@ public Type Visit(AssignmentExpression visitable) public Type Visit(MemberExpression visitable) { - var idType = visitable.Id.Accept(this); + var idType = visitable.Id.Accept(This); visitable.ComputedIdType = idType; - return visitable.Empty() ? idType : visitable.AccessChain?.Accept(this) ?? "undefined"; + return visitable.Empty() ? idType : visitable.AccessChain?.Accept(This) ?? "undefined"; } public Type Visit(IndexAccess visitable) @@ -320,13 +327,13 @@ public Type Visit(IndexAccess visitable) throw new NonAccessibleType(prevType); Type number = "number"; - var indexType = visitable.Index.Accept(this); + var indexType = visitable.Index.Accept(This); if (!indexType.Equals(number)) throw new ArrayAccessException(visitable.Segment, indexType); var elemType = arrayType.Type; visitable.ComputedType = elemType; - return visitable.HasNext() ? visitable.Next?.Accept(this) ?? "undefined" : elemType; + return visitable.HasNext() ? visitable.Next?.Accept(This) ?? "undefined" : elemType; } public Type Visit(DotAccess visitable) @@ -345,13 +352,13 @@ public Type Visit(DotAccess visitable) ? objectType : throw new ObjectAccessException(visitable.Segment, objectType, visitable.Property); visitable.ComputedType = fieldType; - return visitable.HasNext() ? visitable.Next?.Accept(this) ?? "undefined" : fieldType; + return visitable.HasNext() ? visitable.Next?.Accept(This) ?? "undefined" : fieldType; } public Type Visit(CastAsExpression visitable) { Type undefined = "undefined"; - var exprType = visitable.Expression.Accept(this); + var exprType = visitable.Expression.Accept(This); if (exprType.Equals(undefined)) throw new CannotDefineType(visitable.Expression.Segment); @@ -368,7 +375,7 @@ public Type Visit(CallExpression visitable) if (methodCall) { - var objectType = (ObjectType)visitable.Member.Accept(this); + var objectType = (ObjectType)visitable.Member.Accept(This); var availableMethods = _methodStorage.GetAvailableMethods(objectType); functionSymbol = availableMethods[objectType.LastAccessedMethod]; } @@ -394,7 +401,7 @@ symbol as FunctionSymbol .ToList().ForEach(pair => { var (expr, expected) = pair; - var actualType = expr.Accept(this); + var actualType = expr.Accept(This); if (!actualType.Equals(expected.Type)) throw new WrongTypeOfArgument(expr.Segment, expected.Type, actualType); }); @@ -403,7 +410,7 @@ symbol as FunctionSymbol if (functionSymbol.Type.Equals(undefined)) { var declaration = _functionStorage.Get(functionSymbol); - functionReturnType = declaration.Accept(this); + functionReturnType = declaration.Accept(This); } return functionReturnType; @@ -413,13 +420,13 @@ public Type Visit(FunctionDeclaration visitable) { var symbol = visitable.SymbolTable.FindSymbol(visitable.Name)!; _functionStorage.RemoveIfPresent(symbol); - visitable.Statements.Accept(this); + visitable.Statements.Accept(This); var returnStatements = visitable.GetReturnStatements() .Select(x => new { Statement = x, - Type = x.Accept(this) + Type = x.Accept(This) }); Type undefined = "undefined"; if (symbol.Type.Equals(undefined)) @@ -453,7 +460,7 @@ public Type Visit(FunctionDeclaration visitable) public Type Visit(BlockStatement visitable) { - visitable.StatementList.ForEach(x => x.Accept(this)); + visitable.StatementList.ForEach(x => x.Accept(This)); return "undefined"; } } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SymbolTableInitializer.cs b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SymbolTableInitializer.cs index 94bf278a..8b43a888 100644 --- a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SymbolTableInitializer.cs +++ b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/SymbolTableInitializer.cs @@ -6,8 +6,7 @@ namespace HydraScript.Lib.IR.CheckSemantics.Visitors; -public class SymbolTableInitializer : - IVisitor, +public class SymbolTableInitializer : VisitorNoReturnBase, IVisitor, IVisitor, IVisitor @@ -23,32 +22,32 @@ public SymbolTableInitializer( _provider = provider; } - public Unit Visit(AbstractSyntaxTreeNode visitable) + public override VisitUnit Visit(AbstractSyntaxTreeNode visitable) { _initializerService.InitThroughParent(visitable); foreach (var child in visitable) - child.Accept(this); + child.Accept(This); return default; } - public Unit Visit(ScriptBody visitable) + public VisitUnit Visit(ScriptBody visitable) { visitable.SymbolTable = _provider.GetStandardLibrary(); - visitable.StatementList.ForEach(item => item.Accept(this)); + visitable.StatementList.ForEach(item => item.Accept(This)); return default; } - public Unit Visit(FunctionDeclaration visitable) + public VisitUnit Visit(FunctionDeclaration visitable) { _initializerService.InitWithNewScope(visitable); - visitable.Statements.Accept(this); + visitable.Statements.Accept(This); return default; } - public Unit Visit(BlockStatement visitable) + public VisitUnit Visit(BlockStatement visitable) { _initializerService.InitWithNewScope(visitable); - visitable.StatementList.ForEach(item => item.Accept(this)); + visitable.StatementList.ForEach(item => item.Accept(This)); return default; } } \ No newline at end of file diff --git a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/TypeSystemLoader.cs b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/TypeSystemLoader.cs index 871eb898..c47d756e 100644 --- a/src/HydraScript.Lib/IR/CheckSemantics/Visitors/TypeSystemLoader.cs +++ b/src/HydraScript.Lib/IR/CheckSemantics/Visitors/TypeSystemLoader.cs @@ -7,9 +7,8 @@ namespace HydraScript.Lib.IR.CheckSemantics.Visitors; -public class TypeSystemLoader : +public class TypeSystemLoader : VisitorNoReturnBase, IVisitor, - IVisitor, IVisitor { private readonly ITypeDeclarationsResolver _resolver; @@ -23,22 +22,22 @@ public TypeSystemLoader( _defaultTypes = provider.GetDefaultTypes().ToHashSet(); } - public Unit Visit(ScriptBody visitable) + public VisitUnit Visit(ScriptBody visitable) { - visitable.StatementList.ForEach(item => item.Accept(this)); + visitable.StatementList.ForEach(item => item.Accept(This)); _resolver.Resolve(); return default; } - public Unit Visit(AbstractSyntaxTreeNode visitable) + public override VisitUnit Visit(AbstractSyntaxTreeNode visitable) { foreach (var child in visitable) - child.Accept(this); + child.Accept(This); return default; } - public Unit Visit(TypeDeclaration visitable) + public VisitUnit Visit(TypeDeclaration visitable) { if (visitable.SymbolTable.ContainsSymbol(visitable.TypeId) || _defaultTypes.Contains(visitable.TypeId.Name))