private static bool TryGetSupportsFeatureService(ITextBuffer buffer, out ITextBufferSupportsFeatureService service) { service = null; if (buffer.TryGetWorkspace(out var workspace)) { service = workspace.Services.GetService <ITextBufferSupportsFeatureService>(); } return(service != null); }
private ImmutableArray <SuggestedActionSet> GetRefactorings( ITextBufferSupportsFeatureService supportsFeatureService, ISuggestedActionCategorySet requestedActionCategories, Workspace workspace, Document document, TextSpan?selectionOpt, CancellationToken cancellationToken) { this.AssertIsForeground(); if (!selectionOpt.HasValue) { // this is here to fail test and see why it is failed. Trace.WriteLine("given range is not current"); return(ImmutableArray <SuggestedActionSet> .Empty); } var selection = selectionOpt.Value; if (workspace.Options.GetOption(EditorComponentOnOffOptions.CodeRefactorings) && _owner._codeRefactoringService != null && supportsFeatureService.SupportsRefactorings(_subjectBuffer) && requestedActionCategories.Contains(PredefinedSuggestedActionCategoryNames.Refactoring)) { // It may seem strange that we kick off a task, but then immediately 'Wait' on // it. However, it's deliberate. We want to make sure that the code runs on // the background so that no one takes an accidentally dependency on running on // the UI thread. var refactorings = Task.Run( () => _owner._codeRefactoringService.GetRefactoringsAsync( document, selection, cancellationToken), cancellationToken).WaitAndGetResult(cancellationToken); var filteredRefactorings = FilterOnUIThread(refactorings, workspace); return(filteredRefactorings.SelectAsArray( r => OrganizeRefactorings(workspace, r, selection.ToSpan()))); } return(ImmutableArray <SuggestedActionSet> .Empty); }