提交 f0c4c0ac 编写于 作者: M mattwar

Fix implementation of HasLeadingTrivia and HasTrailingTrivia for SyntaxNode,...

Fix implementation of HasLeadingTrivia and HasTrailingTrivia for SyntaxNode, SyntaxToken and SyntaxNodeOrToken.

The previous implementation was incorrect when zero-length trivia (elastic markers) were the only trivia. (changeset 1394442)
上级 f66696e7
......@@ -2775,5 +2775,109 @@ static void Main(string[] args)
SyntaxTree BlankTree = null;
Assert.Throws<ArgumentNullException>(() => FirstUsingClause.SyntaxTree.GetChangedSpans(BlankTree));
}
[Fact]
public void TestTriviaExists()
{
// token constructed using factory w/o specifying trivia (should have zero-width elastic trivia)
var idToken = SyntaxFactory.Identifier("foo");
Assert.Equal(true, idToken.HasLeadingTrivia);
Assert.Equal(1, idToken.LeadingTrivia.Count);
Assert.Equal(0, idToken.LeadingTrivia.Span.Length); // zero-width elastic trivia
Assert.Equal(true, idToken.HasTrailingTrivia);
Assert.Equal(1, idToken.TrailingTrivia.Count);
Assert.Equal(0, idToken.TrailingTrivia.Span.Length); // zero-width elastic trivia
// token constructed by parser w/o trivia
idToken = SyntaxFactory.ParseToken("x");
Assert.Equal(false, idToken.HasLeadingTrivia);
Assert.Equal(0, idToken.LeadingTrivia.Count);
Assert.Equal(false, idToken.HasTrailingTrivia);
Assert.Equal(0, idToken.TrailingTrivia.Count);
// token constructed by parser with trivia
idToken = SyntaxFactory.ParseToken(" x ");
Assert.Equal(true, idToken.HasLeadingTrivia);
Assert.Equal(1, idToken.LeadingTrivia.Count);
Assert.Equal(1, idToken.LeadingTrivia.Span.Length);
Assert.Equal(true, idToken.HasTrailingTrivia);
Assert.Equal(1, idToken.TrailingTrivia.Count);
Assert.Equal(2, idToken.TrailingTrivia.Span.Length);
// node constructed using factory w/o specifying trivia
SyntaxNode namedNode = SyntaxFactory.IdentifierName("foo");
Assert.Equal(true, namedNode.HasLeadingTrivia);
Assert.Equal(1, namedNode.GetLeadingTrivia().Count);
Assert.Equal(0, namedNode.GetLeadingTrivia().Span.Length); // zero-width elastic trivia
Assert.Equal(true, namedNode.HasTrailingTrivia);
Assert.Equal(1, namedNode.GetTrailingTrivia().Count);
Assert.Equal(0, namedNode.GetTrailingTrivia().Span.Length); // zero-width elastic trivia
// node constructed by parse w/o trivia
namedNode = SyntaxFactory.ParseExpression("foo");
Assert.Equal(false, namedNode.HasLeadingTrivia);
Assert.Equal(0, namedNode.GetLeadingTrivia().Count);
Assert.Equal(false, namedNode.HasTrailingTrivia);
Assert.Equal(0, namedNode.GetTrailingTrivia().Count);
// node constructed by parse with trivia
namedNode = SyntaxFactory.ParseExpression(" foo ");
Assert.Equal(true, namedNode.HasLeadingTrivia);
Assert.Equal(1, namedNode.GetLeadingTrivia().Count);
Assert.Equal(1, namedNode.GetLeadingTrivia().Span.Length);
Assert.Equal(true, namedNode.HasTrailingTrivia);
Assert.Equal(1, namedNode.GetTrailingTrivia().Count);
Assert.Equal(2, namedNode.GetTrailingTrivia().Span.Length);
// nodeOrToken with token constructed from factory w/o specifying trivia
SyntaxNodeOrToken nodeOrToken = SyntaxFactory.Identifier("foo");
Assert.Equal(true, nodeOrToken.HasLeadingTrivia);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(0, nodeOrToken.GetLeadingTrivia().Span.Length); // zero-width elastic trivia
Assert.Equal(true, nodeOrToken.HasTrailingTrivia);
Assert.Equal(1, nodeOrToken.GetTrailingTrivia().Count);
Assert.Equal(0, nodeOrToken.GetTrailingTrivia().Span.Length); // zero-width elastic trivia
// nodeOrToken with node constructed from factory w/o specifying trivia
nodeOrToken = SyntaxFactory.IdentifierName("foo");
Assert.Equal(true, nodeOrToken.HasLeadingTrivia);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(0, nodeOrToken.GetLeadingTrivia().Span.Length); // zero-width elastic trivia
Assert.Equal(true, nodeOrToken.HasTrailingTrivia);
Assert.Equal(1, nodeOrToken.GetTrailingTrivia().Count);
Assert.Equal(0, nodeOrToken.GetTrailingTrivia().Span.Length); // zero-width elastic trivia
// nodeOrToken with token parsed from factory w/o trivia
nodeOrToken = SyntaxFactory.ParseToken("foo");
Assert.Equal(false, nodeOrToken.HasLeadingTrivia);
Assert.Equal(0, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(false, nodeOrToken.HasTrailingTrivia);
Assert.Equal(0, nodeOrToken.GetTrailingTrivia().Count);
// nodeOrToken with node parsed from factory w/o trivia
nodeOrToken = SyntaxFactory.ParseExpression("foo");
Assert.Equal(false, nodeOrToken.HasLeadingTrivia);
Assert.Equal(0, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(false, nodeOrToken.HasTrailingTrivia);
Assert.Equal(0, nodeOrToken.GetTrailingTrivia().Count);
// nodeOrToken with token parsed from factory with trivia
nodeOrToken = SyntaxFactory.ParseToken(" foo ");
Assert.Equal(true, nodeOrToken.HasLeadingTrivia);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Span.Length); // zero-width elastic trivia
Assert.Equal(true, nodeOrToken.HasTrailingTrivia);
Assert.Equal(1, nodeOrToken.GetTrailingTrivia().Count);
Assert.Equal(2, nodeOrToken.GetTrailingTrivia().Span.Length); // zero-width elastic trivia
// nodeOrToken with node parsed from factory with trivia
nodeOrToken = SyntaxFactory.ParseExpression(" foo ");
Assert.Equal(true, nodeOrToken.HasLeadingTrivia);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Count);
Assert.Equal(1, nodeOrToken.GetLeadingTrivia().Span.Length); // zero-width elastic trivia
Assert.Equal(true, nodeOrToken.HasTrailingTrivia);
Assert.Equal(1, nodeOrToken.GetTrailingTrivia().Count);
Assert.Equal(2, nodeOrToken.GetTrailingTrivia().Span.Length); // zero-width elastic trivia
}
}
}
......@@ -513,7 +513,7 @@ public bool HasLeadingTrivia
{
get
{
return this.Green.HasLeadingTrivia;
return this.GetLeadingTrivia().Count > 0;
}
}
......@@ -524,7 +524,7 @@ public bool HasTrailingTrivia
{
get
{
return this.Green.HasTrailingTrivia;
return this.GetTrailingTrivia().Count > 0;
}
}
......
......@@ -402,17 +402,7 @@ public bool HasLeadingTrivia
{
get
{
if (this.token != null)
{
return this.token.HasLeadingTrivia;
}
if (this.nodeOrParent != null)
{
return this.nodeOrParent.HasLeadingTrivia;
}
return false;
return this.GetLeadingTrivia().Count > 0;
}
}
......@@ -442,17 +432,7 @@ public bool HasTrailingTrivia
{
get
{
if (this.token != null)
{
return this.token.HasTrailingTrivia;
}
if (this.nodeOrParent != null)
{
return this.nodeOrParent.HasTrailingTrivia;
}
return false;
return this.GetTrailingTrivia().Count > 0;
}
}
......
......@@ -243,7 +243,7 @@ internal void WriteTo(System.IO.TextWriter writer, bool leading, bool trailing)
/// </summary>
public bool HasLeadingTrivia
{
get { return token != null && token.GetLeadingTriviaCore() != null; }
get { return this.LeadingTrivia.Count > 0; }
}
/// <summary>
......@@ -251,7 +251,7 @@ public bool HasLeadingTrivia
/// </summary>
public bool HasTrailingTrivia
{
get { return token != null && token.GetTrailingTriviaCore() != null; }
get { return this.TrailingTrivia.Count > 0; }
}
/// <summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册