Skip to content

Commit 9fc27c5

Browse files
committed
fix(language-core): unable to get completion for the second scoped class name
1 parent 4a16e57 commit 9fc27c5

File tree

17 files changed

+172
-230
lines changed

17 files changed

+172
-230
lines changed

packages/language-core/lib/codegen/script/template.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { generateStyleModules } from '../style/modules';
77
import { generateStyleScopedClasses } from '../style/scopedClasses';
88
import { createTemplateCodegenContext, type TemplateCodegenContext } from '../template/context';
99
import { generateInterpolation } from '../template/interpolation';
10-
import { generateStyleScopedClassReferences } from '../template/styleScopedClasses';
1110
import { endOfLine, generateSfcBlockSection, newLine } from '../utils';
1211
import { generateSpreadMerge } from '../utils/merge';
1312
import type { ScriptCodegenContext } from './context';
@@ -26,8 +25,7 @@ export function* generateTemplate(
2625
scriptSetupBindingNames: new Set(),
2726
});
2827

29-
yield* generateStyleScopedClasses(options, templateCodegenCtx);
30-
yield* generateStyleScopedClassReferences(templateCodegenCtx, true);
28+
yield* generateStyleScopedClasses(options);
3129
yield* generateStyleModules(options);
3230
yield* generateCssVars(options, templateCodegenCtx);
3331
yield* generateBindings(options, ctx, templateCodegenCtx);

packages/language-core/lib/codegen/style/classProperty.ts

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

packages/language-core/lib/codegen/style/imports.ts renamed to packages/language-core/lib/codegen/style/common.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
import type { Code, Sfc, VueCodeInformation } from '../../types';
2+
import { codeFeatures } from '../codeFeatures';
23
import { newLine } from '../utils';
34
import { endBoundary, startBoundary } from '../utils/boundary';
45

5-
export function* generateStyleImports(
6-
style: Sfc['styles'][number],
6+
export function* generateClassProperty(
7+
source: string,
8+
classNameWithDot: string,
9+
offset: number,
10+
propertyType: string,
711
): Generator<Code> {
12+
yield `${newLine} & { `;
13+
const token = yield* startBoundary(source, offset, codeFeatures.navigation);
14+
yield `'`;
15+
yield [classNameWithDot.slice(1), source, offset + 1, { __combineToken: token }];
16+
yield `'`;
17+
yield endBoundary(token, offset + classNameWithDot.length);
18+
yield `: ${propertyType}`;
19+
yield ` }`;
20+
}
21+
22+
export function* generateStyleImports(style: Sfc['styles'][number]): Generator<Code> {
823
const features: VueCodeInformation = {
924
navigation: true,
1025
verification: true,

packages/language-core/lib/codegen/style/modules.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ import type { Code } from '../../types';
22
import { codeFeatures } from '../codeFeatures';
33
import type { ScriptCodegenOptions } from '../script';
44
import { endOfLine, newLine } from '../utils';
5-
import { generateClassProperty } from './classProperty';
6-
import { generateStyleImports } from './imports';
5+
import { generateClassProperty, generateStyleImports } from './common';
76

87
export function* generateStyleModules(
9-
options: ScriptCodegenOptions,
8+
{ styles, scriptSetupRanges, vueCompilerOptions }: ScriptCodegenOptions,
109
): Generator<Code> {
11-
const styles = options.styles.map((style, i) => [style, i] as const).filter(([style]) => style.module);
12-
if (!styles.length && !options.scriptSetupRanges?.useCssModule.length) {
10+
const styleModules = styles.filter(style => style.module);
11+
if (!styleModules.length && !scriptSetupRanges?.useCssModule.length) {
1312
return;
1413
}
1514
yield `type __VLS_StyleModules = {${newLine}`;
16-
for (const [style, i] of styles) {
15+
for (const style of styleModules) {
1716
if (style.module === true) {
1817
yield `$style`;
1918
}
@@ -27,16 +26,16 @@ export function* generateStyleModules(
2726
];
2827
}
2928
yield `: `;
30-
if (!options.vueCompilerOptions.strictCssModules) {
29+
if (!vueCompilerOptions.strictCssModules) {
3130
yield `Record<string, string> & `;
3231
}
3332
yield `__VLS_PrettifyGlobal<{}`;
34-
if (options.vueCompilerOptions.resolveStyleImports) {
33+
if (vueCompilerOptions.resolveStyleImports) {
3534
yield* generateStyleImports(style);
3635
}
3736
for (const className of style.classNames) {
3837
yield* generateClassProperty(
39-
i,
38+
style.name,
4039
className.text,
4140
className.offset,
4241
'string',
Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,41 @@
11
import type { Code } from '../../types';
22
import type { ScriptCodegenOptions } from '../script';
3-
import type { TemplateCodegenContext } from '../template/context';
3+
import { generateStyleScopedClassReference } from '../template/styleScopedClasses';
44
import { endOfLine } from '../utils';
5-
import { generateClassProperty } from './classProperty';
6-
import { generateStyleImports } from './imports';
5+
import { generateClassProperty, generateStyleImports } from './common';
76

87
export function* generateStyleScopedClasses(
9-
options: ScriptCodegenOptions,
10-
ctx: TemplateCodegenContext,
8+
{ vueCompilerOptions, styles }: ScriptCodegenOptions,
119
): Generator<Code> {
12-
const option = options.vueCompilerOptions.resolveStyleClassNames;
13-
const styles = options.styles
14-
.map((style, i) => [style, i] as const)
15-
.filter(([style]) => option === true || (option === 'scoped' && style.scoped));
16-
if (!styles.length) {
10+
const { resolveStyleClassNames, resolveStyleImports } = vueCompilerOptions;
11+
if (!resolveStyleClassNames) {
1712
return;
1813
}
19-
20-
const firstClasses = new Set<string>();
14+
const scopedStyles = styles.filter(style => resolveStyleClassNames === true || style.scoped);
15+
if (!scopedStyles.length) {
16+
return;
17+
}
18+
const visited = new Set<string>();
19+
const deferredGenerations: Generator<Code>[] = [];
2120
yield `type __VLS_StyleScopedClasses = {}`;
22-
for (const [style, i] of styles) {
23-
if (options.vueCompilerOptions.resolveStyleImports) {
21+
for (const style of scopedStyles) {
22+
if (resolveStyleImports) {
2423
yield* generateStyleImports(style);
2524
}
2625
for (const className of style.classNames) {
27-
if (firstClasses.has(className.text)) {
28-
ctx.scopedClasses.push({
29-
source: 'style_' + i,
30-
className: className.text.slice(1),
31-
offset: className.offset + 1,
32-
});
33-
continue;
26+
if (!visited.has(className.text)) {
27+
visited.add(className.text);
28+
yield* generateClassProperty(style.name, className.text, className.offset, 'boolean');
29+
}
30+
else {
31+
deferredGenerations.push(
32+
generateStyleScopedClassReference(style, className.text.slice(1), className.offset + 1),
33+
);
3434
}
35-
firstClasses.add(className.text);
36-
yield* generateClassProperty(
37-
i,
38-
className.text,
39-
className.offset,
40-
'boolean',
41-
);
4235
}
4336
}
4437
yield endOfLine;
38+
for (const generate of deferredGenerations) {
39+
yield* generate;
40+
}
4541
}

packages/language-core/lib/codegen/template/context.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,6 @@ export function createTemplateCodegenContext(
128128
propsVar: string;
129129
}[] = [];
130130
const blockConditions: string[] = [];
131-
const scopedClasses: {
132-
source: string;
133-
className: string;
134-
offset: number;
135-
}[] = [];
136-
const emptyClassOffsets: number[] = [];
137131
const inlayHints: InlayHintInfo[] = [];
138132
const inheritedAttrVars = new Set<string>();
139133
const templateRefs = new Map<string, {
@@ -166,8 +160,6 @@ export function createTemplateCodegenContext(
166160
dollarVars,
167161
accessExternalVariables,
168162
blockConditions,
169-
scopedClasses,
170-
emptyClassOffsets,
171163
inlayHints,
172164
inheritedAttrVars,
173165
templateRefs,

0 commit comments

Comments
 (0)