diff --git a/client/src/monaco-languages.ts b/client/src/monaco-languages.ts index ce15944f..6f7d7bd8 100644 --- a/client/src/monaco-languages.ts +++ b/client/src/monaco-languages.ts @@ -11,7 +11,7 @@ import { OnTypeFormattingEditProvider, RenameProvider, DocumentFilter, DocumentSelector, DocumentLinkProvider, ImplementationProvider, TypeDefinitionProvider, DocumentColorProvider, FoldingRangeProvider, SemanticTokensLegend, - DocumentSemanticTokensProvider, DocumentRangeSemanticTokensProvider + DocumentSemanticTokensProvider, DocumentRangeSemanticTokensProvider, Command } from "./services"; import { MonacoDiagnosticCollection } from './monaco-diagnostic-collection'; @@ -244,13 +244,28 @@ export class MonacoLanguages implements Languages { return { provideCodeActions: async (model, range, context, token) => { if (!this.matchModel(selector, MonacoModelIdentifier.fromModel(model))) { - // FIXME: get rid of `!` when https://github.com/microsoft/monaco-editor/issues/1560 is resolved - return undefined!; + return undefined; } const params = this.m2p.asCodeActionParams(model, range, context); - const result = await provider.provideCodeActions(params, token); - // FIXME: get rid of `|| undefined!` when https://github.com/microsoft/monaco-editor/issues/1560 is resolved - return result && this.p2m.asCodeActionList(result) || undefined!; + let result = await provider.provideCodeActions(params, token); + + // FIXME: get rid of it and implement resolveCodeAction when https://github.com/microsoft/monaco-editor/issues/2663 is resolved + if (result) { + if (provider.resolveCodeAction) { + result = await Promise.all(result.map(async item => { + if (!Command.is(item) && !item.edit) { + const resolved = await provider.resolveCodeAction!(item, token) + if (resolved) { + return resolved + } + } + return item + })) + } + + return this.p2m.asCodeActionList(result) + } + return undefined } } } diff --git a/client/src/services.ts b/client/src/services.ts index a32fc36f..84ceb5eb 100644 --- a/client/src/services.ts +++ b/client/src/services.ts @@ -133,8 +133,9 @@ export interface WorkspaceSymbolProvider { provideWorkspaceSymbols(params: WorkspaceSymbolParams, token: CancellationToken): ProviderResult; } -export interface CodeActionProvider { +export interface CodeActionProvider { provideCodeActions(params: CodeActionParams, token: CancellationToken): ProviderResult<(Command | CodeAction)[]>; + resolveCodeAction?(codeAction: T, token: CancellationToken): ProviderResult; } export interface CodeLensProvider { diff --git a/client/src/vscode-api.ts b/client/src/vscode-api.ts index 7d4aa559..e2136b90 100644 --- a/client/src/vscode-api.ts +++ b/client/src/vscode-api.ts @@ -434,7 +434,10 @@ export function createVSCodeApi(servicesProvider: Services.Provider): typeof vsc return languages.registerCodeActionsProvider(selector, { provideCodeActions({ textDocument, range, context }, token) { return provider.provideCodeActions(textDocument, range, context, token) as any; - } + }, + resolveCodeAction: provider.resolveCodeAction ? (codeAction, token) => { + return provider.resolveCodeAction!(codeAction, token) as any + } : undefined }); }, registerCodeLensProvider(selector, provider) { diff --git a/example/package.json b/example/package.json index 1a234136..56e35a81 100644 --- a/example/package.json +++ b/example/package.json @@ -7,7 +7,7 @@ "express": "^4.15.2", "file-loader": "^4.3.0", "monaco-editor-core": "^0.22.3", - "monaco-languageclient": "^0.13.0", + "@codingame/monaco-languageclient": "^0.14.0", "normalize-url": "^2.0.1", "reconnecting-websocket": "^3.2.2", "request-light": "^0.2.2", diff --git a/example/src/client.ts b/example/src/client.ts index 7925d014..baf4c300 100644 --- a/example/src/client.ts +++ b/example/src/client.ts @@ -7,7 +7,7 @@ import * as monaco from 'monaco-editor-core' import { MonacoLanguageClient, MessageConnection, CloseAction, ErrorAction, MonacoServices, createConnection -} from 'monaco-languageclient'; +} from '@codingame/monaco-languageclient'; import normalizeUrl = require('normalize-url'); const ReconnectingWebSocket = require('reconnecting-websocket'); diff --git a/example/webpack.config.js b/example/webpack.config.js index 04d3b732..7c1466b7 100644 --- a/example/webpack.config.js +++ b/example/webpack.config.js @@ -37,7 +37,7 @@ const common = { }, resolve: { alias: { - 'vscode': require.resolve('monaco-languageclient/lib/vscode-compatibility') + 'vscode': require.resolve('@codingame/monaco-languageclient/lib/vscode-compatibility') }, extensions: ['.js', '.json', '.ttf'] } diff --git a/examples/browser/package.json b/examples/browser/package.json index e9a34bd3..bbc4a39b 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -4,7 +4,7 @@ "version": "0.13.0", "dependencies": { "file-loader": "^4.3.0", - "monaco-languageclient": "^0.13.0", + "@codingame/monaco-languageclient": "^0.14.0", "vscode-json-languageservice": "^4.0.2", "vscode-languageserver-types": "^3.16.0" }, diff --git a/examples/browser/src/client.ts b/examples/browser/src/client.ts index 247421a2..232462bf 100644 --- a/examples/browser/src/client.ts +++ b/examples/browser/src/client.ts @@ -4,7 +4,7 @@ * ------------------------------------------------------------------------------------------ */ import * as monaco from 'monaco-editor-core' import { getLanguageService, TextDocument } from "vscode-json-languageservice"; -import { MonacoToProtocolConverter, ProtocolToMonacoConverter } from 'monaco-languageclient/lib/monaco-converter'; +import { MonacoToProtocolConverter, ProtocolToMonacoConverter } from '@codingame/monaco-languageclient/lib/monaco-converter'; const LANGUAGE_ID = 'json'; const MODEL_URI = 'inmemory://model.json'