Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolve code actions #290

Merged
merged 4 commits into from
Sep 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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