diff --git a/Parser.Tests/MParserShould.cs b/Parser.Tests/MParserShould.cs
index 249a23b..a586436 100644
--- a/Parser.Tests/MParserShould.cs
+++ b/Parser.Tests/MParserShould.cs
@@ -1,4 +1,5 @@
using Xunit;
+using FluentAssertions;
namespace Parser.Tests
{
@@ -95,7 +96,7 @@ namespace Parser.Tests
[Fact]
public void ProvidePosition()
{
- var text = "2 + 3";
+ var text = "% Comment\n 2 + 3";
var sut = GetSut(text);
var actual = sut.Parse();
var statement = actual.Root.Body.Statements[0].AsNode() as ExpressionStatementSyntaxNode;
@@ -104,8 +105,29 @@ namespace Parser.Tests
var operation = expression.Operation;
var rhs = expression.Rhs;
Assert.Equal(0, lhs.Position);
- Assert.Equal(2, operation.Position);
- Assert.Equal(4, rhs.Position);
+ Assert.Equal(14, operation.Position);
+ Assert.Equal(16, rhs.Position);
+ }
+
+ [Fact]
+ public void ProvideFullSpan()
+ {
+ var text = "% Comment\n 2 + 3";
+ var sut = GetSut(text);
+ var actual = sut.Parse();
+ var statement = actual.Root.Body.Statements[0].AsNode() as ExpressionStatementSyntaxNode;
+ var expression = statement!.Expression as BinaryOperationExpressionSyntaxNode;
+ var lhs = expression!.Lhs;
+ var operation = expression.Operation;
+ var rhs = expression.Rhs;
+ expression.FullSpan.Start.Should().Be(0);
+ expression.FullSpan.End.Should().Be(17);
+ lhs.FullSpan.Start.Should().Be(0);
+ lhs.FullSpan.End.Should().Be(14);
+ operation.FullSpan.Start.Should().Be(14);
+ operation.FullSpan.End.Should().Be(16);
+ rhs.FullSpan.Start.Should().Be(16);
+ rhs.FullSpan.End.Should().Be(17);
}
}
}
\ No newline at end of file
diff --git a/Parser.Tests/Parser.Tests.csproj b/Parser.Tests/Parser.Tests.csproj
index 2e800c8..c321274 100644
--- a/Parser.Tests/Parser.Tests.csproj
+++ b/Parser.Tests/Parser.Tests.csproj
@@ -6,6 +6,7 @@
8.0
+
diff --git a/Parser/SyntaxNode.cs b/Parser/SyntaxNode.cs
index e7eb31e..009acfd 100644
--- a/Parser/SyntaxNode.cs
+++ b/Parser/SyntaxNode.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using Parser.Internal;
+using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -13,6 +14,7 @@ namespace Parser
_parent = parent;
_green = green;
Position = position;
+ FullSpan = new TextSpan(Position, green.FullWidth);
}
private protected SyntaxNode(Internal.GreenNode green, int position)
@@ -20,6 +22,7 @@ namespace Parser
_parent = this;
_green = green;
Position = position;
+ FullSpan = new TextSpan(Position, green.FullWidth);
}
public TokenKind Kind => _green.Kind;
@@ -35,6 +38,10 @@ namespace Parser
public int Position { get; }
+ public TextSpan FullSpan { get; }
+
+ public int FullWidth => _green.FullWidth;
+
internal int GetChildPosition(int slot)
{
var result = Position;
@@ -75,8 +82,6 @@ namespace Parser
public virtual string FullText => _green.FullText;
- public int FullWidth => _green.FullWidth;
-
public virtual IReadOnlyList LeadingTrivia
{
get
diff --git a/Parser/SyntaxToken.cs b/Parser/SyntaxToken.cs
index 2b68968..7b1cc67 100644
--- a/Parser/SyntaxToken.cs
+++ b/Parser/SyntaxToken.cs
@@ -1,4 +1,5 @@
-using System;
+using Parser.Internal;
+using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -22,6 +23,7 @@ namespace Parser
_parent = parent;
_token = token ?? throw new ArgumentNullException(nameof(token));
Position = position;
+ FullSpan = new TextSpan(Position, token.FullWidth);
}
public SyntaxNode Parent => _parent;
@@ -29,6 +31,8 @@ namespace Parser
public int Position { get; }
+ public TextSpan FullSpan { get; }
+
public object? Value => _token.GetValue();
public bool Equals(SyntaxToken other)