/// <param name="textSpan">If <see langword="null"/> the current caret position will be used.</param> public async Task <CodeAction> TryGetCodeActionAsync(TextSpan?textSpan = null) { var span = textSpan ?? new TextSpan(_view.Caret.Position.BufferPosition, 0); var document = this.Workspace.CurrentSolution.GetDocument(_hostDocument.Id); var actions = new List <CodeAction>(); var context = new CodeRefactoringContext( document, span, actions.Add, CancellationToken.None); await _codeRefactoringProvider.ComputeRefactoringsAsync(context); return(actions.SingleOrDefault()); }
public async Task AssertTag(string expectedFromName, string expectedToName, bool invokeAction = false) { await WaitForAsyncOperationsAsync(); var tags = _tagger.GetTags(_view.TextBuffer.CurrentSnapshot.GetSnapshotSpanCollection()); // There should only ever be one tag Assert.Equal(1, tags.Count()); var tag = tags.Single(); var document = this.Workspace.CurrentSolution.GetDocument(_hostDocument.Id); var diagnostic = await TryGetDocumentDiagnosticAsync(document); // There should be a single rename tracking diagnostic Assert.NotNull(diagnostic); Assert.Equal(RenameTrackingCodeRefactoringProvider.DiagnosticId, diagnostic.Id); var actions = new List <CodeAction>(); var context = new CodeRefactoringContext( document, diagnostic.Location.SourceSpan, actions.Add, CancellationToken.None); await _codeRefactoringProvider.ComputeRefactoringsAsync(context); // There should only be one code action Assert.Equal(1, actions.Count); Assert.Equal(string.Format(EditorFeaturesResources.Rename_0_to_1, expectedFromName, expectedToName), actions[0].Title); if (invokeAction) { var operations = (await actions[0].GetOperationsAsync(CancellationToken.None)).ToArray(); Assert.Equal(1, operations.Length); operations[0].TryApply(this.Workspace, new ProgressTracker(), CancellationToken.None); } }