public void UseSymbolicInformationPlusRewriterToMakeCodeChanges()
{
var tree = SyntaxTree.ParseText(@"
using System;
class Program
{
static void Main()
{
C x = new C();
C.ReferenceEquals(x, x);
}
}
class C
{
C y = null;
public C()
{
y = new C();
}
}");
var compilation = Compilation.Create("MyCompilation")
.AddReferences(MetadataReference.CreateAssemblyReference("mscorlib"))
.AddSyntaxTrees(tree);
var model = compilation.GetSemanticModel(tree);
// Get the ClassDeclarationSyntax corresponding to 'class C' above.
ClassDeclarationSyntax classDeclaration = tree.GetRoot()
.DescendantNodes().OfType<ClassDeclarationSyntax>()
.Single(c => c.Identifier.ToString() == "C");
// Get Symbol corresponding to class C above.
TypeSymbol searchSymbol = model.GetDeclaredSymbol(classDeclaration);
SyntaxNode oldRoot = tree.GetRoot();
var rewriter = new ClassRenamer()
{
SearchSymbol = searchSymbol,
SemanticModel = model,
NewName = "C1"
};
SyntaxNode newRoot = rewriter.Visit(oldRoot);
Assert.AreEqual(@"
using System;
class Program
{
static void Main()
{
C1 x = new C1();
C1.ReferenceEquals(x, x);
}
}
class C1
{
C1 y = null;
public C1()
{
y = new C1();
}
}", newRoot.ToFullString());
}