Skip to content

Commit

Permalink
Merge pull request #290 from CGNonofr/resolve-code-actions
Browse files Browse the repository at this point in the history
Resolve code actions
  • Loading branch information
CGNonofr committed Sep 20, 2021
2 parents b302d1b + 38891f0 commit 16dd005
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 13 deletions.
27 changes: 21 additions & 6 deletions client/src/monaco-languages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion client/src/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,9 @@ export interface WorkspaceSymbolProvider {
provideWorkspaceSymbols(params: WorkspaceSymbolParams, token: CancellationToken): ProviderResult<SymbolInformation[]>;
}

export interface CodeActionProvider {
export interface CodeActionProvider<T extends CodeAction = CodeAction> {
provideCodeActions(params: CodeActionParams, token: CancellationToken): ProviderResult<(Command | CodeAction)[]>;
resolveCodeAction?(codeAction: T, token: CancellationToken): ProviderResult<T>;
}

export interface CodeLensProvider {
Expand Down
5 changes: 4 additions & 1 deletion client/src/vscode-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,10 @@ export function createVSCodeApi(servicesProvider: Services.Provider): typeof vsc
return languages.registerCodeActionsProvider(selector, {
provideCodeActions({ textDocument, range, context }, token) {
return provider.provideCodeActions(<any>textDocument, <any>range, <any>context, token) as any;
}
},
resolveCodeAction: provider.resolveCodeAction ? (codeAction, token) => {
return provider.resolveCodeAction!(<any>codeAction, <any>token) as any
} : undefined
});
},
registerCodeLensProvider(selector, provider) {
Expand Down
2 changes: 1 addition & 1 deletion example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion example/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');

Expand Down
2 changes: 1 addition & 1 deletion example/webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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']
}
Expand Down
2 changes: 1 addition & 1 deletion examples/browser/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down
2 changes: 1 addition & 1 deletion examples/browser/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down

0 comments on commit 16dd005

Please sign in to comment.