From 435abbb43c320abb3739fe0cf5907730486244df Mon Sep 17 00:00:00 2001 From: GGG Date: Mon, 29 Jan 2024 18:05:13 -0300 Subject: [PATCH] Add another test case for nodes with fields from the base. --- .../GreenNode.Debug.g.cs | 49 ++++- .../Sample.Internal.g.cs | 186 +++++++++++++++++- .../Sample.Main.g.cs | 30 +++ .../Sample.Red.g.cs | 154 ++++++++++++++- Tsu.Trees.RedGreen/sample/Tree.cs | 33 +++- .../sourcegen/RedTreeGenerator.cs | 9 +- 6 files changed, 430 insertions(+), 31 deletions(-) diff --git a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/GreenNode.Debug.g.cs b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/GreenNode.Debug.g.cs index e43875d..4bd4835 100644 --- a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/GreenNode.Debug.g.cs +++ b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/GreenNode.Debug.g.cs @@ -17,19 +17,19 @@ // global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) // global::Tsu.Trees.RedGreen.Sample.Internal.FunctionCallExpressionSample // Kinds: -// Tsu.Trees.RedGreen.Sample.SampleKind.FunctionCallExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 6) +// Tsu.Trees.RedGreen.Sample.SampleKind.FunctionCallExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 7) // Children: -// global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample (Name = identifier, IsOptional = False, PassToBase = False) -// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = firstArg, IsOptional = False, PassToBase = False) -// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample? (Name = secondArg, IsOptional = True, PassToBase = False) +// global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample (Name = _identifier, IsOptional = False, PassToBase = False) +// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = _firstArg, IsOptional = False, PassToBase = False) +// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample? (Name = _secondArg, IsOptional = True, PassToBase = False) // ExtraData: // global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) // global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample // Kinds: -// Tsu.Trees.RedGreen.Sample.SampleKind.AdditionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 2) -// Tsu.Trees.RedGreen.Sample.SampleKind.DivisionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 5) -// Tsu.Trees.RedGreen.Sample.SampleKind.MultiplicationExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 4) -// Tsu.Trees.RedGreen.Sample.SampleKind.SubtractionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 3) +// Tsu.Trees.RedGreen.Sample.SampleKind.AdditionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 3) +// Tsu.Trees.RedGreen.Sample.SampleKind.DivisionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 6) +// Tsu.Trees.RedGreen.Sample.SampleKind.MultiplicationExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 5) +// Tsu.Trees.RedGreen.Sample.SampleKind.SubtractionExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 4) // Children: // global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = _left, IsOptional = False, PassToBase = False) // global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = _right, IsOptional = False, PassToBase = False) @@ -37,15 +37,44 @@ // global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) // global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample // Kinds: -// Tsu.Trees.RedGreen.Sample.SampleKind.NumericalLiteralExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 1) +// Tsu.Trees.RedGreen.Sample.SampleKind.NumericalLiteralExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 2) // Children: // ExtraData: // global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) // double (Name = _value, IsOptional = False, PassToBase = False) // global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample // Kinds: -// Tsu.Trees.RedGreen.Sample.SampleKind.IdentifierExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 0) +// Tsu.Trees.RedGreen.Sample.SampleKind.IdentifierExpression (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 1) // Children: // ExtraData: // global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) // string (Name = _name, IsOptional = False, PassToBase = False) +// global::Tsu.Trees.RedGreen.Sample.Internal.StatementSample +// Kinds: +// Children: +// global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample (Name = _semicolon, IsOptional = False, PassToBase = False) +// ExtraData: +// global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) +// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample +// Kinds: +// Tsu.Trees.RedGreen.Sample.SampleKind.ExpressionStatement (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 9) +// Children: +// global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample (Name = _semicolon, IsOptional = False, PassToBase = True) +// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = _expression, IsOptional = False, PassToBase = False) +// ExtraData: +// global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) +// global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement +// Kinds: +// Tsu.Trees.RedGreen.Sample.SampleKind.AssignmentStatement (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 8) +// Children: +// global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample (Name = _semicolon, IsOptional = False, PassToBase = True) +// global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample (Name = _identifier, IsOptional = False, PassToBase = False) +// global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample (Name = _value, IsOptional = False, PassToBase = False) +// ExtraData: +// global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) +// global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample +// Kinds: +// Tsu.Trees.RedGreen.Sample.SampleKind.SemicolonToken (IsNull = False, Type = global::Tsu.Trees.RedGreen.Sample.SampleKind, Value = 0) +// Children: +// ExtraData: +// global::Tsu.Trees.RedGreen.Sample.SampleKind (Name = _kind, IsOptional = False, PassToBase = True) diff --git a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Internal.g.cs b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Internal.g.cs index 0bcfc0f..6c0f058 100644 --- a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Internal.g.cs +++ b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Internal.g.cs @@ -99,6 +99,40 @@ public virtual bool IsEquivalentTo([NotNullWhen(true)] global::Tsu.Trees.RedGree public abstract TResult? Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3); } + partial class SemicolonTokenSample : global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode + { + internal SemicolonTokenSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind) : base(kind) + { + this.SlotCount = 0; + } + + public override global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? GetSlot(int index) => + null; + + public override global::Tsu.Trees.RedGreen.Sample.SampleNode CreateRed(global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) => + new global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample(this, parent); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitSemicolonToken(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitSemicolonToken(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1) => visitor.VisitSemicolonToken(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitSemicolonToken(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitSemicolonToken(this, arg1, arg2, arg3); + } + + abstract partial class StatementSample : global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode + { + protected StatementSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind, global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon) : base(kind) + { + this._semicolon = semicolon; + } + + public global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample Semicolon => this._semicolon; + } + abstract partial class ExpressionSample : global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode { protected ExpressionSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind) : base(kind) @@ -106,6 +140,93 @@ protected ExpressionSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind) : } } + partial class AssignmentStatement : global::Tsu.Trees.RedGreen.Sample.Internal.StatementSample + { + internal AssignmentStatement(global::Tsu.Trees.RedGreen.Sample.SampleKind kind, global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample value) : base(kind, semicolon) + { + this.SlotCount = 3; + this._identifier = identifier; + this._value = value; + } + + public global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample Identifier => this._identifier; + public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample Value => this._value; + + public override global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? GetSlot(int index) => + index switch + { + 0 => this.Semicolon, + 1 => this.Identifier, + 2 => this.Value, + _ => null + }; + + public override global::Tsu.Trees.RedGreen.Sample.SampleNode CreateRed(global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) => + new global::Tsu.Trees.RedGreen.Sample.AssignmentStatement(this, parent); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitAssignmentStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitAssignmentStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1) => visitor.VisitAssignmentStatement(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitAssignmentStatement(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitAssignmentStatement(this, arg1, arg2, arg3); + + public global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement Update(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample value) + { + if (semicolon != this.Semicolon && identifier != this.Identifier && value != this.Value) + { + return global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.AssignmentStatement(semicolon, identifier, value); + } + + return this; + } + } + + partial class ExpressionStatementSample : global::Tsu.Trees.RedGreen.Sample.Internal.StatementSample + { + internal ExpressionStatementSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind, global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample expression) : base(kind, semicolon) + { + this.SlotCount = 2; + this._expression = expression; + } + + public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample Expression => this._expression; + + public override global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? GetSlot(int index) => + index switch + { + 0 => this.Semicolon, + 1 => this.Expression, + _ => null + }; + + public override global::Tsu.Trees.RedGreen.Sample.SampleNode CreateRed(global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) => + new global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample(this, parent); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitExpressionStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor) => visitor.VisitExpressionStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1) => visitor.VisitExpressionStatement(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitExpressionStatement(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.Internal.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitExpressionStatement(this, arg1, arg2, arg3); + + public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample Update(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample expression) + { + if (semicolon != this.Semicolon && expression != this.Expression) + { + return global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.ExpressionStatement(semicolon, expression); + } + + return this; + } + } + partial class IdentifierExpressionSample : global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample { internal IdentifierExpressionSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind, string name) : base(kind) @@ -229,14 +350,14 @@ partial class FunctionCallExpressionSample : global::Tsu.Trees.RedGreen.Sample.I internal FunctionCallExpressionSample(global::Tsu.Trees.RedGreen.Sample.SampleKind kind, global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample firstArg, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample? secondArg) : base(kind) { this.SlotCount = 3; - this.identifier = identifier; - this.firstArg = firstArg; - this.secondArg = secondArg; + this._identifier = identifier; + this._firstArg = firstArg; + this._secondArg = secondArg; } - public global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample Identifier => this.identifier; - public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample FirstArg => this.firstArg; - public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample? SecondArg => this.secondArg; + public global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample Identifier => this._identifier; + public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample FirstArg => this._firstArg; + public global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample? SecondArg => this._secondArg; public override global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? GetSlot(int index) => index switch @@ -273,6 +394,38 @@ internal FunctionCallExpressionSample(global::Tsu.Trees.RedGreen.Sample.SampleKi internal static class SampleFactory { + public static global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample SemicolonToken() + { +#if DEBUG +#endif // DEBUG + + return new global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample( + global::Tsu.Trees.RedGreen.Sample.SampleKind.SemicolonToken); + } + + public static global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement AssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample value) + { +#if DEBUG + if (semicolon == null) throw new global::System.ArgumentNullException(nameof(semicolon)); + if (identifier == null) throw new global::System.ArgumentNullException(nameof(identifier)); + if (value == null) throw new global::System.ArgumentNullException(nameof(value)); +#endif // DEBUG + + return new global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement( + global::Tsu.Trees.RedGreen.Sample.SampleKind.AssignmentStatement, semicolon, identifier, value); + } + + public static global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample ExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample expression) + { +#if DEBUG + if (semicolon == null) throw new global::System.ArgumentNullException(nameof(semicolon)); + if (expression == null) throw new global::System.ArgumentNullException(nameof(expression)); +#endif // DEBUG + + return new global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample( + global::Tsu.Trees.RedGreen.Sample.SampleKind.ExpressionStatement, semicolon, expression); + } + public static global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample IdentifierExpression(string name) { #if DEBUG @@ -346,6 +499,9 @@ public virtual void Visit(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? node.Accept(this); } } + public virtual void VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample node) => this.DefaultVisit(node); + public virtual void VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement node) => this.DefaultVisit(node); + public virtual void VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample node) => this.DefaultVisit(node); public virtual void VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample node) => this.DefaultVisit(node); public virtual void VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample node) => this.DefaultVisit(node); public virtual void VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample node) => this.DefaultVisit(node); @@ -357,6 +513,9 @@ internal partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? node) => node == null ? default : node.Accept(this ); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample node) => this.DefaultVisit(node); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement node) => this.DefaultVisit(node); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample node) => this.DefaultVisit(node); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample node) => this.DefaultVisit(node); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample node) => this.DefaultVisit(node); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample node) => this.DefaultVisit(node); @@ -368,6 +527,9 @@ internal partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? node, T1 arg1) => node == null ? default : node.Accept(this , arg1); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample node, T1 arg1) => this.DefaultVisit(node, arg1); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement node, T1 arg1) => this.DefaultVisit(node, arg1); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); @@ -379,6 +541,9 @@ internal partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? node, T1 arg1, T2 arg2) => node == null ? default : node.Accept(this , arg1, arg2); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); @@ -390,6 +555,9 @@ internal partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode? node, T1 arg1, T2 arg2, T3 arg3) => node == null ? default : node.Accept(this , arg1, arg2, arg3); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.AssignmentStatement node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionStatementSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.Internal.NumericalLiteralExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.Internal.BinaryOperationExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); @@ -428,6 +596,12 @@ protected override void DefaultVisit(global::Tsu.Trees.RedGreen.Sample.Internal. public partial class SampleRewriter : Tsu.Trees.RedGreen.Sample.SampleVisitor { + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node) => + node.Update(); + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node) => + node.Update((global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample?)Visit(node.Semicolon) ?? throw new global::System.InvalidOperationException("Semicolon cannot be null."), (global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample?)Visit(node.Identifier) ?? throw new global::System.InvalidOperationException("Identifier cannot be null."), (global::Tsu.Trees.RedGreen.Sample.ExpressionSample?)Visit(node.Value) ?? throw new global::System.InvalidOperationException("Value cannot be null.")); + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node) => + node.Update((global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample?)Visit(node.Semicolon) ?? throw new global::System.InvalidOperationException("Semicolon cannot be null."), (global::Tsu.Trees.RedGreen.Sample.ExpressionSample?)Visit(node.Expression) ?? throw new global::System.InvalidOperationException("Expression cannot be null.")); public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node) => node.Update(node.Name); public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node) => diff --git a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Main.g.cs b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Main.g.cs index 0864b6d..3d17c3c 100644 --- a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Main.g.cs +++ b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Main.g.cs @@ -18,6 +18,9 @@ public virtual void Visit(global::Tsu.Trees.RedGreen.Sample.SampleNode? node) node.Accept(this); } } + public virtual void VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node) => this.DefaultVisit(node); + public virtual void VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node) => this.DefaultVisit(node); + public virtual void VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node) => this.DefaultVisit(node); public virtual void VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node) => this.DefaultVisit(node); public virtual void VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node) => this.DefaultVisit(node); public virtual void VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.BinaryOperationExpressionSample node) => this.DefaultVisit(node); @@ -29,6 +32,9 @@ public partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.SampleNode? node) => node == null ? default : node.Accept(this ); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node) => this.DefaultVisit(node); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node) => this.DefaultVisit(node); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node) => this.DefaultVisit(node); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node) => this.DefaultVisit(node); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node) => this.DefaultVisit(node); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.BinaryOperationExpressionSample node) => this.DefaultVisit(node); @@ -40,6 +46,9 @@ public partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.SampleNode? node, T1 arg1) => node == null ? default : node.Accept(this , arg1); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node, T1 arg1) => this.DefaultVisit(node, arg1); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node, T1 arg1) => this.DefaultVisit(node, arg1); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.BinaryOperationExpressionSample node, T1 arg1) => this.DefaultVisit(node, arg1); @@ -51,6 +60,9 @@ public partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.SampleNode? node, T1 arg1, T2 arg2) => node == null ? default : node.Accept(this , arg1, arg2); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.BinaryOperationExpressionSample node, T1 arg1, T2 arg2) => this.DefaultVisit(node, arg1, arg2); @@ -62,6 +74,9 @@ public partial class SampleVisitor { public virtual TResult? Visit(global::Tsu.Trees.RedGreen.Sample.SampleNode? node, T1 arg1, T2 arg2, T3 arg3) => node == null ? default : node.Accept(this , arg1, arg2, arg3); + public virtual TResult? VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); + public virtual TResult? VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); + public virtual TResult? VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); public virtual TResult? VisitBinaryOperationExpression(global::Tsu.Trees.RedGreen.Sample.BinaryOperationExpressionSample node, T1 arg1, T2 arg2, T3 arg3) => this.DefaultVisit(node, arg1, arg2, arg3); @@ -101,6 +116,12 @@ protected override void DefaultVisit(global::Tsu.Trees.RedGreen.Sample.SampleNod public partial class SampleRewriter : Tsu.Trees.RedGreen.Sample.SampleVisitor { + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitSemicolonToken(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample node) => + node.Update(); + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitAssignmentStatement(global::Tsu.Trees.RedGreen.Sample.AssignmentStatement node) => + node.Update((global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample?)Visit(node.Semicolon) ?? throw new global::System.InvalidOperationException("Semicolon cannot be null."), (global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample?)Visit(node.Identifier) ?? throw new global::System.InvalidOperationException("Identifier cannot be null."), (global::Tsu.Trees.RedGreen.Sample.ExpressionSample?)Visit(node.Value) ?? throw new global::System.InvalidOperationException("Value cannot be null.")); + public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitExpressionStatement(global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample node) => + node.Update((global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample?)Visit(node.Semicolon) ?? throw new global::System.InvalidOperationException("Semicolon cannot be null."), (global::Tsu.Trees.RedGreen.Sample.ExpressionSample?)Visit(node.Expression) ?? throw new global::System.InvalidOperationException("Expression cannot be null.")); public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitIdentifierExpression(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample node) => node.Update(node.Name); public override global::Tsu.Trees.RedGreen.Sample.SampleNode VisitNumericalLiteralExpression(global::Tsu.Trees.RedGreen.Sample.NumericalLiteralExpressionSample node) => @@ -112,6 +133,15 @@ public partial class SampleRewriter : Tsu.Trees.RedGreen.Sample.SampleVisitor + (global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample) global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.SemicolonToken().CreateRed(); + + public static global::Tsu.Trees.RedGreen.Sample.AssignmentStatement AssignmentStatement(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.ExpressionSample value) => + (global::Tsu.Trees.RedGreen.Sample.AssignmentStatement) global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.AssignmentStatement((global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample)semicolon.Green, (global::Tsu.Trees.RedGreen.Sample.Internal.IdentifierExpressionSample)identifier.Green, (global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample)value.Green).CreateRed(); + + public static global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample ExpressionStatement(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.ExpressionSample expression) => + (global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample) global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.ExpressionStatement((global::Tsu.Trees.RedGreen.Sample.Internal.SemicolonTokenSample)semicolon.Green, (global::Tsu.Trees.RedGreen.Sample.Internal.ExpressionSample)expression.Green).CreateRed(); + public static global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample IdentifierExpression(global::System.String name) => (global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample) global::Tsu.Trees.RedGreen.Sample.Internal.SampleFactory.IdentifierExpression(name).CreateRed(); diff --git a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Red.g.cs b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Red.g.cs index 542fdfc..fc68813 100644 --- a/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Red.g.cs +++ b/Tsu.Trees.RedGreen/sample/Generated/Tsu.Trees.RedGreen.SourceGenerator/Tsu.Trees.RedGreen.SourceGenerator.Generator/Sample.Red.g.cs @@ -162,25 +162,25 @@ internal ExpressionSample(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode g public sealed partial class FunctionCallExpressionSample : global::Tsu.Trees.RedGreen.Sample.ExpressionSample { - private global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample? identifier; - private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? firstArg; - private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? secondArg; + private global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample? _identifier; + private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? _firstArg; + private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? _secondArg; internal FunctionCallExpressionSample(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode green, global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) : base(green, parent) { } - public global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample Identifier => GetRed(ref this.identifier, 0)!; - public global::Tsu.Trees.RedGreen.Sample.ExpressionSample FirstArg => GetRed(ref this.firstArg, 1)!; - public global::Tsu.Trees.RedGreen.Sample.ExpressionSample? SecondArg => GetRed(ref this.secondArg, 2); + public global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample Identifier => GetRed(ref this._identifier, 0)!; + public global::Tsu.Trees.RedGreen.Sample.ExpressionSample FirstArg => GetRed(ref this._firstArg, 1)!; + public global::Tsu.Trees.RedGreen.Sample.ExpressionSample? SecondArg => GetRed(ref this._secondArg, 2); internal override global::Tsu.Trees.RedGreen.Sample.SampleNode? GetNodeSlot(int index) => index switch { - 0 => GetRed(ref this.identifier, 0)!, - 1 => GetRed(ref this.firstArg, 1)!, - 2 => GetRed(ref this.secondArg, 2), + 0 => GetRed(ref this._identifier, 0)!, + 1 => GetRed(ref this._firstArg, 1)!, + 2 => GetRed(ref this._secondArg, 2), _ => null }; [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] @@ -336,5 +336,141 @@ internal IdentifierExpressionSample(global::Tsu.Trees.RedGreen.Sample.Internal.G public global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample WithName(global::System.String name) => this.Update(name); } + + public abstract partial class StatementSample : global::Tsu.Trees.RedGreen.Sample.SampleNode + { + private global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample? _semicolon; + + internal StatementSample(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode green, global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) + : base(green, parent) + { + } + + public abstract global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample Semicolon { get; } + + } + + public sealed partial class ExpressionStatementSample : global::Tsu.Trees.RedGreen.Sample.StatementSample + { + private global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample? _semicolon; + private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? _expression; + + internal ExpressionStatementSample(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode green, global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) + : base(green, parent) + { + } + + public override global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample Semicolon => GetRed(ref this._semicolon, 0)!; + public global::Tsu.Trees.RedGreen.Sample.ExpressionSample Expression => GetRed(ref this._expression, 1)!; + + internal override global::Tsu.Trees.RedGreen.Sample.SampleNode? GetNodeSlot(int index) => + index switch + { + 0 => GetRed(ref this._semicolon, 0)!, + 1 => GetRed(ref this._expression, 1)!, + _ => null + }; + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitExpressionStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitExpressionStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1) => visitor.VisitExpressionStatement(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitExpressionStatement(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitExpressionStatement(this, arg1, arg2, arg3); + + public global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample Update(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.ExpressionSample expression) + { + if (semicolon != this.Semicolon && expression != this.Expression) + { + return global::Tsu.Trees.RedGreen.Sample.SampleFactory.ExpressionStatement(semicolon, expression); + } + + return this; + } + + public global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample WithSemicolon(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon) => this.Update(semicolon, this.Expression); + + public global::Tsu.Trees.RedGreen.Sample.ExpressionStatementSample WithExpression(global::Tsu.Trees.RedGreen.Sample.ExpressionSample expression) => this.Update(this.Semicolon, expression); + } + + public sealed partial class AssignmentStatement : global::Tsu.Trees.RedGreen.Sample.StatementSample + { + private global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample? _semicolon; + private global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample? _identifier; + private global::Tsu.Trees.RedGreen.Sample.ExpressionSample? _value; + + internal AssignmentStatement(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode green, global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) + : base(green, parent) + { + } + + public override global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample Semicolon => GetRed(ref this._semicolon, 0)!; + public global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample Identifier => GetRed(ref this._identifier, 1)!; + public global::Tsu.Trees.RedGreen.Sample.ExpressionSample Value => GetRed(ref this._value, 2)!; + + internal override global::Tsu.Trees.RedGreen.Sample.SampleNode? GetNodeSlot(int index) => + index switch + { + 0 => GetRed(ref this._semicolon, 0)!, + 1 => GetRed(ref this._identifier, 1)!, + 2 => GetRed(ref this._value, 2)!, + _ => null + }; + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitAssignmentStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitAssignmentStatement(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1) => visitor.VisitAssignmentStatement(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitAssignmentStatement(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitAssignmentStatement(this, arg1, arg2, arg3); + + public global::Tsu.Trees.RedGreen.Sample.AssignmentStatement Update(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon, global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample identifier, global::Tsu.Trees.RedGreen.Sample.ExpressionSample value) + { + if (semicolon != this.Semicolon && identifier != this.Identifier && value != this.Value) + { + return global::Tsu.Trees.RedGreen.Sample.SampleFactory.AssignmentStatement(semicolon, identifier, value); + } + + return this; + } + + public global::Tsu.Trees.RedGreen.Sample.AssignmentStatement WithSemicolon(global::Tsu.Trees.RedGreen.Sample.SemicolonTokenSample semicolon) => this.Update(semicolon, this.Identifier, this.Value); + + public global::Tsu.Trees.RedGreen.Sample.AssignmentStatement WithIdentifier(global::Tsu.Trees.RedGreen.Sample.IdentifierExpressionSample identifier) => this.Update(this.Semicolon, identifier, this.Value); + + public global::Tsu.Trees.RedGreen.Sample.AssignmentStatement WithValue(global::Tsu.Trees.RedGreen.Sample.ExpressionSample value) => this.Update(this.Semicolon, this.Identifier, value); + } + + public sealed partial class SemicolonTokenSample : global::Tsu.Trees.RedGreen.Sample.SampleNode + { + + internal SemicolonTokenSample(global::Tsu.Trees.RedGreen.Sample.Internal.GreenNode green, global::Tsu.Trees.RedGreen.Sample.SampleNode? parent) + : base(green, parent) + { + } + + + internal override global::Tsu.Trees.RedGreen.Sample.SampleNode? GetNodeSlot(int index) => + index switch + { + _ => null + }; + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override void Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitSemicolonToken(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor) => visitor.VisitSemicolonToken(this); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1) => visitor.VisitSemicolonToken(this, arg1); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2) => visitor.VisitSemicolonToken(this, arg1, arg2); + [return: global::System.Diagnostics.CodeAnalysis.MaybeNull] + public override TResult Accept(Tsu.Trees.RedGreen.Sample.SampleVisitor visitor, T1 arg1, T2 arg2, T3 arg3) => visitor.VisitSemicolonToken(this, arg1, arg2, arg3); + } } diff --git a/Tsu.Trees.RedGreen/sample/Tree.cs b/Tsu.Trees.RedGreen/sample/Tree.cs index 7dbee9e..db2b5b0 100644 --- a/Tsu.Trees.RedGreen/sample/Tree.cs +++ b/Tsu.Trees.RedGreen/sample/Tree.cs @@ -4,6 +4,7 @@ namespace Tsu.Trees.RedGreen.Sample { public enum SampleKind { + SemicolonToken, IdentifierExpression, NumericalLiteralExpression, @@ -13,6 +14,9 @@ public enum SampleKind DivisionExpression, FunctionCallExpression, + + AssignmentStatement, + ExpressionStatement, } public abstract partial class SampleNode @@ -28,6 +32,11 @@ internal abstract partial class GreenNode { } + [GreenNode(SampleKind.SemicolonToken)] + internal sealed partial class SemicolonTokenSample : GreenNode + { + } + internal abstract partial class ExpressionSample : GreenNode { } @@ -54,8 +63,26 @@ internal sealed partial class BinaryOperationExpressionSample : ExpressionSample [GreenNode(SampleKind.FunctionCallExpression)] internal sealed partial class FunctionCallExpressionSample : ExpressionSample { - private readonly IdentifierExpressionSample identifier; - private readonly ExpressionSample firstArg; - private readonly ExpressionSample? secondArg; + private readonly IdentifierExpressionSample _identifier; + private readonly ExpressionSample _firstArg; + private readonly ExpressionSample? _secondArg; + } + + internal abstract partial class StatementSample : GreenNode + { + protected readonly SemicolonTokenSample _semicolon; + } + + [GreenNode(SampleKind.AssignmentStatement)] + internal sealed partial class AssignmentStatement : StatementSample + { + private readonly IdentifierExpressionSample _identifier; + private readonly ExpressionSample _value; + } + + [GreenNode(SampleKind.ExpressionStatement)] + internal sealed partial class ExpressionStatementSample : StatementSample + { + private readonly ExpressionSample _expression; } } \ No newline at end of file diff --git a/Tsu.Trees.RedGreen/sourcegen/RedTreeGenerator.cs b/Tsu.Trees.RedGreen/sourcegen/RedTreeGenerator.cs index 499a126..bb8e16c 100644 --- a/Tsu.Trees.RedGreen/sourcegen/RedTreeGenerator.cs +++ b/Tsu.Trees.RedGreen/sourcegen/RedTreeGenerator.cs @@ -355,7 +355,10 @@ private static void WriteRedNode(this IndentedTextWriter writer, Tree tree, Node { foreach (var component in node.NodeComponents) { - writer.WriteLine($"public abstract {component.Type.ToCSharpString()} {component.PropertyName};"); + var ns = component.Type.ContainingNamespace; + if (component.Type.DerivesFrom(tree.GreenBase)) + ns = tree.RedBase.ContainingNamespace; + writer.WriteLine($"public abstract {ns.ToCSharpString(false)}.{component.Type.Name}{(component.IsOptional ? "?" : "")} {component.PropertyName} {{ get; }}"); } } else @@ -365,7 +368,7 @@ private static void WriteRedNode(this IndentedTextWriter writer, Tree tree, Node if (extra.FieldName == "_kind") continue; writer.WriteLine("public {0}{1} {2} => (({3})this.Green).{2};", - extra.PassToBase ? " override" : "", + extra.PassToBase ? "override " : "", extra.Type.ToCSharpString(), extra.PropertyName, node.TypeSymbol.ToCSharpString(false)); @@ -374,7 +377,7 @@ private static void WriteRedNode(this IndentedTextWriter writer, Tree tree, Node { var child = node.Children[idx]; writer.WriteLine("public {0}{1}.{2} {3} => GetRed(ref this.{4}, {5}){6};", - child.PassToBase ? " override" : "", + child.PassToBase ? "override " : "", tree.RedBase.ContainingNamespace.ToCSharpString(false), child.Type.Name + (child.IsOptional ? "?" : ""), child.PropertyName,