public override async Task <object> HandleRequestAsync(LSP.ExecuteCommandParams request, RequestContext context, CancellationToken cancellationToken) { var document = context.Document; Contract.ThrowIfNull(document); var runRequest = ((JToken)request.Arguments.Single()).ToObject <CodeActionResolveData>(); Assumes.Present(runRequest); var options = _globalOptions.GetCodeActionOptionsProvider(); var codeActions = await CodeActionHelpers.GetCodeActionsAsync( _codeActionsCache, document, runRequest.Range, options, _codeFixService, _codeRefactoringService, cancellationToken).ConfigureAwait(false); var actionToRun = CodeActionHelpers.GetCodeActionToResolve(runRequest.UniqueIdentifier, codeActions); Contract.ThrowIfNull(actionToRun); var operations = await actionToRun.GetOperationsAsync(cancellationToken).ConfigureAwait(false); // TODO - This UI thread dependency should be removed. // https://github.com/dotnet/roslyn/projects/45#card-20619668 await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); foreach (var operation in operations) { operation.Apply(document.Project.Solution.Workspace, cancellationToken); } return(true); }
private void SyncNamespaces(ImmutableArray <Project> projects) { if (projects.IsEmpty) { return; } var syncService = projects[0].GetRequiredLanguageService <ISyncNamespacesService>(); var options = _globalOptions.GetCodeActionOptionsProvider(); Solution?solution = null; var status = _threadOperationExecutor.Execute(ServicesVSResources.Sync_Namespaces, ServicesVSResources.Updating_namspaces, allowCancellation: true, showProgress: true, (operationContext) => { solution = _threadingContext.JoinableTaskFactory.Run(() => syncService.SyncNamespacesAsync(projects, options, operationContext.UserCancellationToken)); }); if (status != UIThreadOperationStatus.Canceled && solution is not null) { if (_workspace.CurrentSolution.GetChanges(solution).GetProjectChanges().Any()) { _workspace.TryApplyChanges(solution); MessageDialog.Show(ServicesVSResources.Sync_Namespaces, ServicesVSResources.Namespaces_have_been_updated, MessageDialogCommandSet.Ok); } else { MessageDialog.Show(ServicesVSResources.Sync_Namespaces, ServicesVSResources.No_namespaces_needed_updating, MessageDialogCommandSet.Ok); } } }
public async Task <LSP.CodeAction[]> HandleRequestAsync(LSP.CodeActionParams request, RequestContext context, CancellationToken cancellationToken) { var document = context.Document; Contract.ThrowIfNull(document); var options = _globalOptions.GetCodeActionOptionsProvider(); var codeActions = await CodeActionHelpers.GetVSCodeActionsAsync( request, _codeActionsCache, document, options, _codeFixService, _codeRefactoringService, cancellationToken).ConfigureAwait(false); return(codeActions); }
private ImmutableArray <SuggestedActionSet>?GetSuggestedActions( ISuggestedActionCategorySet requestedActionCategories, SnapshotSpan range, IUIThreadOperationContext?operationContext, CancellationToken cancellationToken) { AssertIsForeground(); using var state = _state.TryAddReference(); if (state is null) { return(null); } if (state.Target.Workspace == null) { return(null); } using (operationContext?.AddScope(allowCancellation: true, description: EditorFeaturesResources.Gathering_Suggestions_Waiting_for_the_solution_to_fully_load)) { // This needs to run under threading context otherwise, we can deadlock on VS var statusService = state.Target.Workspace.Services.GetRequiredService <IWorkspaceStatusService>(); ThreadingContext.JoinableTaskFactory.Run(() => statusService.WaitUntilFullyLoadedAsync(cancellationToken)); } using (Logger.LogBlock(FunctionId.SuggestedActions_GetSuggestedActions, cancellationToken)) { var document = range.Snapshot.GetOpenDocumentInCurrentContextWithChanges(); if (document == null) { // this is here to fail test and see why it is failed. Trace.WriteLine("given range is not current"); return(null); } var workspace = document.Project.Solution.Workspace; var supportsFeatureService = workspace.Services.GetRequiredService <ITextBufferSupportsFeatureService>(); var selection = TryGetCodeRefactoringSelection(state, range); Func <string, IDisposable?> addOperationScope = description => operationContext?.AddScope(allowCancellation: true, string.Format(EditorFeaturesResources.Gathering_Suggestions_0, description)); var options = GlobalOptions.GetCodeActionOptionsProvider(); // We convert the code fixes and refactorings to UnifiedSuggestedActionSets instead of // SuggestedActionSets so that we can share logic between local Roslyn and LSP. var fixesTask = GetCodeFixesAsync( state, supportsFeatureService, requestedActionCategories, workspace, document, range, addOperationScope, CodeActionRequestPriority.None, options, isBlocking: true, cancellationToken); var refactoringsTask = GetRefactoringsAsync( state, supportsFeatureService, requestedActionCategories, GlobalOptions, workspace, document, selection, addOperationScope, CodeActionRequestPriority.None, options, isBlocking: true, cancellationToken); Task.WhenAll(fixesTask, refactoringsTask).WaitAndGetResult(cancellationToken); return(ConvertToSuggestedActionSets( state, selection, fixesTask.WaitAndGetResult(cancellationToken), refactoringsTask.WaitAndGetResult(cancellationToken), currentActionCount: 0)); } }