From 49ded225ff3a811acad7e848f01d256448abaf1b Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Thu, 16 Jun 2022 11:35:41 +0800 Subject: [PATCH] fix: scope class name missing underline close #1447 --- .../src/plugins/vue-typescript-template.ts | 6 +-- packages/vue-typescript/src/sourceFile.ts | 42 ++++++++----------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/packages/vue-typescript/src/plugins/vue-typescript-template.ts b/packages/vue-typescript/src/plugins/vue-typescript-template.ts index 4f5c92440..c89f82fb7 100644 --- a/packages/vue-typescript/src/plugins/vue-typescript-template.ts +++ b/packages/vue-typescript/src/plugins/vue-typescript-template.ts @@ -8,12 +8,12 @@ import { ComputedRef } from '@vue/reactivity'; import * as path from 'path'; import { VueCompilerOptions } from '../types'; import { SearchTexts } from '../utils/string'; -import { EmbeddedFile, useCssModuleClasses, useCssScopedClasses, useCssVars, VueLanguagePlugin } from '../sourceFile'; +import { EmbeddedFile, useStyleCssClasses, useCssVars, VueLanguagePlugin } from '../sourceFile'; export default function ( ts: typeof import('typescript/lib/tsserverlibrary'), - cssModuleClasses: ReturnType, - cssScopedClasses: ReturnType, + cssModuleClasses: ReturnType, + cssScopedClasses: ReturnType, templateCodeGens: ComputedRef | undefined>, cssVars: ReturnType, scriptSetupRanges: ComputedRef | undefined>, diff --git a/packages/vue-typescript/src/sourceFile.ts b/packages/vue-typescript/src/sourceFile.ts index 129a6b933..6ce145c13 100644 --- a/packages/vue-typescript/src/sourceFile.ts +++ b/packages/vue-typescript/src/sourceFile.ts @@ -160,8 +160,11 @@ export function createSourceFile( ); } }); - const cssModuleClasses = useCssModuleClasses(sfc); - const cssScopedClasses = useCssScopedClasses(sfc, vueCompilerOptions); + const cssModuleClasses = useStyleCssClasses(sfc, style => !!style.module); + const cssScopedClasses = useStyleCssClasses(sfc, style => { + const setting = compilerOptions.experimentalResolveStyleCssClasses ?? 'scoped'; + return (setting === 'scoped' && style.scoped) || setting === 'always'; + }); const templateCodeGens = computed(() => { if (!computedHtmlTemplate.value) @@ -180,7 +183,7 @@ export function createSourceFile( sfc.template?.lang ?? 'html', templateAstCompiled.value.ast, !!sfc.scriptSetup, - Object.values(cssScopedClasses.value).map(map => Object.keys(map)).flat(), + Object.values(cssScopedClasses.value).map(style => style.classNames).flat(), computedHtmlTemplate.value.mapping, { getEmitCompletion: SearchTexts.EmitCompletion, @@ -761,34 +764,23 @@ export function createSourceFile( } } -export function useCssModuleClasses(sfc: Sfc) { +export function useStyleCssClasses(sfc: Sfc, condition: (style: Sfc['styles'][number]) => boolean) { return computed(() => { - const result: { style: typeof sfc.styles[number], index: number, classNameRanges: TextRange[]; }[] = []; - for (let i = 0; i < sfc.styles.length; i++) { - const style = sfc.styles[i]; - if (style.module) { - result.push({ - style: style, - index: i, - classNameRanges: [...parseCssClassNames(style.content)], - }); - } - } - return result; - }); -} - -export function useCssScopedClasses(sfc: Sfc, compilerOptions: VueCompilerOptions) { - return computed(() => { - const result: { style: typeof sfc.styles[number], index: number, classNameRanges: TextRange[]; }[] = []; - const setting = compilerOptions.experimentalResolveStyleCssClasses ?? 'scoped'; + const result: { + style: typeof sfc.styles[number], + index: number, + classNameRanges: TextRange[], + classNames: string[], + }[] = []; for (let i = 0; i < sfc.styles.length; i++) { const style = sfc.styles[i]; - if ((setting === 'scoped' && style.scoped) || setting === 'always') { + if (condition(style)) { + const classNameRanges = [...parseCssClassNames(style.content)]; result.push({ style: style, index: i, - classNameRanges: [...parseCssClassNames(style.content)], + classNameRanges: classNameRanges, + classNames: classNameRanges.map(range => style.content.substring(range.start + 1, range.end)), }); } }