Skip to content

Commit

Permalink
fix(language-service): vue-twoslash-queries not working in LSP mode
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Jul 2, 2024
1 parent eb5e00c commit f22b109
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 20 deletions.
37 changes: 33 additions & 4 deletions packages/language-service/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import { collectExtractProps } from '@vue/typescript-plugin/lib/requests/collect
import { getComponentEvents, getComponentNames, getComponentProps, getElementAttrs, getTemplateContextProps } from '@vue/typescript-plugin/lib/requests/componentInfos';
import { getImportPathForFile } from '@vue/typescript-plugin/lib/requests/getImportPathForFile';
import { getPropertiesAtLocation } from '@vue/typescript-plugin/lib/requests/getPropertiesAtLocation';
import { getQuickInfoAtPosition } from '@vue/typescript-plugin/lib/requests/getQuickInfoAtPosition';
import type { RequestContext } from '@vue/typescript-plugin/lib/requests/types';
import { URI } from 'vscode-uri';
import { convertAttrName, convertTagName, detect } from './lib/ideFeatures/nameCasing';
Expand Down Expand Up @@ -126,8 +125,38 @@ export function getFullLanguageServicePlugins(ts: typeof import('typescript')):
async getTemplateContextProps(...args) {
return await getTemplateContextProps.apply(requestContext, args);
},
async getQuickInfoAtPosition(...args) {
return await getQuickInfoAtPosition.apply(requestContext, args);
async getQuickInfoAtPosition(fileName, position) {
const languageService = context.getLanguageService();
const uri = context.project.typescript!.uriConverter.asUri(fileName);
const sourceScript = context.language.scripts.get(uri);
if (!sourceScript) {
return;
}
const document = context.documents.get(uri, sourceScript.languageId, sourceScript.snapshot);
const hover = await languageService.getHover(uri, document.positionAt(position));
let text = '';
if (typeof hover?.contents === 'string') {
text = hover.contents;
}
else if (Array.isArray(hover?.contents)) {
text = hover.contents.map(c => typeof c === 'string' ? c : c.value).join('\n');
}
else if (hover) {
text = hover.contents.value;
}
text = text.replace(/```typescript/g, '');
text = text.replace(/```/g, '');
text = text.replace(/---/g, '');
text = text.trim();
while (true) {
const newText = text.replace(/\n\n/g, '\n');
if (newText === text) {
break;
}
text = newText;
}
text = text.replace(/\n/g, ' | ');
return text;
},
};
}
Expand Down Expand Up @@ -161,7 +190,7 @@ function getCommonLanguageServicePlugins(
createVueTemplatePlugin('html', ts, getTsPluginClient),
createVueTemplatePlugin('pug', ts, getTsPluginClient),
createVueSfcPlugin(),
createVueTwoslashQueriesPlugin(ts, getTsPluginClient),
createVueTwoslashQueriesPlugin(getTsPluginClient),
createVueDocumentLinksPlugin(),
createVueDocumentDropPlugin(ts, getTsPluginClient),
createVueAutoDotValuePlugin(ts, getTsPluginClient),
Expand Down
25 changes: 11 additions & 14 deletions packages/language-service/lib/plugins/vue-twoslash-queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { URI } from 'vscode-uri';
const twoslashReg = /<!--\s*\^\?\s*-->/g;

export function create(
ts: typeof import('typescript'),
getTsPluginClient?: (context: LanguageServiceContext) => typeof import('@vue/typescript-plugin/lib/client') | undefined
): LanguageServicePlugin {
return {
Expand Down Expand Up @@ -39,20 +38,18 @@ export function create(
}

for (const [pointerPosition, hoverOffset] of hoverOffsets) {
for (const [_sourceScript, map] of context.language.maps.forEach(virtualCode)) {
for (const [sourceOffset] of map.toSourceLocation(hoverOffset)) {
const quickInfo = await tsPluginClient?.getQuickInfoAtPosition(sourceScript.generated.root.fileName, sourceOffset);
if (quickInfo) {
inlayHints.push({
position: { line: pointerPosition.line, character: pointerPosition.character + 2 },
label: ts.displayPartsToString(quickInfo.displayParts),
paddingLeft: true,
paddingRight: false,
});
break;
}
const map = context.language.maps.get(virtualCode, sourceScript);
for (const [sourceOffset] of map.toSourceLocation(hoverOffset)) {
const quickInfo = await tsPluginClient?.getQuickInfoAtPosition(sourceScript.generated.root.fileName, sourceOffset);
if (quickInfo) {
inlayHints.push({
position: { line: pointerPosition.line, character: pointerPosition.character + 2 },
label: quickInfo,
paddingLeft: true,
paddingRight: false,
});
break;
}
break;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ export function getQuickInfoAtPosition(
fileName: string,
position: number
) {
const { languageService } = this;
return languageService.getQuickInfoAtPosition(fileName, position);
const { typescript: ts, languageService } = this;
return ts.displayPartsToString(languageService.getQuickInfoAtPosition(fileName, position)?.displayParts ?? []);
}

0 comments on commit f22b109

Please sign in to comment.