Skip to content

Commit b930d3a

Browse files
authored
refactor(language-service): correct name and simplify logic of some plugins (#5521)
1 parent 26fa104 commit b930d3a

15 files changed

+220
-223
lines changed

packages/language-core/lib/plugins/vue-root-tags.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,17 @@ const plugin: VueLanguagePlugin = () => {
1818
embeddedFile.content.push([sfc.content, undefined, 0, allCodeFeatures]);
1919
for (
2020
const block of [
21+
sfc.template,
2122
sfc.script,
2223
sfc.scriptSetup,
23-
sfc.template,
2424
...sfc.styles,
2525
...sfc.customBlocks,
2626
]
2727
) {
2828
if (!block) {
2929
continue;
3030
}
31-
let content = block.content;
32-
if (content.endsWith('\r\n')) {
33-
content = content.slice(0, -2);
34-
}
35-
else if (content.endsWith('\n')) {
36-
content = content.slice(0, -1);
37-
}
38-
const offset = content.lastIndexOf('\n') + 1;
31+
const offset = block.content.lastIndexOf('\n', block.content.lastIndexOf('\n') - 1) + 1;
3932
// fix folding range end position failed to mapping
4033
replaceSourceRange(
4134
embeddedFile.content,

packages/language-service/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ import { create as createTypeScriptSyntacticPlugin } from 'volar-service-typescr
1515
import { create as createCssPlugin } from './lib/plugins/css';
1616
import { create as createTypescriptSemanticTokensPlugin } from './lib/plugins/typescript-semantic-tokens';
1717
import { create as createVueAutoDotValuePlugin } from './lib/plugins/vue-autoinsert-dotvalue';
18-
import { create as createVueAutoAddSpacePlugin } from './lib/plugins/vue-autoinsert-space';
18+
import { create as createVueAutoSpacePlugin } from './lib/plugins/vue-autoinsert-space';
1919
import { create as createVueCompilerDomErrorsPlugin } from './lib/plugins/vue-compiler-dom-errors';
2020
import { create as createVueComponentSemanticTokensPlugin } from './lib/plugins/vue-component-semantic-tokens';
2121
import { create as createVueDirectiveCommentsPlugin } from './lib/plugins/vue-directive-comments';
2222
import { create as createVueDocumentDropPlugin } from './lib/plugins/vue-document-drop';
2323
import { create as createVueDocumentHighlightsPlugin } from './lib/plugins/vue-document-highlights';
24-
import { create as createVueDocumentLinksPlugin } from './lib/plugins/vue-document-links';
2524
import { create as createVueExtractFilePlugin } from './lib/plugins/vue-extract-file';
2625
import { create as createVueGlobalTypesErrorPlugin } from './lib/plugins/vue-global-types-error';
2726
import { create as createVueInlayHintsPlugin } from './lib/plugins/vue-inlayhints';
2827
import { create as createVueMissingPropsHintsPlugin } from './lib/plugins/vue-missing-props-hints';
28+
import { create as createVueScopedClassLinksPlugin } from './lib/plugins/vue-scoped-class-links';
2929
import { create as createVueSfcPlugin } from './lib/plugins/vue-sfc';
3030
import { create as createVueSuggestDefineAssignmentPlugin } from './lib/plugins/vue-suggest-define-assignment';
3131
import { create as createVueTemplatePlugin } from './lib/plugins/vue-template';
32+
import { create as createVueTemplateRefLinksPlugin } from './lib/plugins/vue-template-ref-links';
3233
import { create as createVueTwoslashQueriesPlugin } from './lib/plugins/vue-twoslash-queries';
3334

3435
declare module '@volar/language-service' {
@@ -55,21 +56,22 @@ export function createVueLanguageServicePlugins(
5556
createTypeScriptDocCommentTemplatePlugin(ts),
5657
createTypescriptSemanticTokensPlugin(getTsPluginClient),
5758
createTypeScriptSyntacticPlugin(ts),
58-
createVueAutoAddSpacePlugin(),
59+
createVueAutoSpacePlugin(),
5960
createVueAutoDotValuePlugin(ts, getTsPluginClient),
6061
createVueCompilerDomErrorsPlugin(),
6162
createVueComponentSemanticTokensPlugin(getTsPluginClient),
6263
createVueDocumentDropPlugin(ts, getTsPluginClient),
63-
createVueDocumentLinksPlugin(),
6464
createVueDirectiveCommentsPlugin(),
6565
createVueExtractFilePlugin(ts, getTsPluginClient),
6666
createVueGlobalTypesErrorPlugin(),
6767
createVueInlayHintsPlugin(ts),
6868
createVueMissingPropsHintsPlugin(getTsPluginClient),
69+
createVueScopedClassLinksPlugin(),
6970
createVueSfcPlugin(),
7071
createVueSuggestDefineAssignmentPlugin(),
7172
createVueTemplatePlugin('html', getTsPluginClient),
7273
createVueTemplatePlugin('pug', getTsPluginClient),
74+
createVueTemplateRefLinksPlugin(),
7375
createVueTwoslashQueriesPlugin(getTsPluginClient),
7476
createEmmetPlugin({
7577
mappedLanguages: {

packages/language-service/lib/plugins/css.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { LanguageServicePlugin, TextDocument, VirtualCode } from '@volar/language-service';
2-
import { VueVirtualCode } from '@vue/language-core';
2+
import { isRenameEnabled, VueVirtualCode } from '@vue/language-core';
33
import { create as baseCreate, type Provide } from 'volar-service-css';
44
import type * as css from 'vscode-css-languageservice';
55
import { URI } from 'vscode-uri';
@@ -20,9 +20,11 @@ export function create(): LanguageServicePlugin {
2020
async provideDiagnostics(document, token) {
2121
let diagnostics = await baseInstance.provideDiagnostics?.(document, token) ?? [];
2222
if (document.languageId === 'postcss') {
23-
diagnostics = diagnostics.filter(diag => diag.code !== 'css-semicolonexpected');
24-
diagnostics = diagnostics.filter(diag => diag.code !== 'css-ruleorselectorexpected');
25-
diagnostics = diagnostics.filter(diag => diag.code !== 'unknownAtRules');
23+
diagnostics = diagnostics.filter(diag =>
24+
diag.code !== 'css-semicolonexpected'
25+
&& diag.code !== 'css-ruleorselectorexpected'
26+
&& diag.code !== 'unknownAtRules'
27+
);
2628
}
2729
return diagnostics;
2830
},
@@ -83,11 +85,7 @@ export function create(): LanguageServicePlugin {
8385

8486
const offset = document.offsetAt(position) + block.startTagEnd;
8587
for (const { sourceOffsets, lengths, data } of script.mappings) {
86-
if (
87-
!sourceOffsets.length
88-
|| !data.navigation
89-
|| typeof data.navigation === 'object' && !data.navigation.shouldRename
90-
) {
88+
if (!sourceOffsets.length || !isRenameEnabled(data)) {
9189
continue;
9290
}
9391

packages/language-service/lib/plugins/typescript-semantic-tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function create(
99
) => import('@vue/typescript-plugin/lib/requests').Requests | undefined,
1010
): LanguageServicePlugin {
1111
return {
12-
name: 'typescript-highlights',
12+
name: 'typescript-semantic-tokens',
1313
capabilities: {
1414
semanticTokensProvider: {
1515
legend: {

packages/language-service/lib/plugins/vue-autoinsert-dotvalue.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function create(
2121
create(context) {
2222
const tsPluginClient = getTsPluginClient?.(context);
2323
let currentReq = 0;
24+
2425
return {
2526
async provideAutoInsertSnippet(document, selection, change) {
2627
// selection must at end of change
@@ -67,32 +68,26 @@ export function create(
6768
return;
6869
}
6970

70-
let sourceCodeOffset = document.offsetAt(selection);
71-
let mapped = false;
72-
for (const [, map] of context.language.maps.forEach(virtualCode)) {
73-
for (const [sourceOffset] of map.toSourceLocation(sourceCodeOffset)) {
74-
sourceCodeOffset = sourceOffset;
75-
mapped = true;
76-
break;
77-
}
78-
if (mapped) {
79-
break;
80-
}
71+
let sourceOffset: number | undefined;
72+
const map = context.language.maps.get(virtualCode, sourceScript);
73+
for (const [offset] of map.toSourceLocation(document.offsetAt(selection))) {
74+
sourceOffset = offset;
75+
break;
8176
}
82-
if (!mapped) {
77+
if (sourceOffset === undefined) {
8378
return;
8479
}
8580

8681
for (const { ast, startTagEnd, endTagStart } of blocks) {
87-
if (sourceCodeOffset < startTagEnd || sourceCodeOffset > endTagStart) {
82+
if (sourceOffset < startTagEnd || sourceOffset > endTagStart) {
8883
continue;
8984
}
90-
if (isBlacklistNode(ts, ast, sourceCodeOffset - startTagEnd, false)) {
85+
if (isBlacklistNode(ts, ast, sourceOffset - startTagEnd, false)) {
9186
return;
9287
}
9388
}
9489

95-
const props = await tsPluginClient?.getPropertiesAtLocation(root.fileName, sourceCodeOffset) ?? [];
90+
const props = await tsPluginClient?.getPropertiesAtLocation(root.fileName, sourceOffset) ?? [];
9691
if (props.some(prop => prop === 'value')) {
9792
return '${1:.value}';
9893
}

packages/language-service/lib/plugins/vue-compiler-dom-errors.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ export function create(): LanguageServicePlugin {
2121
const uri = URI.parse(document.uri);
2222
const decoded = context.decodeEmbeddedDocumentUri(uri);
2323
const sourceScript = decoded && context.language.scripts.get(decoded[0]);
24-
const virtualCode = decoded && sourceScript?.generated?.embeddedCodes.get(decoded[1]);
25-
if (!virtualCode) {
26-
return;
27-
}
2824

2925
const root = sourceScript?.generated?.root;
3026
if (!(root instanceof VueVirtualCode)) {

packages/language-service/lib/plugins/vue-component-semantic-tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function create(
99
) => import('@vue/typescript-plugin/lib/requests').Requests | undefined,
1010
): LanguageServicePlugin {
1111
return {
12-
name: 'vue-component-highlights',
12+
name: 'vue-component-semantic-tokens',
1313
capabilities: {
1414
semanticTokensProvider: {
1515
legend: {

packages/language-service/lib/plugins/vue-document-links.ts

Lines changed: 0 additions & 131 deletions
This file was deleted.

packages/language-service/lib/plugins/vue-extract-file.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ export function create(
235235
const props = toExtract.filter(p => !p.model);
236236
const models = toExtract.filter(p => p.model);
237237
if (props.length) {
238-
lines.push(`defineProps<{ \n\t${props.map(p => `${p.name}: ${p.type};`).join('\n\t')}\n}>()`);
238+
lines.push(`defineProps<{\n\t${props.map(p => `${p.name}: ${p.type};`).join('\n\t')}\n}>()`);
239239
}
240240
for (const model of models) {
241241
lines.push(`const ${model.name} = defineModel<${model.type}>('${model.name}', { required: true })`);

packages/language-service/lib/plugins/vue-global-types-error.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { URI } from 'vscode-uri';
44

55
export function create(): LanguageServicePlugin {
66
return {
7-
name: 'vue-compiler-dom-errors',
7+
name: 'vue-global-types-error',
88
capabilities: {
99
diagnosticProvider: {
1010
interFileDependencies: false,

0 commit comments

Comments
 (0)