Skip to content

Commit 1d37f55

Browse files
committed
feat: implemented provideCodeActions, resolveCodeAction
1 parent bddb65b commit 1d37f55

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/monaco/code2monaco.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,3 +384,22 @@ export function asDocumentHighlightKind(kind: vscode.DocumentHighlightKind | und
384384
return monaco.languages.DocumentHighlightKind.Text;
385385
}
386386
}
387+
388+
export function asCodeLens(item: vscode.CodeLens): monaco.languages.CodeLens {
389+
return {
390+
range: asRange(item.range),
391+
command: item.command ? asCommand(item.command) : undefined,
392+
};
393+
}
394+
395+
export function asCodeAction(item: vscode.CodeAction): monaco.languages.CodeAction {
396+
return {
397+
title: item.title,
398+
command: item.command ? asCommand(item.command) : undefined,
399+
edit: item.edit ? asWorkspaceEdit(item.edit) : undefined,
400+
diagnostics: item.diagnostics ? item.diagnostics.map(asMarkerData) : undefined,
401+
kind: item.kind,
402+
isPreferred: item.isPreferred,
403+
disabled: item.disabled?.reason,
404+
};
405+
}

src/monaco/ls.ts

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
195195

196196
const completionItems = new WeakMap<monaco.languages.CompletionItem, vscode.CompletionItem>();
197197
const codeLens = new WeakMap<monaco.languages.CodeLens, vscode.CodeLens>();
198+
const codeActions = new WeakMap<monaco.languages.CodeAction, vscode.CodeAction>();
198199
const documents = new WeakMap<monaco.editor.ITextModel, vscode.TextDocument>();
199200

200201
disposables.value.push(
@@ -352,6 +353,46 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
352353
return moncaoResult;
353354
},
354355
}),
356+
monaco.languages.registerCodeActionProvider(lang, {
357+
provideCodeActions: async (model, range, context) => {
358+
const diagnostics: vscode.Diagnostic[] = [];
359+
for (const marker of context.markers) {
360+
const diagnostic = _diagnostics.get(marker);
361+
if (diagnostic) {
362+
diagnostics.push(diagnostic);
363+
}
364+
}
365+
const codeResult = await ls.doCodeActions(
366+
model.uri.toString(),
367+
monaco2code.asRange(range),
368+
{
369+
diagnostics: diagnostics,
370+
only: context.only ? [context.only] : undefined,
371+
},
372+
);
373+
if (codeResult) {
374+
const monacoResult = codeResult.map(code2monaco.asCodeAction);
375+
for (let i = 0; i < monacoResult.length; i++) {
376+
codeActions.set(monacoResult[i], codeResult[i]);
377+
}
378+
return {
379+
actions: monacoResult,
380+
dispose: () => { },
381+
};
382+
}
383+
},
384+
resolveCodeAction: async (moncaoResult) => {
385+
let codeResult = codeActions.get(moncaoResult);
386+
if (codeResult) {
387+
codeResult = await ls.doCodeActionResolve(codeResult);
388+
if (codeResult) {
389+
moncaoResult = code2monaco.asCodeAction(codeResult);
390+
codeActions.set(moncaoResult, codeResult);
391+
}
392+
}
393+
return moncaoResult;
394+
},
395+
}),
355396
monaco.languages.registerCompletionItemProvider(lang, {
356397
// https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57
357398
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''),
@@ -396,6 +437,8 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
396437
}
397438
}
398439

440+
const _diagnostics = new WeakMap<monaco.editor.IMarkerData, vscode.Diagnostic>();
441+
399442
export function setupValidate(editor: monaco.editor.IStandaloneCodeEditor, ls: LanguageService) {
400443
const worker = async () => {
401444
const model = editor.getModel();
@@ -407,13 +450,13 @@ export function setupValidate(editor: monaco.editor.IStandaloneCodeEditor, ls: L
407450
monaco.editor.setModelMarkers(
408451
model,
409452
lang,
410-
unfinishResult.map(code2monaco.asMarkerData),
453+
toMarkers(unfinishResult),
411454
);
412455
});
413456
monaco.editor.setModelMarkers(
414457
model,
415458
lang,
416-
diagnostics.map(code2monaco.asMarkerData),
459+
toMarkers(diagnostics),
417460
);
418461
};
419462

@@ -428,3 +471,11 @@ export function setupValidate(editor: monaco.editor.IStandaloneCodeEditor, ls: L
428471
}),
429472
);
430473
}
474+
475+
function toMarkers(errors: vscode.Diagnostic[]) {
476+
return errors.map(error => {
477+
const marker = code2monaco.asMarkerData(error);
478+
_diagnostics.set(marker, error);
479+
return marker;
480+
});
481+
}

0 commit comments

Comments
 (0)