From 2a08d4b76acc79a7154e1d05505740dd433aea3e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 1 Dec 2025 02:17:15 +0800 Subject: [PATCH 01/11] refactor(language-core): split style codegen --- packages/language-core/lib/codegen/names.ts | 1 + .../language-core/lib/codegen/script/index.ts | 5 +- .../lib/codegen/script/scriptSetup.ts | 4 +- .../lib/codegen/script/template.ts | 63 +++++-------------- .../language-core/lib/codegen/style/index.ts | 49 +++++++++++++++ .../lib/codegen/style/modules.ts | 13 ++-- .../lib/codegen/style/scopedClasses.ts | 4 +- .../lib/codegen/template/index.ts | 8 +-- .../lib/codegen/template/interpolation.ts | 10 +-- packages/language-core/lib/plugins/vue-tsx.ts | 36 ++++++++++- tsslint.config.ts | 1 - 11 files changed, 123 insertions(+), 71 deletions(-) create mode 100644 packages/language-core/lib/codegen/style/index.ts diff --git a/packages/language-core/lib/codegen/names.ts b/packages/language-core/lib/codegen/names.ts index 595156570a..7b55a88462 100644 --- a/packages/language-core/lib/codegen/names.ts +++ b/packages/language-core/lib/codegen/names.ts @@ -27,5 +27,6 @@ export const InternalProps = '__VLS_InternalProps'; export const Emit = '__VLS_Emit'; export const Bindings = '__VLS_Bindings'; export const PublicProps = '__VLS_PublicProps'; +export const StyleModules = '__VLS_StyleModules'; export const PROPS_FALLBACK = '__VLS_PROPS_FALLBACK'; diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 7cae3c8258..718f5f8d5f 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -20,17 +20,14 @@ export interface ScriptCodegenOptions { vueCompilerOptions: VueCompilerOptions; script: Sfc['script']; scriptSetup: Sfc['scriptSetup']; - styles: Sfc['styles']; fileName: string; lang: string; scriptRanges: ScriptRanges | undefined; scriptSetupRanges: ScriptSetupRanges | undefined; templateComponents: string[]; templateStartTagOffset: number | undefined; - // TODO: remove this for better increment ality templateCodegen: TemplateCodegenContext & { codes: Code[] } | undefined; - destructuredPropNames: Set; - templateRefNames: Set; + styleCodegen: TemplateCodegenContext & { codes: Code[] } | undefined; } export { generate as generateScript }; diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index f5a1886079..ec97440d42 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -194,7 +194,7 @@ export function* generateSetupFunction( if (arg) { transforms.push( insert(callExp.end, function*() { - yield ` as Omit<__VLS_StyleModules, '$style'>[`; + yield ` as Omit<${names.StyleModules}, '$style'>[`; yield* generateSfcBlockSection(scriptSetup, arg.start, arg.end, codeFeatures.withoutSemantic); yield `])`; }), @@ -206,7 +206,7 @@ export function* generateSetupFunction( else { transforms.push( insert(callExp.end, function*() { - yield ` as __VLS_StyleModules[`; + yield ` as ${names.StyleModules}[`; const token = yield* startBoundary(scriptSetup.name, exp.start, codeFeatures.verification); yield `'$style'`; yield endBoundary(token, exp.end); diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index d4ab660204..55d024e69f 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -3,10 +3,6 @@ import * as path from 'path-browserify'; import type { Code } from '../../types'; import { codeFeatures } from '../codeFeatures'; import * as names from '../names'; -import { generateStyleModules } from '../style/modules'; -import { generateStyleScopedClasses } from '../style/scopedClasses'; -import { createTemplateCodegenContext, type TemplateCodegenContext } from '../template/context'; -import { generateInterpolation } from '../template/interpolation'; import { endOfLine, generateSfcBlockSection, newLine } from '../utils'; import { generateSpreadMerge } from '../utils/merge'; import type { ScriptCodegenContext } from './context'; @@ -17,19 +13,14 @@ export function* generateTemplate( ctx: ScriptCodegenContext, ): Generator { yield* generateSelf(options); + yield* generateBindings(options, ctx); yield* generateTemplateCtx(options, ctx); yield* generateTemplateComponents(options); yield* generateTemplateDirectives(options); - const templateCodegenCtx = createTemplateCodegenContext({ - scriptSetupBindingNames: new Set(), - }); - - yield* generateStyleScopedClasses(options); - yield* generateStyleModules(options); - yield* generateCssVars(options, templateCodegenCtx); - yield* generateBindings(options, ctx, templateCodegenCtx); - + if (options.styleCodegen) { + yield* options.styleCodegen.codes; + } if (options.templateCodegen) { yield* options.templateCodegen.codes; } @@ -54,7 +45,7 @@ function* generateSelf({ script, scriptRanges, vueCompilerOptions, fileName }: S } function* generateTemplateCtx( - { vueCompilerOptions, script, scriptRanges, styles, scriptSetupRanges, fileName }: ScriptCodegenOptions, + { vueCompilerOptions, script, scriptRanges, styleCodegen, scriptSetupRanges, fileName }: ScriptCodegenOptions, ctx: ScriptCodegenContext, ): Generator { const exps: Iterable[] = []; @@ -70,8 +61,8 @@ function* generateTemplateCtx( else { exps.push([`{} as import('${vueCompilerOptions.lib}').ComponentPublicInstance`]); } - if (styles.some(style => style.module)) { - exps.push([`{} as __VLS_StyleModules`]); + if (styleCodegen?.generatedTypes.has(names.StyleModules)) { + exps.push([`{} as ${names.StyleModules}`]); } if (scriptSetupRanges?.defineEmits) { @@ -109,7 +100,7 @@ function* generateTemplateCtx( exps.push([`{} as ${names.InternalProps}`]); } - if (scriptSetupRanges && ctx.bindingNames.size) { + if (ctx.generatedTypes.has(names.Bindings)) { exps.push([`{} as ${names.Bindings}`]); } @@ -158,48 +149,26 @@ function* generateTemplateDirectives(options: ScriptCodegenOptions): Generator { - for (const style of options.styles) { - for (const binding of style.bindings) { - yield* generateInterpolation( - options, - ctx, - style, - codeFeatures.all, - binding.text, - binding.offset, - `(`, - `)`, - ); - yield endOfLine; - } - } -} - function* generateBindings( - options: ScriptCodegenOptions, + { scriptSetup, templateComponents, templateCodegen, styleCodegen }: ScriptCodegenOptions, ctx: ScriptCodegenContext, - templateCodegenCtx: TemplateCodegenContext, ): Generator { - if (!options.scriptSetup || !ctx.bindingNames.size) { + if (!(scriptSetup && ctx.bindingNames.size)) { return; } + ctx.generatedTypes.add(names.Bindings); - const usageVars = new Set([ - ...options.templateComponents.flatMap(c => [camelize(c), capitalize(camelize(c))]), - ...options.templateCodegen?.accessExternalVariables.keys() ?? [], - ...templateCodegenCtx.accessExternalVariables.keys(), + const usedVars = new Set([ + ...templateComponents.flatMap(c => [camelize(c), capitalize(camelize(c))]), + ...templateCodegen?.accessExternalVariables.keys() ?? [], + ...styleCodegen?.accessExternalVariables.keys() ?? [], ]); yield `type ${names.Bindings} = __VLS_ProxyRefs<{${newLine}`; for (const varName of ctx.bindingNames) { - if (!usageVars.has(varName)) { + if (!usedVars.has(varName)) { continue; } - const token = Symbol(varName.length); yield ['', undefined, 0, { __linkedToken: token }]; yield `${varName}: typeof `; diff --git a/packages/language-core/lib/codegen/style/index.ts b/packages/language-core/lib/codegen/style/index.ts new file mode 100644 index 0000000000..60cb1489b5 --- /dev/null +++ b/packages/language-core/lib/codegen/style/index.ts @@ -0,0 +1,49 @@ +import type { Code, Sfc, VueCompilerOptions } from '../../types'; +import { codeFeatures } from '../codeFeatures'; +import { generateStyleModules } from '../style/modules'; +import { generateStyleScopedClasses } from '../style/scopedClasses'; +import { createTemplateCodegenContext, type TemplateCodegenContext } from '../template/context'; +import { generateInterpolation } from '../template/interpolation'; +import { endOfLine } from '../utils'; + +export interface StyleCodegenOptions { + ts: typeof import('typescript'); + vueCompilerOptions: VueCompilerOptions; + usedCssModule: boolean; + styles: Sfc['styles']; + destructuredPropNames: Set; + templateRefNames: Set; +} + +export { generate as generateStyle }; + +function* generate(options: StyleCodegenOptions) { + const ctx = createTemplateCodegenContext({ + scriptSetupBindingNames: new Set(), + }); + yield* generateStyleScopedClasses(options); + yield* generateStyleModules(options, ctx); + yield* generateCssVars(options, ctx); + return ctx; +} + +function* generateCssVars( + options: StyleCodegenOptions, + ctx: TemplateCodegenContext, +): Generator { + for (const style of options.styles) { + for (const binding of style.bindings) { + yield* generateInterpolation( + options, + ctx, + style, + codeFeatures.all, + binding.text, + binding.offset, + `(`, + `)`, + ); + yield endOfLine; + } + } +} diff --git a/packages/language-core/lib/codegen/style/modules.ts b/packages/language-core/lib/codegen/style/modules.ts index 356f03addb..eeca01f816 100644 --- a/packages/language-core/lib/codegen/style/modules.ts +++ b/packages/language-core/lib/codegen/style/modules.ts @@ -1,17 +1,22 @@ +import type { StyleCodegenOptions } from '.'; import type { Code } from '../../types'; import { codeFeatures } from '../codeFeatures'; -import type { ScriptCodegenOptions } from '../script'; +import type { TemplateCodegenContext } from '../template/context'; import { endOfLine, newLine } from '../utils'; import { generateClassProperty, generateStyleImports } from './common'; +import * as names from '../names'; export function* generateStyleModules( - { styles, scriptSetupRanges, vueCompilerOptions }: ScriptCodegenOptions, + { styles, usedCssModule, vueCompilerOptions }: StyleCodegenOptions, + ctx: TemplateCodegenContext, ): Generator { const styleModules = styles.filter(style => style.module); - if (!styleModules.length && !scriptSetupRanges?.useCssModule.length) { + if (!styleModules.length && !usedCssModule) { return; } - yield `type __VLS_StyleModules = {${newLine}`; + ctx.generatedTypes.add(names.StyleModules); + + yield `type ${names.StyleModules} = {${newLine}`; for (const style of styleModules) { if (style.module === true) { yield `$style`; diff --git a/packages/language-core/lib/codegen/style/scopedClasses.ts b/packages/language-core/lib/codegen/style/scopedClasses.ts index ef34ea521c..f22dd95bfc 100644 --- a/packages/language-core/lib/codegen/style/scopedClasses.ts +++ b/packages/language-core/lib/codegen/style/scopedClasses.ts @@ -1,11 +1,11 @@ +import type{ StyleCodegenOptions } from '.'; import type { Code } from '../../types'; -import type { ScriptCodegenOptions } from '../script'; import { generateStyleScopedClassReference } from '../template/styleScopedClasses'; import { endOfLine } from '../utils'; import { generateClassProperty, generateStyleImports } from './common'; export function* generateStyleScopedClasses( - { vueCompilerOptions, styles }: ScriptCodegenOptions, + { vueCompilerOptions, styles }: StyleCodegenOptions, ): Generator { const { resolveStyleClassNames, resolveStyleImports } = vueCompilerOptions; if (!resolveStyleClassNames) { diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index d3d27da27a..8fcf092ad0 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -27,19 +27,19 @@ export interface TemplateCodegenOptions { export { generate as generateTemplate }; function generate(options: TemplateCodegenOptions) { - const context = createTemplateCodegenContext(options); - const codegen = generateWorker(options, context); + const ctx = createTemplateCodegenContext(options); + const codegen = generateWorker(options, ctx); const codes: Code[] = []; for (const code of codegen) { if (typeof code === 'object') { - code[3] = context.resolveCodeFeatures(code[3]); + code[3] = ctx.resolveCodeFeatures(code[3]); } codes.push(code); } return { - ...context, + ...ctx, codes, }; } diff --git a/packages/language-core/lib/codegen/template/interpolation.ts b/packages/language-core/lib/codegen/template/interpolation.ts index d6d0e4f7df..e4e595c272 100644 --- a/packages/language-core/lib/codegen/template/interpolation.ts +++ b/packages/language-core/lib/codegen/template/interpolation.ts @@ -5,7 +5,7 @@ import { collectBindingNames } from '../../utils/collectBindings'; import { getNodeText, getStartEnd } from '../../utils/shared'; import { codeFeatures } from '../codeFeatures'; import * as names from '../names'; -import type { ScriptCodegenOptions } from '../script'; +import type { StyleCodegenOptions } from '../style'; import { forEachNode, getTypeScriptAST, identifierRegex } from '../utils'; import type { TemplateCodegenContext } from './context'; import type { TemplateCodegenOptions } from './index'; @@ -15,7 +15,7 @@ const isLiteralWhitelisted = /*@__PURE__*/ makeMap('true,false,null,this'); export function* generateInterpolation( options: Pick< - TemplateCodegenOptions | ScriptCodegenOptions, + TemplateCodegenOptions | StyleCodegenOptions, 'ts' | 'destructuredPropNames' | 'templateRefNames' >, ctx: TemplateCodegenContext, @@ -71,7 +71,7 @@ export function* generateInterpolation( function* forEachInterpolationSegment( options: Pick< - TemplateCodegenOptions | ScriptCodegenOptions, + TemplateCodegenOptions | StyleCodegenOptions, 'ts' | 'destructuredPropNames' | 'templateRefNames' >, ctx: TemplateCodegenContext, @@ -135,7 +135,7 @@ function* forEachInterpolationSegment( function* forEachIdentifiers( options: Pick< - TemplateCodegenOptions | ScriptCodegenOptions, + TemplateCodegenOptions | StyleCodegenOptions, 'ts' | 'destructuredPropNames' >, ctx: TemplateCodegenContext, @@ -289,7 +289,7 @@ function* forEachDeclarationsInTypeNode( function shouldIdentifierSkipped( { destructuredPropNames }: Pick< - TemplateCodegenOptions | ScriptCodegenOptions, + TemplateCodegenOptions | StyleCodegenOptions, 'destructuredPropNames' >, ctx: TemplateCodegenContext, diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index b8ae188e34..148ae4d699 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -7,8 +7,10 @@ import { CompilerOptionsResolver } from '../compilerOptions'; import { parseScriptRanges } from '../parsers/scriptRanges'; import { parseScriptSetupRanges } from '../parsers/scriptSetupRanges'; import { parseVueCompilerOptions } from '../parsers/vueCompilerOptions'; -import type { Sfc, VueLanguagePlugin } from '../types'; +import type { Code, Sfc, VueLanguagePlugin } from '../types'; import { computedArray, computedSet } from '../utils/signals'; +import { generateStyle } from '../codegen/style'; +import { TemplateCodegenContext } from '../codegen/template/context'; export const tsCodegen = new WeakMap>(); @@ -216,7 +218,6 @@ function useCodegen( vueCompilerOptions: getResolvedOptions(), script: sfc.script, scriptSetup: sfc.scriptSetup, - styles: sfc.styles, fileName, lang: getLang(), scriptRanges: getScriptRanges(), @@ -224,9 +225,40 @@ function useCodegen( templateCodegen: getGeneratedTemplate(), templateComponents: getTemplateComponents(), templateStartTagOffset: getTemplateStartTagOffset(), + styleCodegen: getGeneratedStyle(), + }); + }); + + const usedCssModule = computed(() => !!getScriptSetupRanges()?.useCssModule.length); + + const getGeneratedStyle = computed(() => { + if (!sfc.styles.length) { + return; + } + const generation = generateStyle({ + ts, + vueCompilerOptions: getResolvedOptions(), + usedCssModule: usedCssModule(), + styles: sfc.styles, destructuredPropNames: getSetupDestructuredPropNames(), templateRefNames: getSetupTemplateRefNames(), }); + const codes: Code[] = []; + let ctx: TemplateCodegenContext; + + while (true) { + const result = generation.next(); + if (result.done) { + ctx = result.value; + break; + } + codes.push(result.value); + } + + return { + ...ctx, + codes, + }; }); return { diff --git a/tsslint.config.ts b/tsslint.config.ts index e437ac04f5..f3c5e0c00e 100644 --- a/tsslint.config.ts +++ b/tsslint.config.ts @@ -95,7 +95,6 @@ export default defineConfig({ fixStyle: 'inline-type-imports', }], '@typescript-eslint/no-unnecessary-type-assertion': true, - '@typescript-eslint/no-unnecessary-condition': true, }), 'missing-dependency'({ typescript: ts, file, program, report }) { const { noEmit } = program.getCompilerOptions(); From fe372e816a91d17b5835bae236a5e4c57433e77c Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 1 Dec 2025 02:19:06 +0800 Subject: [PATCH 02/11] Update vue-tsx.ts --- packages/language-core/lib/plugins/vue-tsx.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 148ae4d699..3631ff946e 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -2,15 +2,15 @@ import { camelize, capitalize } from '@vue/shared'; import { computed } from 'alien-signals'; import * as path from 'path-browserify'; import { generateScript } from '../codegen/script'; +import { generateStyle } from '../codegen/style'; import { generateTemplate } from '../codegen/template'; +import type { TemplateCodegenContext } from '../codegen/template/context'; import { CompilerOptionsResolver } from '../compilerOptions'; import { parseScriptRanges } from '../parsers/scriptRanges'; import { parseScriptSetupRanges } from '../parsers/scriptSetupRanges'; import { parseVueCompilerOptions } from '../parsers/vueCompilerOptions'; import type { Code, Sfc, VueLanguagePlugin } from '../types'; import { computedArray, computedSet } from '../utils/signals'; -import { generateStyle } from '../codegen/style'; -import { TemplateCodegenContext } from '../codegen/template/context'; export const tsCodegen = new WeakMap>(); From a364a2888e7c23b63ae4ddcbcfb6c8c55c707c7f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 1 Dec 2025 02:41:20 +0800 Subject: [PATCH 03/11] wip --- .../lib/codegen/script/context.ts | 8 --- .../language-core/lib/codegen/script/index.ts | 1 + .../lib/codegen/script/scriptSetup.ts | 9 +-- .../lib/codegen/script/template.ts | 6 +- .../language-core/lib/codegen/style/index.ts | 7 +- .../lib/codegen/template/context.ts | 65 ++++++++++--------- .../lib/codegen/template/element.ts | 2 +- .../lib/codegen/template/elementDirectives.ts | 2 +- .../lib/codegen/template/elementProps.ts | 2 +- .../lib/codegen/template/index.ts | 4 +- .../lib/codegen/template/interpolation.ts | 2 +- packages/language-core/lib/plugins/vue-tsx.ts | 21 ++++-- 12 files changed, 67 insertions(+), 62 deletions(-) diff --git a/packages/language-core/lib/codegen/script/context.ts b/packages/language-core/lib/codegen/script/context.ts index bc68787bd9..d95aa42caf 100644 --- a/packages/language-core/lib/codegen/script/context.ts +++ b/packages/language-core/lib/codegen/script/context.ts @@ -10,14 +10,6 @@ export function createScriptCodegenContext(options: ScriptCodegenOptions) { return { generatedTypes: new Set(), - bindingNames: new Set([ - ...options.scriptRanges?.bindings.map( - ({ range }) => options.script!.content.slice(range.start, range.end), - ) ?? [], - ...options.scriptSetupRanges?.bindings.map( - ({ range }) => options.scriptSetup!.content.slice(range.start, range.end), - ) ?? [], - ]), localTypes, inlayHints, }; diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 718f5f8d5f..fdac1b3ac9 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -28,6 +28,7 @@ export interface ScriptCodegenOptions { templateStartTagOffset: number | undefined; templateCodegen: TemplateCodegenContext & { codes: Code[] } | undefined; styleCodegen: TemplateCodegenContext & { codes: Code[] } | undefined; + scriptBindings: Set; } export { generate as generateScript }; diff --git a/packages/language-core/lib/codegen/script/scriptSetup.ts b/packages/language-core/lib/codegen/script/scriptSetup.ts index ec97440d42..45698ca137 100644 --- a/packages/language-core/lib/codegen/script/scriptSetup.ts +++ b/packages/language-core/lib/codegen/script/scriptSetup.ts @@ -282,7 +282,7 @@ export function* generateSetupFunction( (start, end) => generateSfcBlockSection(scriptSetup, start, end, codeFeatures.all, end === scriptSetup.content.length), ); - yield* generateMacros(options, ctx); + yield* generateMacros(options); yield* generateModels(scriptSetup, scriptSetupRanges); yield* generatePublicProps(options, ctx, scriptSetup, scriptSetupRanges); yield* body; @@ -303,15 +303,12 @@ export function* generateSetupFunction( } } -function* generateMacros( - options: ScriptCodegenOptions, - ctx: ScriptCodegenContext, -): Generator { +function* generateMacros(options: ScriptCodegenOptions): Generator { if (options.vueCompilerOptions.target >= 3.3) { yield `// @ts-ignore${newLine}`; yield `declare const { `; for (const macro of Object.keys(options.vueCompilerOptions.macros)) { - if (!ctx.bindingNames.has(macro)) { + if (!options.scriptBindings.has(macro)) { yield `${macro}, `; } } diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 55d024e69f..b18a8ca9b3 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -150,10 +150,10 @@ function* generateTemplateDirectives(options: ScriptCodegenOptions): Generator { - if (!(scriptSetup && ctx.bindingNames.size)) { + if (!scriptBindings.size) { return; } ctx.generatedTypes.add(names.Bindings); @@ -165,7 +165,7 @@ function* generateBindings( ]); yield `type ${names.Bindings} = __VLS_ProxyRefs<{${newLine}`; - for (const varName of ctx.bindingNames) { + for (const varName of scriptBindings) { if (!usedVars.has(varName)) { continue; } diff --git a/packages/language-core/lib/codegen/style/index.ts b/packages/language-core/lib/codegen/style/index.ts index 60cb1489b5..6c9473317e 100644 --- a/packages/language-core/lib/codegen/style/index.ts +++ b/packages/language-core/lib/codegen/style/index.ts @@ -13,17 +13,18 @@ export interface StyleCodegenOptions { styles: Sfc['styles']; destructuredPropNames: Set; templateRefNames: Set; + scriptBindings: Set; } export { generate as generateStyle }; function* generate(options: StyleCodegenOptions) { - const ctx = createTemplateCodegenContext({ - scriptSetupBindingNames: new Set(), - }); + const ctx = createTemplateCodegenContext(options.scriptBindings); + const endScope = ctx.startScope(); yield* generateStyleScopedClasses(options); yield* generateStyleModules(options, ctx); yield* generateCssVars(options, ctx); + yield* endScope(); return ctx; } diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index 15a1ac4fe4..d71740fe2a 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -4,7 +4,6 @@ import { codeFeatures } from '../codeFeatures'; import type { InlayHintInfo } from '../inlayHints'; import { endOfLine, newLine } from '../utils'; import { endBoundary, startBoundary } from '../utils/boundary'; -import type { TemplateCodegenOptions } from './index'; export type TemplateCodegenContext = ReturnType; @@ -108,14 +107,14 @@ const commentDirectiveRegex = /^