Skip to content

Commit 3922239

Browse files
committed
feat: completed provideHover
1 parent 3ef6ffd commit 3922239

File tree

5 files changed

+72
-37
lines changed

5 files changed

+72
-37
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"sucrase": "^3.20.1",
4949
"typescript": "^4.5.4",
5050
"vite": "^2.6.5",
51-
"vscode-languageserver-types": "^3.17.1",
51+
"vscode-languageserver-protocol": "^3.17.1",
5252
"vue": "^3.2.37",
5353
"vue-tsc": "^0.37.3"
5454
},

pnpm-lock.yaml

Lines changed: 2 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/monaco/code2monaco.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as monaco from 'monaco-editor';
2-
import * as vscode from 'vscode-languageserver-types';
2+
import * as vscode from 'vscode-languageserver-protocol';
33

44
export function asCompletionList(list: vscode.CompletionList): monaco.languages.CompletionList {
55
return {
@@ -121,3 +121,22 @@ export function asRange(range: vscode.Range): monaco.IRange {
121121
endColumn: range.end.character + 1,
122122
};
123123
}
124+
125+
export function asHover(hover: vscode.Hover): monaco.languages.Hover {
126+
return {
127+
contents: asMarkdownString(hover.contents),
128+
range: hover.range ? asRange(hover.range) : undefined,
129+
};
130+
}
131+
132+
export function asMarkdownString(markdownString: vscode.Hover['contents']): monaco.IMarkdownString[] {
133+
if (typeof markdownString === 'string') {
134+
return [{ value: markdownString }]
135+
}
136+
else if (Array.isArray(markdownString)) {
137+
return markdownString.map(asMarkdownString).flat();
138+
}
139+
else {
140+
return [markdownString];
141+
}
142+
}

src/monaco/ls.ts

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
/* eslint-disable sonarjs/no-duplicate-string */
22
import * as monaco from 'monaco-editor';
3-
import type * as vscode from 'vscode-languageserver-types';
3+
import type * as vscode from 'vscode-languageserver-protocol';
44
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';
88
import * as code2monaco from './code2monaco';
9+
import * as monaco2code from './monaco2code';
910
import libEs5Content from 'typescript/lib/lib.es5.d.ts?raw';
1011
import libDomContent from 'typescript/lib/lib.dom.d.ts?raw';
1112
import libDtsContent from 'typescript/lib/lib.d.ts?raw';
@@ -199,15 +200,9 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
199200
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''),
200201
provideCompletionItems: async (model, position, context) => {
201202
const codeResult = await ls.doComplete(
202-
model.uri.fsPath,
203-
{
204-
line: position.lineNumber - 1,
205-
character: position.column - 1,
206-
},
207-
{
208-
triggerKind: (context.triggerKind + 1) as any,
209-
triggerCharacter: context.triggerCharacter,
210-
},
203+
model.uri.toString(),
204+
monaco2code.asPosition(position),
205+
monaco2code.asCompletionContext(context),
211206
);
212207
const monacoResult = code2monaco.asCompletionList(codeResult);
213208
for (let i = 0; i < codeResult.items.length; i++) {
@@ -232,33 +227,21 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
232227
disposables.value.push(
233228
monaco.languages.registerHoverProvider(lang, {
234229
provideHover: async (model, position) => {
235-
const info: vscode.Hover | undefined = await ls.doHover(model.uri.fsPath, {
236-
line: position.lineNumber - 1,
237-
character: position.column - 1,
238-
});
239-
if (!info) {
240-
return undefined;
230+
const codeResult = await ls.doHover(
231+
model.uri.toString(),
232+
monaco2code.asPosition(position),
233+
);
234+
if (codeResult) {
235+
return code2monaco.asHover(codeResult);
241236
}
242-
const results: monaco.languages.Hover = {
243-
contents: (Array.isArray(info.contents)
244-
? (info.contents as string[])
245-
: typeof info.contents === 'string'
246-
? [info.contents]
247-
: [info.contents.value]
248-
).map((x) => ({
249-
value: x,
250-
})),
251-
};
252-
253-
return results;
254237
},
255238
}),
256239
);
257240

258241
disposables.value.push(
259242
monaco.languages.registerDefinitionProvider(lang, {
260243
provideDefinition: async (model, position) => {
261-
const result = await ls.findDefinition(model.uri.fsPath, {
244+
const result = await ls.findDefinition(model.uri.toString(), {
262245
line: position.lineNumber - 1,
263246
character: position.column - 1,
264247
});
@@ -288,7 +271,7 @@ export async function setupLs(modelsMap: Ref<Map<string, monaco.editor.ITextMode
288271
monaco.languages.registerSignatureHelpProvider(lang, {
289272
signatureHelpTriggerCharacters: ['(', ','],
290273
provideSignatureHelp: async (model, position) => {
291-
const result = await ls.getSignatureHelp(model.uri.fsPath, {
274+
const result = await ls.getSignatureHelp(model.uri.toString(), {
292275
line: position.lineNumber - 1,
293276
character: position.column - 1,
294277
});
@@ -326,7 +309,7 @@ export function setupValidate(editor: monaco.editor.IStandaloneCodeEditor, ls: L
326309
throw new Error('No model');
327310
}
328311

329-
const diagnostics = await ls.doValidation(model.uri.fsPath);
312+
const diagnostics = await ls.doValidation(model.uri.toString());
330313
monaco.editor.setModelMarkers(
331314
model,
332315
lang,

src/monaco/monaco2code.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import * as monaco from 'monaco-editor';
2+
import * as vscode from 'vscode-languageserver-protocol';
3+
4+
export function asPosition(position: monaco.Position): vscode.Position {
5+
return vscode.Position.create(
6+
position.lineNumber - 1, position.column - 1,
7+
);
8+
}
9+
10+
export function asRange(range: monaco.Range): vscode.Range {
11+
return vscode.Range.create(
12+
range.startLineNumber - 1,
13+
range.startColumn - 1,
14+
range.endLineNumber - 1,
15+
range.endColumn - 1,
16+
);
17+
}
18+
19+
export function asCompletionContext(context: monaco.languages.CompletionContext): vscode.CompletionContext {
20+
return {
21+
triggerKind: asTriggerKind(context.triggerKind),
22+
triggerCharacter: context.triggerCharacter,
23+
};
24+
}
25+
26+
export function asTriggerKind(kind: monaco.languages.CompletionTriggerKind): vscode.CompletionTriggerKind {
27+
switch (kind) {
28+
case monaco.languages.CompletionTriggerKind.Invoke:
29+
return vscode.CompletionTriggerKind.Invoked;
30+
case monaco.languages.CompletionTriggerKind.TriggerCharacter:
31+
return vscode.CompletionTriggerKind.TriggerCharacter;
32+
case monaco.languages.CompletionTriggerKind.TriggerForIncompleteCompletions:
33+
return vscode.CompletionTriggerKind.TriggerForIncompleteCompletions;
34+
}
35+
}

0 commit comments

Comments
 (0)