Skip to content

Commit 0ee2d15

Browse files
committed
fix(language-service): re-implement twoslash queries in script
1 parent 9ad6714 commit 0ee2d15

File tree

5 files changed

+30
-56
lines changed

5 files changed

+30
-56
lines changed

packages/language-service/index.ts

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@ export * from '@volar/language-service';
44
// for @vue/language-server usage
55
export * from '@volar/language-service/lib/utils/featureWorkers';
66

7-
import type { LanguageServiceContext, LanguageServicePlugin } from '@volar/language-service';
87
import type { VueCompilerOptions } from '@vue/language-core';
98
import type * as ts from 'typescript';
109

1110
import { create as createEmmetPlugin } from 'volar-service-emmet';
1211
import { create as createJsonPlugin } from 'volar-service-json';
1312
import { create as createPugFormatPlugin } from 'volar-service-pug-beautify';
14-
import { create as createTypeScriptTwoslashQueriesPlugin } from 'volar-service-typescript-twoslash-queries';
1513
import { create as createTypeScriptDocCommentTemplatePlugin } from 'volar-service-typescript/lib/plugins/docCommentTemplate';
1614
import { create as createTypeScriptSyntacticPlugin } from 'volar-service-typescript/lib/plugins/syntactic';
1715
import { create as createCssPlugin } from './lib/plugins/css';
1816
import { create as createVueAutoDotValuePlugin } from './lib/plugins/vue-autoinsert-dotvalue';
1917
import { create as createVueAutoAddSpacePlugin } from './lib/plugins/vue-autoinsert-space';
2018
import { create as createVueCompilerDomErrorsPlugin } from './lib/plugins/vue-compiler-dom-errors';
21-
import { create as createVueCompleteDefineAssignmentPlugin } from './lib/plugins/vue-complete-define-assignment';
2219
import { create as createVueDirectiveCommentsPlugin } from './lib/plugins/vue-directive-comments';
2320
import { create as createVueDocumentDropPlugin } from './lib/plugins/vue-document-drop';
2421
import { create as createVueDocumentHighlightsPlugin } from './lib/plugins/vue-document-highlights';
@@ -28,6 +25,7 @@ import { create as createVueGlobalTypesErrorPlugin } from './lib/plugins/vue-glo
2825
import { create as createVueInlayHintsPlugin } from './lib/plugins/vue-inlayhints';
2926
import { create as createVueMissingPropsHintsPlugin } from './lib/plugins/vue-missing-props-hints';
3027
import { create as createVueSfcPlugin } from './lib/plugins/vue-sfc';
28+
import { create as createVueSuggestDefineAssignmentPlugin } from './lib/plugins/vue-suggest-define-assignment';
3129
import { create as createVueTemplatePlugin } from './lib/plugins/vue-template';
3230
import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twoslash-queries';
3331

@@ -47,52 +45,41 @@ export function createVueLanguageServicePlugins(
4745
}
4846
| undefined,
4947
) {
48+
const getTsPluginClient = () => tsPluginClient;
5049
const plugins = [
51-
createTypeScriptSyntacticPlugin(ts),
52-
createTypeScriptDocCommentTemplatePlugin(ts),
53-
...getCommonLanguageServicePlugins(ts, () => tsPluginClient),
54-
];
55-
if (tsPluginClient) {
56-
plugins.push(createVueDocumentHighlightsPlugin(tsPluginClient.getDocumentHighlights));
57-
}
58-
for (const plugin of plugins) {
59-
// avoid affecting TS plugin
60-
delete plugin.capabilities.semanticTokensProvider;
61-
}
62-
return plugins;
63-
}
64-
65-
function getCommonLanguageServicePlugins(
66-
ts: typeof import('typescript'),
67-
getTsPluginClient: (
68-
context: LanguageServiceContext,
69-
) => import('@vue/typescript-plugin/lib/requests').Requests | undefined,
70-
): LanguageServicePlugin[] {
71-
return [
72-
createTypeScriptTwoslashQueriesPlugin(ts),
7350
createCssPlugin(),
74-
createPugFormatPlugin(),
7551
createJsonPlugin(),
76-
createVueTemplatePlugin('html', getTsPluginClient),
77-
createVueTemplatePlugin('pug', getTsPluginClient),
78-
createVueMissingPropsHintsPlugin(getTsPluginClient),
52+
createPugFormatPlugin(),
53+
createTypeScriptDocCommentTemplatePlugin(ts),
54+
createTypeScriptSyntacticPlugin(ts),
55+
createVueAutoAddSpacePlugin(),
56+
createVueAutoDotValuePlugin(ts, getTsPluginClient),
7957
createVueCompilerDomErrorsPlugin(),
80-
createVueSfcPlugin(),
81-
createVueTwoslashQueriesPlugin(getTsPluginClient),
8258
createVueDocumentDropPlugin(ts, getTsPluginClient),
8359
createVueDocumentLinksPlugin(),
84-
createVueCompleteDefineAssignmentPlugin(),
85-
createVueAutoDotValuePlugin(ts, getTsPluginClient),
86-
createVueAutoAddSpacePlugin(),
87-
createVueInlayHintsPlugin(ts),
8860
createVueDirectiveCommentsPlugin(),
8961
createVueExtractFilePlugin(ts, getTsPluginClient),
9062
createVueGlobalTypesErrorPlugin(),
63+
createVueInlayHintsPlugin(ts),
64+
createVueMissingPropsHintsPlugin(getTsPluginClient),
65+
createVueSfcPlugin(),
66+
createVueSuggestDefineAssignmentPlugin(),
67+
createVueTemplatePlugin('html', getTsPluginClient),
68+
createVueTemplatePlugin('pug', getTsPluginClient),
69+
createVueTwoslashQueriesPlugin(getTsPluginClient),
9170
createEmmetPlugin({
9271
mappedLanguages: {
9372
'vue-root-tags': 'html',
9473
'postcss': 'scss',
9574
},
9675
}),
9776
];
77+
if (tsPluginClient) {
78+
plugins.push(createVueDocumentHighlightsPlugin(tsPluginClient.getDocumentHighlights));
79+
}
80+
for (const plugin of plugins) {
81+
// avoid affecting TS plugin
82+
delete plugin.capabilities.semanticTokensProvider;
83+
}
84+
return plugins;
9885
}

packages/language-service/lib/plugins/vue-complete-define-assignment.ts renamed to packages/language-service/lib/plugins/vue-suggest-define-assignment.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { isTsDocument } from './utils';
55

66
export function create(): LanguageServicePlugin {
77
return {
8-
name: 'vue-complete-define-assignment',
8+
name: 'vue-suggest-define-assignment',
99
capabilities: {
1010
completionProvider: {},
1111
},

packages/language-service/lib/plugins/vue-twoslash-queries.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import type { InlayHint, LanguageServiceContext, LanguageServicePlugin, Position
22
import { VueVirtualCode } from '@vue/language-core';
33
import { URI } from 'vscode-uri';
44

5-
const twoslashReg = /<!--\s*\^\?\s*-->/g;
5+
const twoslashTemplateReg = /<!--\s*\^\?\s*-->/g;
6+
const twoslashScriptReg = /(?<=^|\n)\s*\/\/\s*\^\?/g;
67

78
export function create(
89
getTsPluginClient?: (
@@ -22,7 +23,10 @@ export function create(
2223
const decoded = context.decodeEmbeddedDocumentUri(uri);
2324
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
2425
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
25-
if (!sourceScript?.generated || virtualCode?.id !== 'template') {
26+
if (
27+
!sourceScript?.generated
28+
|| (virtualCode?.id !== 'template' && !virtualCode?.id.startsWith('script_'))
29+
) {
2630
return;
2731
}
2832

@@ -34,6 +38,7 @@ export function create(
3438
const hoverOffsets: [Position, number][] = [];
3539
const inlayHints: InlayHint[] = [];
3640

41+
const twoslashReg = virtualCode.id === 'template' ? twoslashTemplateReg : twoslashScriptReg;
3742
for (const pointer of document.getText(range).matchAll(twoslashReg)) {
3843
const offset = pointer.index + pointer[0].indexOf('^?') + document.offsetAt(range.start);
3944
const position = document.positionAt(offset);

packages/language-service/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
"volar-service-pug": "0.0.64",
2929
"volar-service-pug-beautify": "0.0.64",
3030
"volar-service-typescript": "0.0.64",
31-
"volar-service-typescript-twoslash-queries": "0.0.64",
3231
"vscode-html-languageservice": "^5.2.0",
3332
"vscode-uri": "^3.0.8"
3433
},

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)