private static IReadOnlyList <CodeAction> CodeActions(CodeRefactoringProvider refactoring, string testCode, TextSpan span, IEnumerable <MetadataReference> metadataReferences) { var sln = CodeFactory.CreateSolutionWithOneProject( testCode, CodeFactory.DefaultCompilationOptions(Array.Empty <DiagnosticAnalyzer>()), metadataReferences); var document = sln.Projects.Single().Documents.Single(); var actions = new List <CodeAction>(); var context = new CodeRefactoringContext(document, span, a => actions.Add(a), CancellationToken.None); refactoring.ComputeRefactoringsAsync(context).GetAwaiter().GetResult(); return(actions); }
/// <summary> /// Create a binary reference from strings. /// This is useful when testing for example deriving from a base class not in source. /// </summary> /// <param name="code">The code to create a dll project from.</param> /// <returns>A <see cref="MetadataReference"/>.</returns> public static MetadataReference CreateBinary(params string[] code) { var sln = CodeFactory.CreateSolutionWithOneProject( code, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, allowUnsafe: true), AnalyzerAssert.MetadataReferences); AnalyzerAssert.NoCompilerErrors(sln); using (var ms = new MemoryStream()) { _ = sln.Projects.Single().GetCompilationAsync().Result.Emit(ms); ms.Position = 0; return(MetadataReference.CreateFromStream(ms)); } }
/// <summary> /// Create a binary reference from strings. /// This is useful when testing for example deriving from a base class not in source. /// </summary> /// <param name="code">The code to create a dll project from.</param> /// <returns>A <see cref="MetadataReference"/>.</returns> public static MetadataReference CreateBinary(params string[] code) { var sln = CodeFactory.CreateSolutionWithOneProject( code, CodeFactory.DllCompilationOptions, #pragma warning disable CS0618 // Suppress until removed. Will be replaced with Metadatareferences.FromAttributes() RoslynAssert.MetadataReferences); #pragma warning restore CS0618 // Suppress until removed. Will be replaced with Metadatareferences.FromAttributes() RoslynAssert.NoCompilerErrors(sln); using (var ms = new MemoryStream()) { _ = sln.Projects.Single().GetCompilationAsync().Result.Emit(ms); ms.Position = 0; return(MetadataReference.CreateFromStream(ms)); } }
/// <summary> /// Apply the single refactoring registered at <paramref name="position"/>. /// </summary> /// <param name="refactoring">The <see cref="CodeRefactoringProvider"/>.</param> /// <param name="testCode">The code to refactor.</param> /// <param name="position">The position to pass in to the RefactoringContext.</param> /// <param name="metadataReferences">The <see cref="MetadataReference"/> to use when compiling.</param> /// <returns>The refactored document.</returns> public static Document Apply(CodeRefactoringProvider refactoring, string testCode, int position, IEnumerable <MetadataReference> metadataReferences = null) { if (refactoring == null) { throw new ArgumentNullException(nameof(refactoring)); } if (testCode == null) { throw new ArgumentNullException(nameof(testCode)); } var sln = CodeFactory.CreateSolutionWithOneProject( testCode, CodeFactory.DefaultCompilationOptions(Array.Empty <DiagnosticAnalyzer>()), metadataReferences); var document = sln.Projects.Single().Documents.Single(); var action = SingleAction(document, refactoring, position); var edit = action.GetOperationsAsync(CancellationToken.None).GetAwaiter().GetResult().OfType <ApplyChangesOperation>().First(); return(edit.ChangedSolution.Projects.Single().Documents.Single()); }
private static IReadOnlyList <CodeAction> CodeActions(CodeRefactoringProvider refactoring, string testCode, int position, IEnumerable <MetadataReference> metadataReferences) { var sln = CodeFactory.CreateSolutionWithOneProject( testCode, CodeFactory.DefaultCompilationOptions(Array.Empty <DiagnosticAnalyzer>()), metadataReferences); var document = sln.Projects.Single().Documents.Single(); var context = new RefactoringContext(document, refactoring, position); var token = context.SyntaxRoot.FindToken(position); refactoring.ComputeRefactoringsAsync(context.CreateRefactoringContext(token.Span)).GetAwaiter().GetResult(); var node = token.Parent; while (node != null && node.SpanStart == position) { refactoring.ComputeRefactoringsAsync(context.CreateRefactoringContext(node.Span)).GetAwaiter().GetResult(); node = node.Parent; } return(context.Actions); }