public void CompareSyntax()
{
var source = @"
using System;
class Program
{
static void Main()
{
var i = 0.0;
i += 1 + 2L;
}
}";
var tree1 = SyntaxTree.ParseText(source);
var tree2 = SyntaxTree.ParseText(source);
SyntaxNode node1 = tree1.GetRoot();
SyntaxNode node2 = tree2.GetRoot();
// Compare trees and nodes that are identical.
Assert.IsTrue(tree1.IsEquivalentTo(tree2));
Assert.IsTrue(node1.EquivalentTo(node2));
Assert.IsTrue(Syntax.AreEquivalent(node1, node2, topLevel: false));
Assert.IsTrue(Syntax.AreEquivalent(tree1, tree2, topLevel: false));
// tree3 is identical to tree1 except for a single comment.
var tree3 = SyntaxTree.ParseText(@"
using System;
class Program
{
// Additional comment.
static void Main()
{
var i = 0.0;
i += 1 + 2L;
}
}");
SyntaxNode node3 = tree3.GetRoot();
// Compare trees and nodes that are identical except for trivia.
Assert.IsTrue(tree1.IsEquivalentTo(tree3)); // Trivia differences are ignored.
Assert.IsFalse(node1.EquivalentTo(node3)); // Trivia differences are considered.
Assert.IsTrue(Syntax.AreEquivalent(node1, node3, topLevel: false)); // Trivia differences are ignored.
Assert.IsTrue(Syntax.AreEquivalent(tree1, tree3, topLevel: false)); // Trivia differences are ignored.
// tree4 is identical to tree1 except for method body contents.
var tree4 = SyntaxTree.ParseText(@"using System;
class Program
{
static void Main()
{
}
}");
SyntaxNode node4 = tree4.GetRoot();
// Compare trees and nodes that are identical at the top-level.
Assert.IsTrue(tree1.IsEquivalentTo(tree4, topLevel: true)); // Only top-level nodes are considered.
Assert.IsFalse(node1.EquivalentTo(node4)); // Non-top-level nodes are considered.
Assert.IsTrue(Syntax.AreEquivalent(node1, node4, topLevel: true)); // Only top-level nodes are considered.
Assert.IsTrue(Syntax.AreEquivalent(tree1, tree4, topLevel: true)); // Only top-level nodes are considered.
// Tokens and Trivia can also be compared.
SyntaxToken token1 = node1.DescendantTokens().First();
SyntaxToken token2 = node2.DescendantTokens().First();
Assert.IsTrue(token1.EquivalentTo(token2));
SyntaxTrivia trivia1 = node1.DescendantTrivia().First(t => t.Kind == SyntaxKind.WhitespaceTrivia);
SyntaxTrivia trivia2 = node2.DescendantTrivia().Last(t => t.Kind == SyntaxKind.EndOfLineTrivia);
Assert.IsFalse(trivia1.EquivalentTo(trivia2));
}