diff --git a/Parser.Tests/MParserShould.cs b/Parser.Tests/MParserShould.cs index bd25500..a149205 100644 --- a/Parser.Tests/MParserShould.cs +++ b/Parser.Tests/MParserShould.cs @@ -52,5 +52,21 @@ namespace Parser.Tests var actual = sut.Parse(); Assert.Collection(actual.Diagnostics, item => Assert.Equal("Unexpected token 'SemicolonToken', expected 'IdentifierToken'.", item.Message)); } + + [Fact] + public void ProvidePosition() + { + var text = "2 + 3"; + var sut = GetSut(text); + var actual = sut.Parse(); + var statement = actual.Root.StatementList[0].AsNode() as ExpressionStatementSyntaxNode; + var expression = statement.Expression as BinaryOperationExpressionSyntaxNode; + var lhs = expression.Lhs; + var operation = expression.Operation; + var rhs = expression.Rhs; + Assert.Equal(0, lhs.Position); + Assert.Equal(2, operation.Position); + Assert.Equal(4, rhs.Position); + } } } \ No newline at end of file diff --git a/Parser/ChildNodesAndTokensList.cs b/Parser/ChildNodesAndTokensList.cs index f0501d1..59de5f9 100644 --- a/Parser/ChildNodesAndTokensList.cs +++ b/Parser/ChildNodesAndTokensList.cs @@ -90,7 +90,7 @@ namespace Parser return red; } // this is a token - return new SyntaxToken(listSlot, listSlot._green.GetSlot(index)); + return new SyntaxToken(listSlot, listSlot._green.GetSlot(index), _node.GetChildPosition(index)); } else { @@ -100,7 +100,7 @@ namespace Parser return red; } // this is a token - return new SyntaxToken(_node, _node._green.GetSlot(currentSlotIndex)); + return new SyntaxToken(_node, _node._green.GetSlot(currentSlotIndex), _node.GetChildPosition(currentSlotIndex)); } } diff --git a/Parser/Internal/GreenNode.cs b/Parser/Internal/GreenNode.cs index 7019f23..f938acc 100644 --- a/Parser/Internal/GreenNode.cs +++ b/Parser/Internal/GreenNode.cs @@ -23,7 +23,7 @@ namespace Parser.Internal _fullWidth = fullWidth; } - internal abstract Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent); + internal abstract Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position); protected int _fullWidth; diff --git a/Parser/Internal/SyntaxList.cs b/Parser/Internal/SyntaxList.cs index cc78df4..033c143 100644 --- a/Parser/Internal/SyntaxList.cs +++ b/Parser/Internal/SyntaxList.cs @@ -29,9 +29,9 @@ namespace Parser.Internal public override bool IsList => true; - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.SyntaxNodeOrTokenList(parent, this); + return new Parser.SyntaxNodeOrTokenList(parent, this, position); } } } \ No newline at end of file diff --git a/Parser/Internal/SyntaxList`1.cs b/Parser/Internal/SyntaxList`1.cs index 6d27536..2315ffc 100644 --- a/Parser/Internal/SyntaxList`1.cs +++ b/Parser/Internal/SyntaxList`1.cs @@ -26,9 +26,9 @@ public override bool IsList => true; - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.SyntaxNodeOrTokenList(parent, this); + return new Parser.SyntaxNodeOrTokenList(parent, this, position); } } } \ No newline at end of file diff --git a/Parser/Internal/SyntaxNode.Generated.cs b/Parser/Internal/SyntaxNode.Generated.cs index 0171ae1..baf7e9f 100644 --- a/Parser/Internal/SyntaxNode.Generated.cs +++ b/Parser/Internal/SyntaxNode.Generated.cs @@ -17,9 +17,9 @@ namespace Parser.Internal _endOfFile = endOfFile; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.FileSyntaxNode(parent, this); + return new Parser.FileSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -70,9 +70,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.FunctionDeclarationSyntaxNode(parent, this); + return new Parser.FunctionDeclarationSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -108,9 +108,9 @@ namespace Parser.Internal _assignmentSign = assignmentSign; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.FunctionOutputDescriptionSyntaxNode(parent, this); + return new Parser.FunctionOutputDescriptionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -145,9 +145,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.FunctionInputDescriptionSyntaxNode(parent, this); + return new Parser.FunctionInputDescriptionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -191,9 +191,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.SwitchStatementSyntaxNode(parent, this); + return new Parser.SwitchStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -235,9 +235,9 @@ namespace Parser.Internal _body = body; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.SwitchCaseSyntaxNode(parent, this); + return new Parser.SwitchCaseSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -282,9 +282,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.WhileStatementSyntaxNode(parent, this); + return new Parser.WhileStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -326,9 +326,9 @@ namespace Parser.Internal _body = body; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ElseifClause(parent, this); + return new Parser.ElseifClause(parent, this, position); } public override GreenNode GetSlot(int i) @@ -361,9 +361,9 @@ namespace Parser.Internal _body = body; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ElseClause(parent, this); + return new Parser.ElseClause(parent, this, position); } public override GreenNode GetSlot(int i) @@ -414,9 +414,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.IfStatementSyntaxNode(parent, this); + return new Parser.IfStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -464,9 +464,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ForStatementSyntaxNode(parent, this); + return new Parser.ForStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -504,9 +504,9 @@ namespace Parser.Internal _rhs = rhs; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.AssignmentExpressionSyntaxNode(parent, this); + return new Parser.AssignmentExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -538,9 +538,9 @@ namespace Parser.Internal _catchBody = catchBody; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.CatchClauseSyntaxNode(parent, this); + return new Parser.CatchClauseSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -579,9 +579,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.TryCatchStatementSyntaxNode(parent, this); + return new Parser.TryCatchStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -610,9 +610,9 @@ namespace Parser.Internal _expression = expression; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ExpressionStatementSyntaxNode(parent, this); + return new Parser.ExpressionStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -638,9 +638,9 @@ namespace Parser.Internal _semicolon = semicolon; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EmptyStatementSyntaxNode(parent, this); + return new Parser.EmptyStatementSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -662,9 +662,9 @@ namespace Parser.Internal Slots = 0; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EmptyExpressionSyntaxNode(parent, this); + return new Parser.EmptyExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -693,9 +693,9 @@ namespace Parser.Internal _operand = operand; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.UnaryPrefixOperationExpressionSyntaxNode(parent, this); + return new Parser.UnaryPrefixOperationExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -722,9 +722,9 @@ namespace Parser.Internal _nodes = nodes; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.CompoundNameSyntaxNode(parent, this); + return new Parser.CompoundNameSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -754,9 +754,9 @@ namespace Parser.Internal _functionName = functionName; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.NamedFunctionHandleSyntaxNode(parent, this); + return new Parser.NamedFunctionHandleSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -791,9 +791,9 @@ namespace Parser.Internal _body = body; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.LambdaSyntaxNode(parent, this); + return new Parser.LambdaSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -829,9 +829,9 @@ namespace Parser.Internal _rhs = rhs; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.BinaryOperationExpressionSyntaxNode(parent, this); + return new Parser.BinaryOperationExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -859,9 +859,9 @@ namespace Parser.Internal _name = name; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.IdentifierNameSyntaxNode(parent, this); + return new Parser.IdentifierNameSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -887,9 +887,9 @@ namespace Parser.Internal _number = number; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.NumberLiteralSyntaxNode(parent, this); + return new Parser.NumberLiteralSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -915,9 +915,9 @@ namespace Parser.Internal _stringToken = stringToken; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.StringLiteralSyntaxNode(parent, this); + return new Parser.StringLiteralSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -943,9 +943,9 @@ namespace Parser.Internal _stringToken = stringToken; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.DoubleQuotedStringLiteralSyntaxNode(parent, this); + return new Parser.DoubleQuotedStringLiteralSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -971,9 +971,9 @@ namespace Parser.Internal _stringToken = stringToken; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.UnquotedStringLiteralSyntaxNode(parent, this); + return new Parser.UnquotedStringLiteralSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1007,9 +1007,9 @@ namespace Parser.Internal _closingSquareBracket = closingSquareBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ArrayLiteralExpressionSyntaxNode(parent, this); + return new Parser.ArrayLiteralExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1045,9 +1045,9 @@ namespace Parser.Internal _closingBrace = closingBrace; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.CellArrayLiteralExpressionSyntaxNode(parent, this); + return new Parser.CellArrayLiteralExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1083,9 +1083,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ParenthesizedExpressionSyntaxNode(parent, this); + return new Parser.ParenthesizedExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1125,9 +1125,9 @@ namespace Parser.Internal _closingBrace = closingBrace; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.CellArrayElementAccessExpressionSyntaxNode(parent, this); + return new Parser.CellArrayElementAccessExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1168,9 +1168,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.FunctionCallExpressionSyntaxNode(parent, this); + return new Parser.FunctionCallExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1207,9 +1207,9 @@ namespace Parser.Internal _rightOperand = rightOperand; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.MemberAccessSyntaxNode(parent, this); + return new Parser.MemberAccessSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1241,9 +1241,9 @@ namespace Parser.Internal _operation = operation; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.UnaryPostixOperationExpressionSyntaxNode(parent, this); + return new Parser.UnaryPostixOperationExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1278,9 +1278,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.IndirectMemberAccessSyntaxNode(parent, this); + return new Parser.IndirectMemberAccessSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1312,9 +1312,9 @@ namespace Parser.Internal _arguments = arguments; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.CommandExpressionSyntaxNode(parent, this); + return new Parser.CommandExpressionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1349,9 +1349,9 @@ namespace Parser.Internal _baseClassNameAndArguments = baseClassNameAndArguments; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.BaseClassInvokationSyntaxNode(parent, this); + return new Parser.BaseClassInvokationSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1383,9 +1383,9 @@ namespace Parser.Internal _value = value; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.AttributeAssignmentSyntaxNode(parent, this); + return new Parser.AttributeAssignmentSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1416,9 +1416,9 @@ namespace Parser.Internal _assignment = assignment; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.AttributeSyntaxNode(parent, this); + return new Parser.AttributeSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1453,9 +1453,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.AttributeListSyntaxNode(parent, this); + return new Parser.AttributeListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1507,9 +1507,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.MethodDefinitionSyntaxNode(parent, this); + return new Parser.MethodDefinitionSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1549,9 +1549,9 @@ namespace Parser.Internal _inputDescription = inputDescription; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.AbstractMethodDeclarationSyntaxNode(parent, this); + return new Parser.AbstractMethodDeclarationSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1591,9 +1591,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.MethodsListSyntaxNode(parent, this); + return new Parser.MethodsListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1634,9 +1634,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.PropertiesListSyntaxNode(parent, this); + return new Parser.PropertiesListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1669,9 +1669,9 @@ namespace Parser.Internal _baseClasses = baseClasses; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.BaseClassListSyntaxNode(parent, this); + return new Parser.BaseClassListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1718,9 +1718,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.ClassDeclarationSyntaxNode(parent, this); + return new Parser.ClassDeclarationSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1759,9 +1759,9 @@ namespace Parser.Internal _closingBracket = closingBracket; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EnumerationItemValueSyntaxNode(parent, this); + return new Parser.EnumerationItemValueSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1797,9 +1797,9 @@ namespace Parser.Internal _commas = commas; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EnumerationItemSyntaxNode(parent, this); + return new Parser.EnumerationItemSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1839,9 +1839,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EnumerationListSyntaxNode(parent, this); + return new Parser.EnumerationListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) @@ -1882,9 +1882,9 @@ namespace Parser.Internal _endKeyword = endKeyword; } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { - return new Parser.EventsListSyntaxNode(parent, this); + return new Parser.EventsListSyntaxNode(parent, this, position); } public override GreenNode GetSlot(int i) diff --git a/Parser/Internal/SyntaxToken.cs b/Parser/Internal/SyntaxToken.cs index d0f3e9e..b230044 100644 --- a/Parser/Internal/SyntaxToken.cs +++ b/Parser/Internal/SyntaxToken.cs @@ -208,7 +208,7 @@ namespace Parser.Internal throw new System.InvalidOperationException(); } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { throw new InvalidOperationException(); } diff --git a/Parser/Internal/SyntaxTrivia.cs b/Parser/Internal/SyntaxTrivia.cs index 5bbc01a..3d74c34 100644 --- a/Parser/Internal/SyntaxTrivia.cs +++ b/Parser/Internal/SyntaxTrivia.cs @@ -22,7 +22,7 @@ namespace Parser.Internal throw new System.NotImplementedException(); } - internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent) + internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position) { throw new InvalidOperationException(); } diff --git a/Parser/MParser.cs b/Parser/MParser.cs index b514c75..8a3d7a1 100644 --- a/Parser/MParser.cs +++ b/Parser/MParser.cs @@ -23,7 +23,7 @@ namespace Parser var green = parser.ParseFile(); var parserDiagnostics = parser.Diagnostics; var totalDiagnostics = new DiagnosticsBag(lexerDiagnostics.Concat(parserDiagnostics)); - var root = new FileSyntaxNode(null, green); + var root = new FileSyntaxNode(null, green, 0); return new SyntaxTree(root, totalDiagnostics); } } diff --git a/Parser/SyntaxNode.Generated.cs b/Parser/SyntaxNode.Generated.cs index 22ef17d..a621d93 100644 --- a/Parser/SyntaxNode.Generated.cs +++ b/Parser/SyntaxNode.Generated.cs @@ -4,13 +4,13 @@ namespace Parser { private SyntaxNode _statementList; - internal FileSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FileSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken EndOfFile { - get { return new SyntaxToken(this, ((Parser.Internal.FileSyntaxNode)_green)._endOfFile); } + get { return new SyntaxToken(this, ((Parser.Internal.FileSyntaxNode)_green)._endOfFile, this.GetChildPosition(1)); } } public SyntaxNodeOrTokenList StatementList @@ -48,23 +48,23 @@ namespace Parser private SyntaxNode _commas; private SyntaxNode _body; - internal FunctionDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FunctionDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken FunctionKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._functionKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._functionKeyword, this.GetChildPosition(0)); } } public SyntaxToken Name { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._name); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._name, this.GetChildPosition(2)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionDeclarationSyntaxNode)_green)._endKeyword, this.GetChildPosition(6)); } } public FunctionOutputDescriptionSyntaxNode OutputDescription @@ -138,13 +138,13 @@ namespace Parser { private SyntaxNode _outputList; - internal FunctionOutputDescriptionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FunctionOutputDescriptionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AssignmentSign { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionOutputDescriptionSyntaxNode)_green)._assignmentSign); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionOutputDescriptionSyntaxNode)_green)._assignmentSign, this.GetChildPosition(1)); } } public SyntaxNodeOrTokenList OutputList @@ -179,18 +179,18 @@ namespace Parser { private SyntaxNode _parameterList; - internal FunctionInputDescriptionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FunctionInputDescriptionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionInputDescriptionSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionInputDescriptionSyntaxNode)_green)._openingBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionInputDescriptionSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionInputDescriptionSyntaxNode)_green)._closingBracket, this.GetChildPosition(2)); } } public SyntaxNodeOrTokenList ParameterList @@ -227,18 +227,18 @@ namespace Parser private SyntaxNode _optionalCommas; private SyntaxNode _cases; - internal SwitchStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal SwitchStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken SwitchKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.SwitchStatementSyntaxNode)_green)._switchKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.SwitchStatementSyntaxNode)_green)._switchKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.SwitchStatementSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.SwitchStatementSyntaxNode)_green)._endKeyword, this.GetChildPosition(4)); } } public ExpressionSyntaxNode SwitchExpression @@ -301,13 +301,13 @@ namespace Parser private SyntaxNode _optionalCommas; private SyntaxNode _body; - internal SwitchCaseSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal SwitchCaseSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken CaseKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.SwitchCaseSyntaxNode)_green)._caseKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.SwitchCaseSyntaxNode)_green)._caseKeyword, this.GetChildPosition(0)); } } public ExpressionSyntaxNode CaseIdentifier @@ -370,18 +370,18 @@ namespace Parser private SyntaxNode _optionalCommas; private SyntaxNode _body; - internal WhileStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal WhileStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken WhileKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.WhileStatementSyntaxNode)_green)._whileKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.WhileStatementSyntaxNode)_green)._whileKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.WhileStatementSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.WhileStatementSyntaxNode)_green)._endKeyword, this.GetChildPosition(4)); } } public ExpressionSyntaxNode Condition @@ -444,13 +444,13 @@ namespace Parser private SyntaxNode _optionalCommas; private SyntaxNode _body; - internal ElseifClause(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ElseifClause(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken ElseifKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ElseifClause)_green)._elseifKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ElseifClause)_green)._elseifKeyword, this.GetChildPosition(0)); } } public ExpressionSyntaxNode Condition @@ -511,13 +511,13 @@ namespace Parser { private SyntaxNode _body; - internal ElseClause(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ElseClause(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken ElseKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ElseClause)_green)._elseKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ElseClause)_green)._elseKeyword, this.GetChildPosition(0)); } } public SyntaxNodeOrTokenList Body @@ -556,18 +556,18 @@ namespace Parser private SyntaxNode _elseifClauses; private SyntaxNode _elseClause; - internal IfStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal IfStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken IfKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.IfStatementSyntaxNode)_green)._ifKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.IfStatementSyntaxNode)_green)._ifKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.IfStatementSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.IfStatementSyntaxNode)_green)._endKeyword, this.GetChildPosition(6)); } } public ExpressionSyntaxNode Condition @@ -656,18 +656,18 @@ namespace Parser private SyntaxNode _optionalCommas; private SyntaxNode _body; - internal ForStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ForStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken ForKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ForStatementSyntaxNode)_green)._forKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ForStatementSyntaxNode)_green)._forKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ForStatementSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ForStatementSyntaxNode)_green)._endKeyword, this.GetChildPosition(4)); } } public AssignmentExpressionSyntaxNode Assignment @@ -729,13 +729,13 @@ namespace Parser private SyntaxNode _lhs; private SyntaxNode _rhs; - internal AssignmentExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal AssignmentExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AssignmentSign { - get { return new SyntaxToken(this, ((Parser.Internal.AssignmentExpressionSyntaxNode)_green)._assignmentSign); } + get { return new SyntaxToken(this, ((Parser.Internal.AssignmentExpressionSyntaxNode)_green)._assignmentSign, this.GetChildPosition(1)); } } public ExpressionSyntaxNode Lhs @@ -783,13 +783,13 @@ namespace Parser { private SyntaxNode _catchBody; - internal CatchClauseSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal CatchClauseSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken CatchKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.CatchClauseSyntaxNode)_green)._catchKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.CatchClauseSyntaxNode)_green)._catchKeyword, this.GetChildPosition(0)); } } public SyntaxNodeOrTokenList CatchBody @@ -825,18 +825,18 @@ namespace Parser private SyntaxNode _tryBody; private SyntaxNode _catchClause; - internal TryCatchStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal TryCatchStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken TryKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.TryCatchStatementSyntaxNode)_green)._tryKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.TryCatchStatementSyntaxNode)_green)._tryKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.TryCatchStatementSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.TryCatchStatementSyntaxNode)_green)._endKeyword, this.GetChildPosition(3)); } } public SyntaxNodeOrTokenList TryBody @@ -884,7 +884,7 @@ namespace Parser { private SyntaxNode _expression; - internal ExpressionStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ExpressionStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -920,13 +920,13 @@ namespace Parser public class EmptyStatementSyntaxNode : StatementSyntaxNode { - internal EmptyStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EmptyStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Semicolon { - get { return new SyntaxToken(this, ((Parser.Internal.EmptyStatementSyntaxNode)_green)._semicolon); } + get { return new SyntaxToken(this, ((Parser.Internal.EmptyStatementSyntaxNode)_green)._semicolon, this.GetChildPosition(0)); } } @@ -948,7 +948,7 @@ namespace Parser public class EmptyExpressionSyntaxNode : ExpressionSyntaxNode { - internal EmptyExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EmptyExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -973,13 +973,13 @@ namespace Parser { private SyntaxNode _operand; - internal UnaryPrefixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal UnaryPrefixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Operation { - get { return new SyntaxToken(this, ((Parser.Internal.UnaryPrefixOperationExpressionSyntaxNode)_green)._operation); } + get { return new SyntaxToken(this, ((Parser.Internal.UnaryPrefixOperationExpressionSyntaxNode)_green)._operation, this.GetChildPosition(0)); } } public ExpressionSyntaxNode Operand @@ -1014,7 +1014,7 @@ namespace Parser { private SyntaxNode _nodes; - internal CompoundNameSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal CompoundNameSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -1051,13 +1051,13 @@ namespace Parser { private SyntaxNode _functionName; - internal NamedFunctionHandleSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal NamedFunctionHandleSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AtSign { - get { return new SyntaxToken(this, ((Parser.Internal.NamedFunctionHandleSyntaxNode)_green)._atSign); } + get { return new SyntaxToken(this, ((Parser.Internal.NamedFunctionHandleSyntaxNode)_green)._atSign, this.GetChildPosition(0)); } } public CompoundNameSyntaxNode FunctionName @@ -1093,13 +1093,13 @@ namespace Parser private SyntaxNode _input; private SyntaxNode _body; - internal LambdaSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal LambdaSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AtSign { - get { return new SyntaxToken(this, ((Parser.Internal.LambdaSyntaxNode)_green)._atSign); } + get { return new SyntaxToken(this, ((Parser.Internal.LambdaSyntaxNode)_green)._atSign, this.GetChildPosition(0)); } } public FunctionInputDescriptionSyntaxNode Input @@ -1148,13 +1148,13 @@ namespace Parser private SyntaxNode _lhs; private SyntaxNode _rhs; - internal BinaryOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal BinaryOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Operation { - get { return new SyntaxToken(this, ((Parser.Internal.BinaryOperationExpressionSyntaxNode)_green)._operation); } + get { return new SyntaxToken(this, ((Parser.Internal.BinaryOperationExpressionSyntaxNode)_green)._operation, this.GetChildPosition(1)); } } public ExpressionSyntaxNode Lhs @@ -1201,13 +1201,13 @@ namespace Parser public class IdentifierNameSyntaxNode : ExpressionSyntaxNode { - internal IdentifierNameSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal IdentifierNameSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Name { - get { return new SyntaxToken(this, ((Parser.Internal.IdentifierNameSyntaxNode)_green)._name); } + get { return new SyntaxToken(this, ((Parser.Internal.IdentifierNameSyntaxNode)_green)._name, this.GetChildPosition(0)); } } @@ -1229,13 +1229,13 @@ namespace Parser public class NumberLiteralSyntaxNode : ExpressionSyntaxNode { - internal NumberLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal NumberLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Number { - get { return new SyntaxToken(this, ((Parser.Internal.NumberLiteralSyntaxNode)_green)._number); } + get { return new SyntaxToken(this, ((Parser.Internal.NumberLiteralSyntaxNode)_green)._number, this.GetChildPosition(0)); } } @@ -1257,13 +1257,13 @@ namespace Parser public class StringLiteralSyntaxNode : ExpressionSyntaxNode { - internal StringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal StringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken StringToken { - get { return new SyntaxToken(this, ((Parser.Internal.StringLiteralSyntaxNode)_green)._stringToken); } + get { return new SyntaxToken(this, ((Parser.Internal.StringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0)); } } @@ -1285,13 +1285,13 @@ namespace Parser public class DoubleQuotedStringLiteralSyntaxNode : ExpressionSyntaxNode { - internal DoubleQuotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal DoubleQuotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken StringToken { - get { return new SyntaxToken(this, ((Parser.Internal.DoubleQuotedStringLiteralSyntaxNode)_green)._stringToken); } + get { return new SyntaxToken(this, ((Parser.Internal.DoubleQuotedStringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0)); } } @@ -1313,13 +1313,13 @@ namespace Parser public class UnquotedStringLiteralSyntaxNode : ExpressionSyntaxNode { - internal UnquotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal UnquotedStringLiteralSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken StringToken { - get { return new SyntaxToken(this, ((Parser.Internal.UnquotedStringLiteralSyntaxNode)_green)._stringToken); } + get { return new SyntaxToken(this, ((Parser.Internal.UnquotedStringLiteralSyntaxNode)_green)._stringToken, this.GetChildPosition(0)); } } @@ -1342,18 +1342,18 @@ namespace Parser { private SyntaxNode _nodes; - internal ArrayLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ArrayLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningSquareBracket { - get { return new SyntaxToken(this, ((Parser.Internal.ArrayLiteralExpressionSyntaxNode)_green)._openingSquareBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.ArrayLiteralExpressionSyntaxNode)_green)._openingSquareBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingSquareBracket { - get { return new SyntaxToken(this, ((Parser.Internal.ArrayLiteralExpressionSyntaxNode)_green)._closingSquareBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.ArrayLiteralExpressionSyntaxNode)_green)._closingSquareBracket, this.GetChildPosition(2)); } } public SyntaxNodeOrTokenList Nodes @@ -1388,18 +1388,18 @@ namespace Parser { private SyntaxNode _nodes; - internal CellArrayLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal CellArrayLiteralExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBrace { - get { return new SyntaxToken(this, ((Parser.Internal.CellArrayLiteralExpressionSyntaxNode)_green)._openingBrace); } + get { return new SyntaxToken(this, ((Parser.Internal.CellArrayLiteralExpressionSyntaxNode)_green)._openingBrace, this.GetChildPosition(0)); } } public SyntaxToken ClosingBrace { - get { return new SyntaxToken(this, ((Parser.Internal.CellArrayLiteralExpressionSyntaxNode)_green)._closingBrace); } + get { return new SyntaxToken(this, ((Parser.Internal.CellArrayLiteralExpressionSyntaxNode)_green)._closingBrace, this.GetChildPosition(2)); } } public SyntaxNodeOrTokenList Nodes @@ -1434,18 +1434,18 @@ namespace Parser { private SyntaxNode _expression; - internal ParenthesizedExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ParenthesizedExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.ParenthesizedExpressionSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.ParenthesizedExpressionSyntaxNode)_green)._openingBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.ParenthesizedExpressionSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.ParenthesizedExpressionSyntaxNode)_green)._closingBracket, this.GetChildPosition(2)); } } public ExpressionSyntaxNode Expression @@ -1481,18 +1481,18 @@ namespace Parser private SyntaxNode _expression; private SyntaxNode _nodes; - internal CellArrayElementAccessExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal CellArrayElementAccessExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBrace { - get { return new SyntaxToken(this, ((Parser.Internal.CellArrayElementAccessExpressionSyntaxNode)_green)._openingBrace); } + get { return new SyntaxToken(this, ((Parser.Internal.CellArrayElementAccessExpressionSyntaxNode)_green)._openingBrace, this.GetChildPosition(1)); } } public SyntaxToken ClosingBrace { - get { return new SyntaxToken(this, ((Parser.Internal.CellArrayElementAccessExpressionSyntaxNode)_green)._closingBrace); } + get { return new SyntaxToken(this, ((Parser.Internal.CellArrayElementAccessExpressionSyntaxNode)_green)._closingBrace, this.GetChildPosition(3)); } } public ExpressionSyntaxNode Expression @@ -1541,18 +1541,18 @@ namespace Parser private SyntaxNode _functionName; private SyntaxNode _nodes; - internal FunctionCallExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FunctionCallExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionCallExpressionSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionCallExpressionSyntaxNode)_green)._openingBracket, this.GetChildPosition(1)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.FunctionCallExpressionSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.FunctionCallExpressionSyntaxNode)_green)._closingBracket, this.GetChildPosition(3)); } } public ExpressionSyntaxNode FunctionName @@ -1601,13 +1601,13 @@ namespace Parser private SyntaxNode _leftOperand; private SyntaxNode _rightOperand; - internal MemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal MemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Dot { - get { return new SyntaxToken(this, ((Parser.Internal.MemberAccessSyntaxNode)_green)._dot); } + get { return new SyntaxToken(this, ((Parser.Internal.MemberAccessSyntaxNode)_green)._dot, this.GetChildPosition(1)); } } public SyntaxNode LeftOperand @@ -1655,13 +1655,13 @@ namespace Parser { private SyntaxNode _operand; - internal UnaryPostixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal UnaryPostixOperationExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken Operation { - get { return new SyntaxToken(this, ((Parser.Internal.UnaryPostixOperationExpressionSyntaxNode)_green)._operation); } + get { return new SyntaxToken(this, ((Parser.Internal.UnaryPostixOperationExpressionSyntaxNode)_green)._operation, this.GetChildPosition(1)); } } public ExpressionSyntaxNode Operand @@ -1696,18 +1696,18 @@ namespace Parser { private SyntaxNode _expression; - internal IndirectMemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal IndirectMemberAccessSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._openingBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.IndirectMemberAccessSyntaxNode)_green)._closingBracket, this.GetChildPosition(2)); } } public ExpressionSyntaxNode Expression @@ -1743,7 +1743,7 @@ namespace Parser private SyntaxNode _commandName; private SyntaxNode _arguments; - internal CommandExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal CommandExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -1794,13 +1794,13 @@ namespace Parser private SyntaxNode _methodName; private SyntaxNode _baseClassNameAndArguments; - internal BaseClassInvokationSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal BaseClassInvokationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AtSign { - get { return new SyntaxToken(this, ((Parser.Internal.BaseClassInvokationSyntaxNode)_green)._atSign); } + get { return new SyntaxToken(this, ((Parser.Internal.BaseClassInvokationSyntaxNode)_green)._atSign, this.GetChildPosition(1)); } } public ExpressionSyntaxNode MethodName @@ -1848,13 +1848,13 @@ namespace Parser { private SyntaxNode _value; - internal AttributeAssignmentSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal AttributeAssignmentSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken AssignmentSign { - get { return new SyntaxToken(this, ((Parser.Internal.AttributeAssignmentSyntaxNode)_green)._assignmentSign); } + get { return new SyntaxToken(this, ((Parser.Internal.AttributeAssignmentSyntaxNode)_green)._assignmentSign, this.GetChildPosition(0)); } } public ExpressionSyntaxNode Value @@ -1890,7 +1890,7 @@ namespace Parser private SyntaxNode _name; private SyntaxNode _assignment; - internal AttributeSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal AttributeSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -1940,18 +1940,18 @@ namespace Parser { private SyntaxNode _nodes; - internal AttributeListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal AttributeListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.AttributeListSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.AttributeListSyntaxNode)_green)._openingBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.AttributeListSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.AttributeListSyntaxNode)_green)._closingBracket, this.GetChildPosition(2)); } } public SyntaxNodeOrTokenList Nodes @@ -1990,18 +1990,18 @@ namespace Parser private SyntaxNode _commas; private SyntaxNode _body; - internal MethodDefinitionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal MethodDefinitionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken FunctionKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.MethodDefinitionSyntaxNode)_green)._functionKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.MethodDefinitionSyntaxNode)_green)._functionKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.MethodDefinitionSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.MethodDefinitionSyntaxNode)_green)._endKeyword, this.GetChildPosition(6)); } } public FunctionOutputDescriptionSyntaxNode OutputDescription @@ -2090,7 +2090,7 @@ namespace Parser private SyntaxNode _name; private SyntaxNode _inputDescription; - internal AbstractMethodDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal AbstractMethodDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -2154,18 +2154,18 @@ namespace Parser private SyntaxNode _attributes; private SyntaxNode _methods; - internal MethodsListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal MethodsListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken MethodsKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.MethodsListSyntaxNode)_green)._methodsKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.MethodsListSyntaxNode)_green)._methodsKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.MethodsListSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.MethodsListSyntaxNode)_green)._endKeyword, this.GetChildPosition(3)); } } public AttributeListSyntaxNode Attributes @@ -2214,18 +2214,18 @@ namespace Parser private SyntaxNode _attributes; private SyntaxNode _properties; - internal PropertiesListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal PropertiesListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken PropertiesKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.PropertiesListSyntaxNode)_green)._propertiesKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.PropertiesListSyntaxNode)_green)._propertiesKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.PropertiesListSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.PropertiesListSyntaxNode)_green)._endKeyword, this.GetChildPosition(3)); } } public AttributeListSyntaxNode Attributes @@ -2273,13 +2273,13 @@ namespace Parser { private SyntaxNode _baseClasses; - internal BaseClassListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal BaseClassListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken LessSign { - get { return new SyntaxToken(this, ((Parser.Internal.BaseClassListSyntaxNode)_green)._lessSign); } + get { return new SyntaxToken(this, ((Parser.Internal.BaseClassListSyntaxNode)_green)._lessSign, this.GetChildPosition(0)); } } public SyntaxNodeOrTokenList BaseClasses @@ -2317,18 +2317,18 @@ namespace Parser private SyntaxNode _baseClassList; private SyntaxNode _nodes; - internal ClassDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ClassDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken ClassdefKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ClassDeclarationSyntaxNode)_green)._classdefKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ClassDeclarationSyntaxNode)_green)._classdefKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.ClassDeclarationSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.ClassDeclarationSyntaxNode)_green)._endKeyword, this.GetChildPosition(5)); } } public AttributeListSyntaxNode Attributes @@ -2402,18 +2402,18 @@ namespace Parser { private SyntaxNode _values; - internal EnumerationItemValueSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EnumerationItemValueSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken OpeningBracket { - get { return new SyntaxToken(this, ((Parser.Internal.EnumerationItemValueSyntaxNode)_green)._openingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.EnumerationItemValueSyntaxNode)_green)._openingBracket, this.GetChildPosition(0)); } } public SyntaxToken ClosingBracket { - get { return new SyntaxToken(this, ((Parser.Internal.EnumerationItemValueSyntaxNode)_green)._closingBracket); } + get { return new SyntaxToken(this, ((Parser.Internal.EnumerationItemValueSyntaxNode)_green)._closingBracket, this.GetChildPosition(2)); } } public SyntaxNodeOrTokenList Values @@ -2450,7 +2450,7 @@ namespace Parser private SyntaxNode _values; private SyntaxNode _commas; - internal EnumerationItemSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EnumerationItemSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } @@ -2514,18 +2514,18 @@ namespace Parser private SyntaxNode _attributes; private SyntaxNode _items; - internal EnumerationListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EnumerationListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken EnumerationKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.EnumerationListSyntaxNode)_green)._enumerationKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.EnumerationListSyntaxNode)_green)._enumerationKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.EnumerationListSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.EnumerationListSyntaxNode)_green)._endKeyword, this.GetChildPosition(3)); } } public AttributeListSyntaxNode Attributes @@ -2574,18 +2574,18 @@ namespace Parser private SyntaxNode _attributes; private SyntaxNode _events; - internal EventsListSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal EventsListSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } public SyntaxToken EventsKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.EventsListSyntaxNode)_green)._eventsKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.EventsListSyntaxNode)_green)._eventsKeyword, this.GetChildPosition(0)); } } public SyntaxToken EndKeyword { - get { return new SyntaxToken(this, ((Parser.Internal.EventsListSyntaxNode)_green)._endKeyword); } + get { return new SyntaxToken(this, ((Parser.Internal.EventsListSyntaxNode)_green)._endKeyword, this.GetChildPosition(3)); } } public AttributeListSyntaxNode Attributes diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs index 67241e3..3031945 100644 --- a/Parser/SyntaxNode.cs +++ b/Parser/SyntaxNode.cs @@ -8,21 +8,41 @@ namespace Parser { private readonly SyntaxNode _parent; internal readonly Internal.GreenNode _green; - internal SyntaxNode(SyntaxNode parent, Internal.GreenNode green) + internal SyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) { _parent = parent; _green = green; + Position = position; } public TokenKind Kind => _green.Kind; public SyntaxNode Parent => _parent; + public int Slots => _green.Slots; + public ChildNodesAndTokensList GetChildNodesAndTokens() { return new ChildNodesAndTokensList(this); } + public int Position { get; } + + internal int GetChildPosition(int slot) + { + var result = Position; + while (slot > 0) + { + slot--; + var greenChild = _green.GetSlot(slot); + if (greenChild != null) + { + result += greenChild.FullWidth; + } + } + return result; + } + internal abstract SyntaxNode GetNode(int index); internal SyntaxNode GetRed(ref SyntaxNode field, int slot) @@ -32,7 +52,7 @@ namespace Parser var green = _green.GetSlot(slot); if (green != null) { - field = green.CreateRed(this); + field = green.CreateRed(this, this.GetChildPosition(slot)); } } @@ -73,28 +93,28 @@ namespace Parser public abstract class StatementSyntaxNode : SyntaxNode { - internal StatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal StatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } } public abstract class ExpressionSyntaxNode : SyntaxNode { - internal ExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal ExpressionSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } } public abstract class FunctionHandleSyntaxNode : ExpressionSyntaxNode { - internal FunctionHandleSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal FunctionHandleSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } } public abstract class MethodDeclarationSyntaxNode : StatementSyntaxNode { - internal MethodDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green) : base(parent, green) + internal MethodDeclarationSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position) : base(parent, green, position) { } } diff --git a/Parser/SyntaxNodeOrToken.cs b/Parser/SyntaxNodeOrToken.cs index 17a54a6..c81330e 100644 --- a/Parser/SyntaxNodeOrToken.cs +++ b/Parser/SyntaxNodeOrToken.cs @@ -11,18 +11,22 @@ _token = null; _nodeOrParent = node; _isToken = false; + Position = node.Position; } - internal SyntaxNodeOrToken(SyntaxNode parent, Internal.GreenNode token) + internal SyntaxNodeOrToken(SyntaxNode parent, Internal.GreenNode token, int position) { _token = token; _nodeOrParent = parent; _isToken = true; + Position = position; } public bool IsToken => _isToken; public bool IsNode => !IsToken; + public int Position { get; } + public SyntaxNode AsNode() { if (_isToken) @@ -39,12 +43,12 @@ { return default(SyntaxToken); } - return new SyntaxToken(_nodeOrParent, _token); + return new SyntaxToken(_nodeOrParent, _token, Position); } public static implicit operator SyntaxNodeOrToken(SyntaxToken token) { - return new SyntaxNodeOrToken(token.Parent, token.Token); + return new SyntaxNodeOrToken(token.Parent, token.Token, token.Position); } public static implicit operator SyntaxNodeOrToken(SyntaxNode node) diff --git a/Parser/SyntaxNodeOrTokenList.cs b/Parser/SyntaxNodeOrTokenList.cs index 7e6fdef..2e69337 100644 --- a/Parser/SyntaxNodeOrTokenList.cs +++ b/Parser/SyntaxNodeOrTokenList.cs @@ -7,7 +7,7 @@ namespace Parser { public class SyntaxNodeOrTokenList : SyntaxNode, IReadOnlyCollection { - internal SyntaxNodeOrTokenList(SyntaxNode parent, GreenNode green) : base(parent, green) + internal SyntaxNodeOrTokenList(SyntaxNode parent, GreenNode green, int position) : base(parent, green, position) { } @@ -20,11 +20,11 @@ namespace Parser var green = _green.GetSlot(index); if (green is Internal.SyntaxToken) { - return new SyntaxToken(this, green); + return new SyntaxToken(this, green, this.GetChildPosition(index)); } else { - return green.CreateRed(this); + return green.CreateRed(this, this.GetChildPosition(index)); } } throw new ArgumentOutOfRangeException(); diff --git a/Parser/SyntaxToken.cs b/Parser/SyntaxToken.cs index 9e9ba44..b62f474 100644 --- a/Parser/SyntaxToken.cs +++ b/Parser/SyntaxToken.cs @@ -17,15 +17,18 @@ namespace Parser return _token.ToString(); } - internal SyntaxToken(SyntaxNode parent, Internal.GreenNode token) + internal SyntaxToken(SyntaxNode parent, Internal.GreenNode token, int position) { _parent = parent; _token = token ?? throw new ArgumentNullException(nameof(token)); + Position = position; } public SyntaxNode Parent => _parent; internal Internal.GreenNode Token => _token; + public int Position { get; } + public bool Equals(SyntaxToken other) { return Equals(_parent, other._parent) && Equals(_token, other._token); diff --git a/SyntaxGenerator/GenerateSyntax.cs b/SyntaxGenerator/GenerateSyntax.cs index 19c4d8c..10ca108 100644 --- a/SyntaxGenerator/GenerateSyntax.cs +++ b/SyntaxGenerator/GenerateSyntax.cs @@ -94,9 +94,9 @@ namespace SyntaxGenerator private static string GenerateConstructor(SyntaxNodeDescription node) { - var arguments = "SyntaxNode parent, Internal.GreenNode green"; + var arguments = "SyntaxNode parent, Internal.GreenNode green, int position"; var header = - $" internal {node.ClassName}({arguments}) : base(parent, green)\n"; + $" internal {node.ClassName}({arguments}) : base(parent, green, position)\n"; return header + " {\n }\n"; } @@ -132,8 +132,8 @@ namespace SyntaxGenerator private static string GenerateCreateRed(SyntaxNodeDescription node) { - var header = $" internal override {OuterNamespace}.SyntaxNode CreateRed({OuterNamespace}.SyntaxNode parent)\n"; - var text = $" return new {OuterNamespace}.{node.ClassName}(parent, this);\n"; + var header = $" internal override {OuterNamespace}.SyntaxNode CreateRed({OuterNamespace}.SyntaxNode parent, int position)\n"; + var text = $" return new {OuterNamespace}.{node.ClassName}(parent, this, position);\n"; return header + " {\n" + text + " }\n"; } @@ -165,11 +165,11 @@ namespace SyntaxGenerator return s[0].ToString().ToUpper() + s.Substring(1, s.Length - 1); } - private static string GenerateTokenAccessor(SyntaxNodeDescription node, FieldDescription field) + private static string GenerateTokenAccessor(SyntaxNodeDescription node, FieldDescription field, int index) { var header = $" public SyntaxToken {Capitalize(field.FieldName)}\n"; var text = - $" get {{ return new SyntaxToken(this, (({InternalNamespace}.{node.ClassName})_green)._{field.FieldName}); }}"; + $" get {{ return new SyntaxToken(this, (({InternalNamespace}.{node.ClassName})_green)._{field.FieldName}, this.GetChildPosition({index})); }}"; return header + " {\n" + text + "\n }\n"; } @@ -236,7 +236,7 @@ namespace SyntaxGenerator var tokenAccessors = string.Join( "\n", - tokenSlots.Select(pair => GenerateTokenAccessor(node, pair.field))); + tokenSlots.Select(pair => GenerateTokenAccessor(node, pair.field, pair.index))); var nodeAccessors = string.Join( "\n",