Skip to content

Commit 81ef510

Browse files
committed
feat: completed provideCompletionItems
1 parent 6f34b78 commit 81ef510

File tree

2 files changed

+63
-12
lines changed

2 files changed

+63
-12
lines changed

src/monaco/converter.ts renamed to src/monaco/code2monaco.ts

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import * as monaco from 'monaco-editor';
22
import * as vscode from 'vscode-languageserver-types';
33

4-
function vscodeCompletionItemKindToMonaco(
5-
kind: vscode.CompletionItemKind | undefined,
6-
): monaco.languages.CompletionItemKind {
4+
export function asCompletionList(list: vscode.CompletionList): monaco.languages.CompletionList {
5+
return {
6+
incomplete: list.isIncomplete,
7+
suggestions: list.items.map(asCompletionItem),
8+
};
9+
}
10+
11+
export function asCompletionItemKind(kind: vscode.CompletionItemKind | undefined): monaco.languages.CompletionItemKind {
712
switch (kind) {
813
case vscode.CompletionItemKind.Method:
914
return monaco.languages.CompletionItemKind.Method;
@@ -60,12 +65,59 @@ function vscodeCompletionItemKindToMonaco(
6065
}
6166
}
6267

63-
export function vscodeCompletionItemToMonaco(item: vscode.CompletionItem): monaco.languages.CompletionItem {
68+
export function asCompletionItem(item: vscode.CompletionItem): monaco.languages.CompletionItem {
6469
return {
6570
label: item.label,
66-
insertText: item.insertText ?? item.label,
67-
kind: vscodeCompletionItemKindToMonaco(item.kind),
71+
kind: asCompletionItemKind(item.kind),
72+
tags: item.tags,
73+
detail: item.detail,
74+
documentation: item.documentation,
6875
sortText: item.sortText,
69-
range: undefined!,
76+
filterText: item.filterText,
77+
preselect: item.preselect,
78+
insertText: item.textEdit?.newText ?? item.insertText ?? item.label,
79+
range: asCompletionItemRange(item.textEdit),
80+
commitCharacters: item.commitCharacters,
81+
additionalTextEdits: item.additionalTextEdits?.map(asTextEdit),
82+
command: item.command ? asCommand(item.command) : undefined,
83+
};
84+
}
85+
86+
export function asCommand(command: vscode.Command): monaco.languages.Command {
87+
return {
88+
id: command.command,
89+
title: command.title,
90+
arguments: command.arguments,
91+
};
92+
}
93+
94+
export function asTextEdit(edit: vscode.TextEdit): monaco.languages.TextEdit {
95+
return {
96+
range: asRange(edit.range),
97+
text: edit.newText,
98+
};
99+
}
100+
101+
export function asCompletionItemRange(textEdit: vscode.CompletionItem['textEdit']): monaco.languages.CompletionItem['range'] {
102+
if (textEdit && 'insert' in textEdit && 'replace' in textEdit) {
103+
const result: monaco.languages.CompletionItemRanges = {
104+
insert: asRange(textEdit.insert),
105+
replace: asRange(textEdit.replace),
106+
};
107+
return result;
108+
}
109+
else if (textEdit) {
110+
return asRange(textEdit.range);
111+
}
112+
// @ts-expect-error
113+
return undefined;
114+
}
115+
116+
export function asRange(range: vscode.Range): monaco.IRange {
117+
return {
118+
startLineNumber: range.start.line + 1,
119+
startColumn: range.start.character + 1,
120+
endLineNumber: range.end.line + 1,
121+
endColumn: range.end.character + 1,
70122
};
71123
}

src/monaco/ls.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as ts from 'typescript/lib/tsserverlibrary';
55
import { createLanguageService, type LanguageService, type LanguageServiceHost } from '@volar/vue-language-service';
66
import type { Ref } from 'vue';
77
import { onBeforeUnmount, ref } from 'vue';
8-
import { vscodeCompletionItemToMonaco } from './converter';
8+
import * as code2monaco from './code2monaco';
99
import libEs5Content from 'typescript/lib/lib.es5.d.ts?raw';
1010
import libDomContent from 'typescript/lib/lib.dom.d.ts?raw';
1111
import libDtsContent from 'typescript/lib/lib.d.ts?raw';
@@ -193,7 +193,8 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
193193

194194
disposables.value.push(
195195
monaco.languages.registerCompletionItemProvider(lang, {
196-
triggerCharacters: ['.'],
196+
// https://github.com/johnsoncodehk/volar/blob/2f786182250d27e99cc3714fbfc7d209616e2289/packages/vue-language-server/src/registers/registerlanguageFeatures.ts#L57
197+
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''),
197198
provideCompletionItems: async (model, position, context) => {
198199
const result = await ls.doComplete(
199200
model.uri.fsPath,
@@ -206,9 +207,7 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
206207
triggerCharacter: context.triggerCharacter,
207208
},
208209
);
209-
return {
210-
suggestions: result.items.map(vscodeCompletionItemToMonaco),
211-
};
210+
return code2monaco.asCompletionList(result);
212211
},
213212
}),
214213
);

0 commit comments

Comments
 (0)