private Document CreateSolutionDocument(string sourceText) { var pid = ProjectId.CreateNewId(); var did = DocumentId.CreateNewId(pid); var solution = new CustomWorkspace().CurrentSolution .AddProject(pid, "test", "test", LanguageNames.CSharp) .AddMetadataReference(pid, mscorlib) .AddDocument(did, "foo.cs", SourceText.From(sourceText)); return solution.GetDocument(did); }
public void TestTrackNodesWithDocument() { var pid = ProjectId.CreateNewId(); var did = DocumentId.CreateNewId(pid); var sourceText = @"public class C { void M() { } }"; var sol = new CustomWorkspace().CurrentSolution .AddProject(pid, "proj", "proj", LanguageNames.CSharp) .AddDocument(did, "doc", sourceText); var doc = sol.GetDocument(did); // find initial nodes of interest var root = doc.GetSyntaxRootAsync().Result; var classDecl = root.DescendantNodes().OfType <ClassDeclarationSyntax>().First(); var methodDecl = classDecl.DescendantNodes().OfType <MethodDeclarationSyntax>().First(); // track these nodes var trackedRoot = root.TrackNodes(classDecl, methodDecl); // use some fancy document centric rewrites var comp = doc.Project.GetCompilationAsync().Result; var cgenField = CodeGenerationSymbolFactory.CreateFieldSymbol( attributes: null, accessibility: Accessibility.Private, modifiers: new SymbolModifiers(), type: comp.GetSpecialType(SpecialType.System_Int32), name: "X"); var currentClassDecl = trackedRoot.GetCurrentNodes(classDecl).First(); var classDeclWithField = Formatter.Format( CodeGenerator.AddFieldDeclaration(currentClassDecl, cgenField, sol.Workspace), sol.Workspace); // we can find related bits even from sub-tree fragments var latestMethod = classDeclWithField.GetCurrentNodes(methodDecl).First(); Assert.NotNull(latestMethod); Assert.NotEqual(latestMethod, methodDecl); trackedRoot = trackedRoot.ReplaceNode(currentClassDecl, classDeclWithField); // put back into document (branch solution, etc) doc = doc.WithSyntaxRoot(trackedRoot); // re-get root of new document var root2 = doc.GetSyntaxRootAsync().Result; Assert.NotEqual(trackedRoot, root2); // we can still find the tracked node in the new document var finalClassDecl = root2.GetCurrentNodes(classDecl).First(); Assert.Equal(@"public class C { private int X; void M() { } }", finalClassDecl.ToString()); // and other tracked nodes too var finalMethodDecl = root2.GetCurrentNodes(methodDecl).First(); Assert.NotNull(finalMethodDecl); Assert.NotEqual(finalMethodDecl, methodDecl); }