From 39222398316adfda107f2b00d2cc27523f6cef52 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 9 Jun 2022 17:10:50 +0800 Subject: [PATCH] feat: completed provideHover --- package.json | 2 +- pnpm-lock.yaml | 6 ++---- src/monaco/code2monaco.ts | 21 +++++++++++++++++- src/monaco/ls.ts | 45 ++++++++++++--------------------------- src/monaco/monaco2code.ts | 35 ++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 37 deletions(-) create mode 100644 src/monaco/monaco2code.ts diff --git a/package.json b/package.json index 2ee6e8e9..0db39f24 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "sucrase": "^3.20.1", "typescript": "^4.5.4", "vite": "^2.6.5", - "vscode-languageserver-types": "^3.17.1", + "vscode-languageserver-protocol": "^3.17.1", "vue": "^3.2.37", "vue-tsc": "^0.37.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4ea7f68..ac651fd3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,7 +21,7 @@ specifiers: sucrase: ^3.20.1 typescript: ^4.5.4 vite: ^2.6.5 - vscode-languageserver-types: ^3.17.1 + vscode-languageserver-protocol: ^3.17.1 vue: ^3.2.37 vue-tsc: ^0.37.3 @@ -48,7 +48,7 @@ devDependencies: sucrase: 3.21.0 typescript: 4.7.3 vite: 2.9.10 - vscode-languageserver-types: 3.17.1 + vscode-languageserver-protocol: 3.17.1 vue: 3.2.37 vue-tsc: 0.37.3_typescript@4.7.3 @@ -1352,14 +1352,12 @@ packages: /vscode-jsonrpc/8.0.1: resolution: {integrity: sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ==} engines: {node: '>=14.0.0'} - dev: false /vscode-languageserver-protocol/3.17.1: resolution: {integrity: sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg==} dependencies: vscode-jsonrpc: 8.0.1 vscode-languageserver-types: 3.17.1 - dev: false /vscode-languageserver-textdocument/1.0.5: resolution: {integrity: sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg==} diff --git a/src/monaco/code2monaco.ts b/src/monaco/code2monaco.ts index cfdb50c5..418b6511 100644 --- a/src/monaco/code2monaco.ts +++ b/src/monaco/code2monaco.ts @@ -1,5 +1,5 @@ import * as monaco from 'monaco-editor'; -import * as vscode from 'vscode-languageserver-types'; +import * as vscode from 'vscode-languageserver-protocol'; export function asCompletionList(list: vscode.CompletionList): monaco.languages.CompletionList { return { @@ -121,3 +121,22 @@ export function asRange(range: vscode.Range): monaco.IRange { endColumn: range.end.character + 1, }; } + +export function asHover(hover: vscode.Hover): monaco.languages.Hover { + return { + contents: asMarkdownString(hover.contents), + range: hover.range ? asRange(hover.range) : undefined, + }; +} + +export function asMarkdownString(markdownString: vscode.Hover['contents']): monaco.IMarkdownString[] { + if (typeof markdownString === 'string') { + return [{ value: markdownString }] + } + else if (Array.isArray(markdownString)) { + return markdownString.map(asMarkdownString).flat(); + } + else { + return [markdownString]; + } +} diff --git a/src/monaco/ls.ts b/src/monaco/ls.ts index de31177b..b22ed699 100644 --- a/src/monaco/ls.ts +++ b/src/monaco/ls.ts @@ -1,11 +1,12 @@ /* eslint-disable sonarjs/no-duplicate-string */ import * as monaco from 'monaco-editor'; -import type * as vscode from 'vscode-languageserver-types'; +import type * as vscode from 'vscode-languageserver-protocol'; import * as ts from 'typescript/lib/tsserverlibrary'; import { createLanguageService, type LanguageService, type LanguageServiceHost } from '@volar/vue-language-service'; import type { Ref } from 'vue'; import { onBeforeUnmount, ref } from 'vue'; import * as code2monaco from './code2monaco'; +import * as monaco2code from './monaco2code'; import libEs5Content from 'typescript/lib/lib.es5.d.ts?raw'; import libDomContent from 'typescript/lib/lib.dom.d.ts?raw'; import libDtsContent from 'typescript/lib/lib.d.ts?raw'; @@ -199,15 +200,9 @@ export async function setupLs(modelsMap: Ref?,./ '.split(''), provideCompletionItems: async (model, position, context) => { const codeResult = await ls.doComplete( - model.uri.fsPath, - { - line: position.lineNumber - 1, - character: position.column - 1, - }, - { - triggerKind: (context.triggerKind + 1) as any, - triggerCharacter: context.triggerCharacter, - }, + model.uri.toString(), + monaco2code.asPosition(position), + monaco2code.asCompletionContext(context), ); const monacoResult = code2monaco.asCompletionList(codeResult); for (let i = 0; i < codeResult.items.length; i++) { @@ -232,25 +227,13 @@ export async function setupLs(modelsMap: Ref { - const info: vscode.Hover | undefined = await ls.doHover(model.uri.fsPath, { - line: position.lineNumber - 1, - character: position.column - 1, - }); - if (!info) { - return undefined; + const codeResult = await ls.doHover( + model.uri.toString(), + monaco2code.asPosition(position), + ); + if (codeResult) { + return code2monaco.asHover(codeResult); } - const results: monaco.languages.Hover = { - contents: (Array.isArray(info.contents) - ? (info.contents as string[]) - : typeof info.contents === 'string' - ? [info.contents] - : [info.contents.value] - ).map((x) => ({ - value: x, - })), - }; - - return results; }, }), ); @@ -258,7 +241,7 @@ export async function setupLs(modelsMap: Ref { - const result = await ls.findDefinition(model.uri.fsPath, { + const result = await ls.findDefinition(model.uri.toString(), { line: position.lineNumber - 1, character: position.column - 1, }); @@ -288,7 +271,7 @@ export async function setupLs(modelsMap: Ref { - const result = await ls.getSignatureHelp(model.uri.fsPath, { + const result = await ls.getSignatureHelp(model.uri.toString(), { line: position.lineNumber - 1, character: position.column - 1, }); @@ -326,7 +309,7 @@ export function setupValidate(editor: monaco.editor.IStandaloneCodeEditor, ls: L throw new Error('No model'); } - const diagnostics = await ls.doValidation(model.uri.fsPath); + const diagnostics = await ls.doValidation(model.uri.toString()); monaco.editor.setModelMarkers( model, lang, diff --git a/src/monaco/monaco2code.ts b/src/monaco/monaco2code.ts new file mode 100644 index 00000000..bc03c523 --- /dev/null +++ b/src/monaco/monaco2code.ts @@ -0,0 +1,35 @@ +import * as monaco from 'monaco-editor'; +import * as vscode from 'vscode-languageserver-protocol'; + +export function asPosition(position: monaco.Position): vscode.Position { + return vscode.Position.create( + position.lineNumber - 1, position.column - 1, + ); +} + +export function asRange(range: monaco.Range): vscode.Range { + return vscode.Range.create( + range.startLineNumber - 1, + range.startColumn - 1, + range.endLineNumber - 1, + range.endColumn - 1, + ); +} + +export function asCompletionContext(context: monaco.languages.CompletionContext): vscode.CompletionContext { + return { + triggerKind: asTriggerKind(context.triggerKind), + triggerCharacter: context.triggerCharacter, + }; +} + +export function asTriggerKind(kind: monaco.languages.CompletionTriggerKind): vscode.CompletionTriggerKind { + switch (kind) { + case monaco.languages.CompletionTriggerKind.Invoke: + return vscode.CompletionTriggerKind.Invoked; + case monaco.languages.CompletionTriggerKind.TriggerCharacter: + return vscode.CompletionTriggerKind.TriggerCharacter; + case monaco.languages.CompletionTriggerKind.TriggerForIncompleteCompletions: + return vscode.CompletionTriggerKind.TriggerForIncompleteCompletions; + } +}