public async Task TestMethod1() { var code = @" using System; public static class Class1 { public static void Method1(Action<string /*firstName*/> write) { write(""Adam""); } }"; var expectedUpdatedCode = @" using System; public static class Class1 { public delegate void Write(string firstName); public static void Method1(Write write) { write(""Adam""); } }"; var workspace = new AdhocWorkspace(); var solution = workspace.CurrentSolution; var projectId = ProjectId.CreateNewId(); solution = solution.AddProject(projectId, "Project1", "Project1", LanguageNames.CSharp); var documentId = DocumentId.CreateNewId(projectId); solution = solution.AddDocument(documentId, "Document.cs", code); var project = solution.GetProject(projectId) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)); if (!workspace.TryApplyChanges(project.Solution)) { throw new Exception("Unable to apply changes"); } project = workspace.CurrentSolution.GetProject(projectId); var sut = new CreateCustomDelegateCodeRefactoringProvider(); var document = project.GetDocument(documentId); var root = await document.GetSyntaxRootAsync(); var parameter = root.DescendantNodes().OfType <ParameterSyntax>().Single(); var registeredCodeActions = new List <CodeAction>(); await sut.ComputeRefactoringsAsync( new CodeRefactoringContext( document, parameter.Identifier.Span, codeAction => { registeredCodeActions.Add(codeAction); }, CancellationToken.None)); if (registeredCodeActions.Count == 0) { throw new Exception("No code actions registered"); } if (registeredCodeActions.Count > 1) { throw new Exception("More than one action registered"); } var codeAction = registeredCodeActions[0]; var operations = await codeAction.GetOperationsAsync(CancellationToken.None); foreach (var operation in operations) { operation.Apply(workspace, CancellationToken.None); } var updatedDocument = workspace.CurrentSolution.GetDocument(documentId); var actualUpdatedText = (await updatedDocument.GetTextAsync()).ToString(); Assert.AreEqual(expectedUpdatedCode, actualUpdatedText); }
private static async Task <(string updatedTextForDocument1, string updatedTextForDocument2)> ApplyCodeRefactoring( string code, string codeInSecondDocument) { var workspace = new AdhocWorkspace(); var solution = workspace.CurrentSolution; var projectId = ProjectId.CreateNewId(); solution = solution.AddProject(projectId, "Project1", "Project1", LanguageNames.CSharp); var documentId = DocumentId.CreateNewId(projectId); solution = solution.AddDocument(documentId, "Document.cs", code); var document2Id = DocumentId.CreateNewId(projectId); solution = solution.AddDocument(document2Id, "Document2.cs", codeInSecondDocument); var project = solution.GetProject(projectId) .AddMetadataReference(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)); if (!workspace.TryApplyChanges(project.Solution)) { throw new Exception("Unable to apply changes"); } project = workspace.CurrentSolution.GetProject(projectId); var sut = new CreateCustomDelegateCodeRefactoringProvider(); var document = project.GetDocument(documentId); var root = await document.GetSyntaxRootAsync(); var parameter = root.DescendantNodes().OfType <ParameterSyntax>().First(); var registeredCodeActions = new List <CodeAction>(); await sut.ComputeRefactoringsAsync( new CodeRefactoringContext( document, parameter.Identifier.Span, codeAction => { registeredCodeActions.Add(codeAction); }, CancellationToken.None)); if (registeredCodeActions.Count == 0) { throw new Exception("No code actions registered"); } if (registeredCodeActions.Count > 1) { throw new Exception("More than one action registered"); } var codeAction = registeredCodeActions[0]; var operations = await codeAction.GetOperationsAsync(CancellationToken.None); foreach (var operation in operations) { operation.Apply(workspace, CancellationToken.None); } var updatedDocument = workspace.CurrentSolution.GetDocument(documentId); var actualUpdatedText = (await updatedDocument.GetTextAsync()).ToString(); var updatedDocument2 = workspace.CurrentSolution.GetDocument(document2Id); var actualUpdatedTextForDocument2 = (await updatedDocument2.GetTextAsync()).ToString(); return(actualUpdatedText, actualUpdatedTextForDocument2); }