From 223df4a94acdd42a15ea5f9c73c948de0bf7b533 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 22 Aug 2024 23:15:17 +0800 Subject: [PATCH 01/15] Generate var_defineComponentCtx definition on demand --- .../lib/codegen/template/element.ts | 20 +++++++++---------- .../lib/codegen/template/elementChildren.ts | 1 + .../lib/codegen/template/templateChild.ts | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 73fa83d5f6..ff14fe34ff 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -21,8 +21,7 @@ export function* generateComponent( options: TemplateCodegenOptions, ctx: TemplateCodegenContext, node: CompilerDOM.ElementNode, - currentComponent: CompilerDOM.ElementNode | undefined, - componentCtxVar: string | undefined + currentComponent: CompilerDOM.ElementNode | undefined ): Generator { const startTagOffset = node.loc.start.offset + options.template.content.substring(node.loc.start.offset).indexOf(node.tag); const endTagOffset = !node.isSelfClosing && options.template.lang === 'html' ? node.loc.start.offset + node.loc.source.lastIndexOf(node.tag) : undefined; @@ -241,7 +240,6 @@ export function* generateComponent( yield `)${endOfLine}`; } - componentCtxVar = var_defineComponentCtx; currentComponent = node; for (const failedExp of propsFailedExps) { @@ -260,23 +258,23 @@ export function* generateComponent( yield* generateVScope(options, ctx, node, props); - ctx.usedComponentCtxVars.add(componentCtxVar); const usedComponentEventsVar = yield* generateElementEvents(options, ctx, node, var_functionalComponent, var_componentInstance, var_componentEmit, var_componentEvents); - - if (var_defineComponentCtx && ctx.usedComponentCtxVars.has(var_defineComponentCtx)) { - yield `const ${componentCtxVar} = __VLS_nonNullable(__VLS_pickFunctionalComponentCtx(${var_originalComponent}, ${var_componentInstance}))${endOfLine}`; - } if (usedComponentEventsVar) { - yield `let ${var_componentEmit}!: typeof ${componentCtxVar}.emit${endOfLine}`; + ctx.usedComponentCtxVars.add(var_defineComponentCtx) + yield `let ${var_componentEmit}!: typeof ${var_defineComponentCtx}.emit${endOfLine}`; yield `let ${var_componentEvents}!: __VLS_NormalizeEmits${endOfLine}`; } const slotDir = node.props.find(p => p.type === CompilerDOM.NodeTypes.DIRECTIVE && p.name === 'slot') as CompilerDOM.DirectiveNode; if (slotDir) { - yield* generateComponentSlot(options, ctx, node, slotDir, currentComponent, componentCtxVar); + yield* generateComponentSlot(options, ctx, node, slotDir, currentComponent, var_defineComponentCtx); } else { - yield* generateElementChildren(options, ctx, node, currentComponent, componentCtxVar); + yield* generateElementChildren(options, ctx, node, currentComponent, var_defineComponentCtx); + } + + if (ctx.usedComponentCtxVars.has(var_defineComponentCtx)) { + yield `const ${var_defineComponentCtx} = __VLS_nonNullable(__VLS_pickFunctionalComponentCtx(${var_originalComponent}, ${var_componentInstance}))${endOfLine}`; } } diff --git a/packages/language-core/lib/codegen/template/elementChildren.ts b/packages/language-core/lib/codegen/template/elementChildren.ts index 67e38651c1..a184a2c798 100644 --- a/packages/language-core/lib/codegen/template/elementChildren.ts +++ b/packages/language-core/lib/codegen/template/elementChildren.ts @@ -28,6 +28,7 @@ export function* generateElementChildren( && node.tagType !== CompilerDOM.ElementTypes.ELEMENT && node.tagType !== CompilerDOM.ElementTypes.TEMPLATE ) { + ctx.usedComponentCtxVars.add(componentCtxVar); yield `__VLS_nonNullable(${componentCtxVar}.slots).`; yield* wrapWith( node.children[0].loc.start.offset, diff --git a/packages/language-core/lib/codegen/template/templateChild.ts b/packages/language-core/lib/codegen/template/templateChild.ts index b03f366930..9dc3629a76 100644 --- a/packages/language-core/lib/codegen/template/templateChild.ts +++ b/packages/language-core/lib/codegen/template/templateChild.ts @@ -75,7 +75,7 @@ export function* generateTemplateChild( yield* generateElement(options, ctx, node, currentComponent, componentCtxVar); } else { - yield* generateComponent(options, ctx, node, currentComponent, componentCtxVar); + yield* generateComponent(options, ctx, node, currentComponent); } } } From 7f5bea17c51515ddda7c51b5324d09f4ebefb14b Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 22 Aug 2024 23:55:29 +0800 Subject: [PATCH 02/15] Easier solution to #3138 --- .../language-core/lib/codegen/script/globalTypes.ts | 5 ++++- .../language-core/lib/codegen/template/element.ts | 11 +++-------- packages/language-core/lib/codegen/template/index.ts | 8 +++++++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/language-core/lib/codegen/script/globalTypes.ts b/packages/language-core/lib/codegen/script/globalTypes.ts index 923d971aa9..bc1751d08f 100644 --- a/packages/language-core/lib/codegen/script/globalTypes.ts +++ b/packages/language-core/lib/codegen/script/globalTypes.ts @@ -62,7 +62,10 @@ declare global { function __VLS_nonNullable(t: T): T extends null | undefined ? never : T; type __VLS_SelfComponent = string extends N ? {} : N extends string ? { [P in N]: C } : {}; - type __VLS_WithComponent = + type __VLS_WithComponent = + N1 extends keyof Ctx ? N1 extends N0 ? Pick : { [K in N0]: Ctx[N1] } : + N2 extends keyof Ctx ? N2 extends N0 ? Pick : { [K in N0]: Ctx[N2] } : + N3 extends keyof Ctx ? N3 extends N0 ? Pick : { [K in N0]: Ctx[N3] } : N1 extends keyof LocalComponents ? N1 extends N0 ? Pick : { [K in N0]: LocalComponents[N1] } : N2 extends keyof LocalComponents ? N2 extends N0 ? Pick : { [K in N0]: LocalComponents[N2] } : N3 extends keyof LocalComponents ? N3 extends N0 ? Pick : { [K in N0]: LocalComponents[N3] } : diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index ff14fe34ff..f189471e7a 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -134,13 +134,8 @@ export function* generateComponent( } else if (!isComponentTag) { yield `// @ts-ignore${newLine}`; - yield `const ${var_originalComponent} = ({} as `; - for (const componentName of possibleOriginalNames) { - yield `'${componentName}' extends keyof typeof __VLS_ctx ? { '${getCanonicalComponentName(node.tag)}': typeof __VLS_ctx`; - yield* generatePropertyAccess(options, ctx, componentName); - yield ` }: `; - } - yield `typeof __VLS_resolvedLocalAndGlobalComponents)${newLine}`; + yield `const ${var_originalComponent} = __VLS_nonNullable(__VLS_resolvedLocalAndGlobalComponents`; + yield newLine; yield* generatePropertyAccess( options, ctx, @@ -148,7 +143,7 @@ export function* generateComponent( startTagOffset, ctx.codeFeatures.verification ); - yield endOfLine; + yield `)${endOfLine}`; // hover support for (const offset of tagOffsets) { diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index c78716c3b3..762a5e6736 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -117,13 +117,19 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { yield `let __VLS_resolvedLocalAndGlobalComponents!: {}`; if (options.template.ast) { + const components = new Set(); for (const node of forEachElementNode(options.template.ast)) { if ( node.tagType === CompilerDOM.ElementTypes.COMPONENT && node.tag.toLowerCase() !== 'component' && !node.tag.includes('.') // namespace tag ) { - yield ` & __VLS_WithComponent<'${getCanonicalComponentName(node.tag)}', typeof __VLS_localComponents, `; + if (components.has(node.tag)) { + continue; + } + components.add(node.tag); + yield newLine; + yield ` & __VLS_WithComponent<'${getCanonicalComponentName(node.tag)}', typeof __VLS_ctx, typeof __VLS_localComponents, `; yield getPossibleOriginalComponentNames(node.tag, false) .map(name => `"${name}"`) .join(', '); From 32c6838ee33e4c49d7d94339b6dcacc1acc3e553 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 00:16:57 +0800 Subject: [PATCH 03/15] Add typeCheckOnly option --- packages/component-meta/lib/base.ts | 3 +- .../lib/codegen/template/element.ts | 84 ++++++++++--------- .../lib/codegen/template/index.ts | 1 + packages/language-core/lib/languagePlugin.ts | 10 ++- packages/language-core/lib/plugins/vue-tsx.ts | 1 + packages/language-core/lib/types.ts | 1 + packages/language-server/lib/initialize.ts | 3 +- packages/language-server/node.ts | 3 +- packages/tsc/index.ts | 3 +- packages/typescript-plugin/index.ts | 3 +- 10 files changed, 63 insertions(+), 49 deletions(-) diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index e71738e5e4..0abd8e47ae 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -92,7 +92,8 @@ export function baseCreate( ts.sys.useCaseSensitiveFileNames ), projectHost.getCompilationSettings(), - commandLine.vueOptions + commandLine.vueOptions, + true ); const language = vue.createLanguage( [ diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index f189471e7a..429eff9a65 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -145,54 +145,56 @@ export function* generateComponent( ); yield `)${endOfLine}`; - // hover support - for (const offset of tagOffsets) { - yield `({} as { ${getCanonicalComponentName(node.tag)}: typeof ${var_originalComponent} }).`; - yield* generateCanonicalComponentName( - node.tag, - offset, - ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation - ); - yield endOfLine; - } - const camelizedTag = camelize(node.tag); - if (variableNameRegex.test(camelizedTag)) { - // renaming / find references support - for (const tagOffset of tagOffsets) { - for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) { - const expectName = shouldCapitalize ? capitalize(camelizedTag) : camelizedTag; - yield `__VLS_components.`; + if (!options.typeCheckOnly) { + // hover support + for (const offset of tagOffsets) { + yield `({} as { ${getCanonicalComponentName(node.tag)}: typeof ${var_originalComponent} }).`; + yield* generateCanonicalComponentName( + node.tag, + offset, + ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation + ); + yield endOfLine; + } + const camelizedTag = camelize(node.tag); + if (variableNameRegex.test(camelizedTag)) { + // renaming / find references support + for (const tagOffset of tagOffsets) { + for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) { + const expectName = shouldCapitalize ? capitalize(camelizedTag) : camelizedTag; + yield `__VLS_components.`; + yield* generateCamelized( + shouldCapitalize ? capitalize(node.tag) : node.tag, + tagOffset, + { + navigation: { + resolveRenameNewName: node.tag !== expectName ? camelizeComponentName : undefined, + resolveRenameEditText: getTagRenameApply(node.tag), + }, + } + ); + yield `;`; + } + } + yield `${newLine}`; + // auto import support + yield `// @ts-ignore${newLine}`; // #2304 + yield `[`; + for (const tagOffset of tagOffsets) { yield* generateCamelized( - shouldCapitalize ? capitalize(node.tag) : node.tag, + capitalize(node.tag), tagOffset, { - navigation: { - resolveRenameNewName: node.tag !== expectName ? camelizeComponentName : undefined, - resolveRenameEditText: getTagRenameApply(node.tag), + completion: { + isAdditional: true, + onlyImport: true, }, } ); - yield `;`; + yield `,`; } + yield `]${endOfLine}`; } - yield `${newLine}`; - // auto import support - yield `// @ts-ignore${newLine}`; // #2304 - yield `[`; - for (const tagOffset of tagOffsets) { - yield* generateCamelized( - capitalize(node.tag), - tagOffset, - { - completion: { - isAdditional: true, - onlyImport: true, - }, - } - ); - yield `,`; - } - yield `]${endOfLine}`; } } else { @@ -255,7 +257,7 @@ export function* generateComponent( const usedComponentEventsVar = yield* generateElementEvents(options, ctx, node, var_functionalComponent, var_componentInstance, var_componentEmit, var_componentEvents); if (usedComponentEventsVar) { - ctx.usedComponentCtxVars.add(var_defineComponentCtx) + ctx.usedComponentCtxVars.add(var_defineComponentCtx); yield `let ${var_componentEmit}!: typeof ${var_defineComponentCtx}.emit${endOfLine}`; yield `let ${var_componentEvents}!: __VLS_NormalizeEmits${endOfLine}`; } diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 762a5e6736..aad7c0a914 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -14,6 +14,7 @@ export interface TemplateCodegenOptions { template: NonNullable; scriptSetupBindingNames: Set; scriptSetupImportComponentNames: Set; + typeCheckOnly: boolean; hasDefineSlots?: boolean; slotsAssignName?: string; propsAssignName?: string; diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index d6bb0ff457..0e315f1ea8 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -76,14 +76,16 @@ export function createVueLanguagePlugin( _getProjectVersion: (() => string) | undefined, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions + vueCompilerOptions: VueCompilerOptions, + typeCheckOnly = true ): LanguagePlugin { return createVueLanguagePlugin2( ts, asFileName, isRootFile, compilerOptions, - vueCompilerOptions + vueCompilerOptions, + typeCheckOnly ); } @@ -92,7 +94,8 @@ export function createVueLanguagePlugin2( asFileName: (scriptId: T) => string, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions + vueCompilerOptions: VueCompilerOptions, + typeCheckOnly = true ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -106,6 +109,7 @@ export function createVueLanguagePlugin2( }, compilerOptions, vueCompilerOptions, + typeCheckOnly, globalTypesHolder: undefined, }; const plugins = createPlugins(pluginContext); diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index fcbb3a4208..b8a641ff23 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -91,6 +91,7 @@ function createTsx( ts, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, + typeCheckOnly: ctx.typeCheckOnly, template: _sfc.template, scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index ac0e9faca8..aa8ffcc96e 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -78,6 +78,7 @@ export type VueLanguagePlugin = (ctx: { compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; globalTypesHolder: string | undefined; + typeCheckOnly: boolean; }) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock { diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index 0ef344ed69..ad0838c570 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -48,7 +48,8 @@ export function initialize( sys.useCaseSensitiveFileNames ), compilerOptions, - vueCompilerOptions + vueCompilerOptions, + false )], setup({ project }) { project.vue = { compilerOptions: vueCompilerOptions }; diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 541467169d..0aa8d6cd00 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -32,7 +32,8 @@ connection.onInitialize(params => { asFileName, () => false, commandLine.options, - commandLine.vueOptions + commandLine.vueOptions, + false )], setup({ project }) { project.vue = { compilerOptions: commandLine.vueOptions }; diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index c82cbc4ac5..fd03862199 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -34,7 +34,8 @@ export function run() { options.host?.useCaseSensitiveFileNames?.() ?? false ), options.options, - vueOptions + vueOptions, + true ); return { languagePlugins: [vueLanguagePlugin] }; } diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index baa5b8a4db..ef09b01c96 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -19,7 +19,8 @@ const plugin = createLanguageServicePlugin( info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false ), info.languageServiceHost.getCompilationSettings(), - vueOptions + vueOptions, + false ); return { From 66dc70f46afa75a06e87a412f76df3abc3d6a37c Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 00:21:53 +0800 Subject: [PATCH 04/15] Skip generateAutoImportCompletion when typeCheckOnly is true --- packages/language-core/lib/codegen/script/index.ts | 1 + packages/language-core/lib/codegen/script/template.ts | 2 +- packages/language-core/lib/codegen/template/context.ts | 7 +++++-- packages/language-core/lib/codegen/template/index.ts | 2 +- packages/language-core/lib/plugins/vue-tsx.ts | 1 + 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index ec48ad0a81..dd6f4093ef 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -45,6 +45,7 @@ export interface ScriptCodegenOptions { scriptSetupRanges: ScriptSetupRanges | undefined; templateCodegen: TemplateCodegenContext & { codes: Code[]; } | undefined; globalTypes: boolean; + typeCheckOnly: boolean; getGeneratedLength: () => number; linkedCodeMappings: Mapping[]; } diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 8d0dbc85a3..d742be2e59 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -22,7 +22,7 @@ export function* generateTemplate( else { yield `function __VLS_template() {${newLine}`; } - const templateCodegenCtx = createTemplateCodegenContext(new Set()); + const templateCodegenCtx = createTemplateCodegenContext({ scriptSetupBindingNames: new Set(), typeCheckOnly: options.typeCheckOnly }); yield* generateCtx(options, ctx, isClassComponent); yield* generateTemplateContext(options, templateCodegenCtx); yield* generateExportOptions(options); diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index 54b3c5ef03..5ef1666545 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -57,7 +57,7 @@ const _codeFeatures = { export type TemplateCodegenContext = ReturnType; -export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCodegenOptions['scriptSetupBindingNames']) { +export function createTemplateCodegenContext(options: Pick) { let ignoredError = false; let expectErrorToken: { errors: number; @@ -184,6 +184,9 @@ export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCo } }, generateAutoImportCompletion: function* (): Generator { + if (options.typeCheckOnly) { + return; + } const all = [...accessExternalVariables.entries()]; if (!all.some(([_, offsets]) => offsets.size)) { return; @@ -192,7 +195,7 @@ export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCo yield `[`; for (const [varName, offsets] of all) { for (const offset of offsets) { - if (scriptSetupBindingNames.has(varName)) { + if (options.scriptSetupBindingNames.has(varName)) { // #3409 yield [ varName, diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index aad7c0a914..cba801ccb6 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -21,7 +21,7 @@ export interface TemplateCodegenOptions { } export function* generateTemplate(options: TemplateCodegenOptions): Generator { - const ctx = createTemplateCodegenContext(options.scriptSetupBindingNames); + const ctx = createTemplateCodegenContext(options); if (options.slotsAssignName) { ctx.addLocalVariable(options.slotsAssignName); diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index b8a641ff23..dd99302a86 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -152,6 +152,7 @@ function createTsx( templateCodegen: _template, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, + typeCheckOnly: ctx.typeCheckOnly, getGeneratedLength: () => generatedLength, linkedCodeMappings, }); From d020a43eb221535d0271b9da80e2bfa79b6a9ea3 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 01:33:26 +0800 Subject: [PATCH 05/15] Simpler solution for ignoring unknown props errors when strictTemplates is not enabled --- package.json | 7 + .../lib/codegen/template/element.ts | 40 +--- .../lib/codegen/template/elementProps.ts | 32 ++- .../tests/utils/createTester.ts | 3 +- pnpm-lock.yaml | 197 ++++++++++-------- 5 files changed, 157 insertions(+), 122 deletions(-) diff --git a/package.json b/package.json index 414132f019..0ed65545a5 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,13 @@ }, "pnpm": { "overrides": { + "@volar/kit": "https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c", + "@volar/language-core": "https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c", + "@volar/language-server": "https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c", + "@volar/language-service": "https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c", + "@volar/source-map": "https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c", + "@volar/typescript": "https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c", + "@volar/vscode": "https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c", "inquirer": "9.2.23" } } diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 429eff9a65..d6a015d8d5 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -206,36 +206,16 @@ export function* generateComponent( yield* generateElementProps(options, ctx, node, props, false); yield `}))${endOfLine}`; - if (options.vueCompilerOptions.strictTemplates) { - // with strictTemplates, generate once for props type-checking + instance type - yield `const ${var_componentInstance} = ${var_functionalComponent}(`; - yield* wrapWith( - startTagOffset, - startTagOffset + node.tag.length, - ctx.codeFeatures.verification, - `{`, - ...generateElementProps(options, ctx, node, props, true, propsFailedExps), - `}` - ); - yield `, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}))${endOfLine}`; - } - else { - // without strictTemplates, this only for instacne type - yield `const ${var_componentInstance} = ${var_functionalComponent}({`; - yield* generateElementProps(options, ctx, node, props, false); - yield `}, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}))${endOfLine}`; - // and this for props type-checking - yield `({} as (props: __VLS_FunctionalComponentProps & Record) => void)(`; - yield* wrapWith( - startTagOffset, - startTagOffset + node.tag.length, - ctx.codeFeatures.verification, - `{`, - ...generateElementProps(options, ctx, node, props, true, propsFailedExps), - `}` - ); - yield `)${endOfLine}`; - } + yield `const ${var_componentInstance} = ${var_functionalComponent}(`; + yield* wrapWith( + startTagOffset, + startTagOffset + node.tag.length, + ctx.codeFeatures.verification, + `{`, + ...generateElementProps(options, ctx, node, props, true, propsFailedExps), + `}` + ); + yield `, ...__VLS_functionalComponentArgsRest(${var_functionalComponent}))${endOfLine}`; currentComponent = node; diff --git a/packages/language-core/lib/codegen/template/elementProps.ts b/packages/language-core/lib/codegen/template/elementProps.ts index 150b5ef5b6..98c44027cb 100644 --- a/packages/language-core/lib/codegen/template/elementProps.ts +++ b/packages/language-core/lib/codegen/template/elementProps.ts @@ -109,6 +109,7 @@ export function* generateElementProps( if (shouldSpread) { yield `...{ `; } + const codeInfo = ctx.codeFeatures.withoutHighlightAndCompletion; const codes = wrapWith( prop.loc.start.offset, prop.loc.end.offset, @@ -121,8 +122,20 @@ export function* generateElementProps( propName, prop.arg.loc.start.offset, { - ...ctx.codeFeatures.withoutHighlightAndCompletion, - navigation: ctx.codeFeatures.withoutHighlightAndCompletion.navigation + ...codeInfo, + verification: options.vueCompilerOptions.strictTemplates + ? codeInfo.verification + : { + shouldReport(_source, code) { + if (String(code) === '2353' || String(code) === '2561') { + return false; + } + return typeof codeInfo.verification === 'object' + ? codeInfo.verification.shouldReport?.(_source, code) ?? true + : true; + }, + }, + navigation: codeInfo.navigation ? { resolveRenameNewName: camelize, resolveRenameEditText: shouldCamelize ? hyphenateAttr : undefined, @@ -182,6 +195,7 @@ export function* generateElementProps( if (shouldSpread) { yield `...{ `; } + const codeInfo = ctx.codeFeatures.withoutHighlightAndCompletion; const codes = conditionWrapWith( enableCodeFeatures, prop.loc.start.offset, @@ -194,7 +208,19 @@ export function* generateElementProps( prop.loc.start.offset, shouldCamelize ? { - ...ctx.codeFeatures.withoutHighlightAndCompletion, + ...codeInfo, + verification: options.vueCompilerOptions.strictTemplates + ? codeInfo.verification + : { + shouldReport(_source, code) { + if (String(code) === '2353' || String(code) === '2561') { + return false; + } + return typeof codeInfo.verification === 'object' + ? codeInfo.verification.shouldReport?.(_source, code) ?? true + : true; + }, + }, navigation: ctx.codeFeatures.withoutHighlightAndCompletion.navigation ? { resolveRenameNewName: camelize, diff --git a/packages/language-service/tests/utils/createTester.ts b/packages/language-service/tests/utils/createTester.ts index e0c9e6f017..4b4e866fca 100644 --- a/packages/language-service/tests/utils/createTester.ts +++ b/packages/language-service/tests/utils/createTester.ts @@ -32,7 +32,8 @@ function createTester(rootUri: URI) { ts.sys.useCaseSensitiveFileNames ), parsedCommandLine.options, - parsedCommandLine.vueOptions + parsedCommandLine.vueOptions, + false ); const vueServicePlugins = getFullLanguageServicePlugins(ts); const defaultVSCodeSettings: any = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af9786a46f..9843f5c4a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,13 @@ settings: excludeLinksFromLockfile: false overrides: + '@volar/kit': https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c + '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c + '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + '@volar/vscode': https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c inquirer: 9.2.23 importers: @@ -24,8 +31,8 @@ importers: specifier: latest version: 1.0.14 '@volar/language-service': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c typescript: specifier: latest version: 5.5.3 @@ -45,8 +52,8 @@ importers: specifier: ^1.82.0 version: 1.91.0 '@volar/vscode': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c '@vscode/vsce': specifier: latest version: 3.0.0 @@ -75,8 +82,8 @@ importers: packages/component-meta: dependencies: '@volar/typescript': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -102,8 +109,8 @@ importers: packages/language-core: dependencies: '@volar/language-core': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.31 @@ -139,8 +146,8 @@ importers: specifier: ^1.0.1 version: 1.0.2 '@volar/typescript': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c '@vue/compiler-sfc': specifier: ^3.4.0 version: 3.4.31 @@ -148,8 +155,8 @@ importers: packages/language-plugin-pug: dependencies: '@volar/source-map': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c volar-service-pug: specifier: 0.0.61 version: 0.0.61 @@ -164,11 +171,11 @@ importers: packages/language-server: dependencies: '@volar/language-core': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c '@volar/language-server': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -188,14 +195,14 @@ importers: packages/language-service: dependencies: '@volar/language-core': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c '@volar/language-service': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c '@volar/typescript': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.31 @@ -216,28 +223,28 @@ importers: version: 1.0.1 volar-service-css: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-emmet: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-html: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-json: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-pug: specifier: 0.0.61 version: 0.0.61 volar-service-pug-beautify: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-typescript: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) volar-service-typescript-twoslash-queries: specifier: 0.0.61 - version: 0.0.61(@volar/language-service@2.4.0) + version: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) vscode-html-languageservice: specifier: ^5.2.0 version: 5.3.0 @@ -255,8 +262,8 @@ importers: specifier: latest version: 1.0.2 '@volar/kit': - specifier: ~2.4.0 - version: 2.4.0(typescript@5.5.3) + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c(typescript@5.5.3) vscode-languageserver-protocol: specifier: ^3.17.5 version: 3.17.5 @@ -264,8 +271,8 @@ importers: packages/tsc: dependencies: '@volar/typescript': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -283,8 +290,8 @@ importers: packages/typescript-plugin: dependencies: '@volar/typescript': - specifier: ~2.4.0 - version: 2.4.0 + specifier: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c + version: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c '@vue/language-core': specifier: 2.0.28 version: link:../language-core @@ -1091,28 +1098,35 @@ packages: '@vitest/utils@2.0.3': resolution: {integrity: sha512-c/UdELMuHitQbbc/EVctlBaxoYAwQPQdSNwv7z/vHyBKy2edYZaFgptE27BRueZB7eW8po+cllotMNTDpL3HWg==} - '@volar/kit@2.4.0': - resolution: {integrity: sha512-uqwtPKhrbnP+3f8hs+ltDYXLZ6Wdbs54IzkaPocasI4aBhqWLht5qXctE1MqpZU52wbH359E0u9nhxEFmyon+w==} + '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c} + version: 2.4.0 peerDependencies: typescript: '*' - '@volar/language-core@2.4.0': - resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} + '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c} + version: 2.4.0 - '@volar/language-server@2.4.0': - resolution: {integrity: sha512-rmGIjAxWekWQiGH97Mosb4juiD/hfFYNQKV5Py9r7vDOLSkbIwRhITbwHm88NJKs8P6TNc6w/PfBXN6yjKadJg==} + '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c} + version: 2.4.0 - '@volar/language-service@2.4.0': - resolution: {integrity: sha512-4P3yeQXIL68mLfS3n6P3m02IRg3GnLHUU9k/1PCHEfm5FG9bySkDOc72dbBn2vAa2BxOqm18bmmZXrsWuQ5AOw==} + '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c} + version: 2.4.0 - '@volar/source-map@2.4.0': - resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} + '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c} + version: 2.4.0 - '@volar/typescript@2.4.0': - resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} + '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c} + version: 2.4.0 - '@volar/vscode@2.4.0': - resolution: {integrity: sha512-VOnUgtmu+xGOqVKouRM8ZSeVOFPqmcTDfi3wif5peXpkOPsCgNdS/zns0xunuh9J6Ck5SV+QffPfmNW9XARnxw==} + '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c': + resolution: {tarball: https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c} + version: 2.4.0 '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} @@ -3275,40 +3289,45 @@ packages: volar-service-css@0.0.61: resolution: {integrity: sha512-Ct9L/w+IB1JU8F4jofcNCGoHy6TF83aiapfZq9A0qYYpq+Kk5dH+ONS+rVZSsuhsunq8UvAuF8Gk6B8IFLfniw==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true volar-service-emmet@0.0.61: resolution: {integrity: sha512-iiYqBxjjcekqrRruw4COQHZME6EZYWVbkHjHDbULpml3g8HGJHzpAMkj9tXNCPxf36A+f1oUYjsvZt36qPg4cg==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true volar-service-html@0.0.61: resolution: {integrity: sha512-yFE+YmmgqIL5HI4ORqP++IYb1QaGcv+xBboI0WkCxJJ/M35HZj7f5rbT3eQ24ECLXFbFCFanckwyWJVz5KmN3Q==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true volar-service-json@0.0.61: resolution: {integrity: sha512-9PpEib6XE99gFjjjl8IkITktSvfPW39jFAGsHggT6SdlIb8zC7J0+rMjkyVUAUOpWvY5jPqkByX43LcxZvkrdQ==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true volar-service-pug-beautify@0.0.61: resolution: {integrity: sha512-FvZEZJdZ64pa3a0u1Urz08g4gHjuPcdMsEsJGiDLYqJnIZEGZRyhHUjSxfmAxihZCzp738W90tOMQDbgeQMGhA==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true @@ -3318,16 +3337,18 @@ packages: volar-service-typescript-twoslash-queries@0.0.61: resolution: {integrity: sha512-99FICGrEF0r1E2tV+SvprHPw9Knyg7BdW2fUch0tf59kG+KG+Tj4tL6tUg+cy8f23O/VXlmsWFMIE+bx1dXPnQ==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true volar-service-typescript@0.0.61: resolution: {integrity: sha512-4kRHxVbW7wFBHZWRU6yWxTgiKETBDIJNwmJUAWeP0mHaKpnDGj/astdRFKqGFRYVeEYl45lcUPhdJyrzanjsdQ==} + version: 0.0.61 peerDependencies: - '@volar/language-service': ~2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c peerDependenciesMeta: '@volar/language-service': optional: true @@ -4350,24 +4371,24 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/kit@2.4.0(typescript@5.5.3)': + '@volar/kit@https://pkg.pr.new/volarjs/volar.js/@volar/kit@337182c(typescript@5.5.3)': dependencies: - '@volar/language-service': 2.4.0 - '@volar/typescript': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c typesafe-path: 0.2.2 typescript: 5.5.3 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-core@2.4.0': + '@volar/language-core@https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c': dependencies: - '@volar/source-map': 2.4.0 + '@volar/source-map': https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c - '@volar/language-server@2.4.0': + '@volar/language-server@https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c': dependencies: - '@volar/language-core': 2.4.0 - '@volar/language-service': 2.4.0 - '@volar/typescript': 2.4.0 + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c + '@volar/typescript': https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 @@ -4375,24 +4396,24 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-service@2.4.0': + '@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c': dependencies: - '@volar/language-core': 2.4.0 + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/source-map@2.4.0': {} + '@volar/source-map@https://pkg.pr.new/volarjs/volar.js/@volar/source-map@337182c': {} - '@volar/typescript@2.4.0': + '@volar/typescript@https://pkg.pr.new/volarjs/volar.js/@volar/typescript@337182c': dependencies: - '@volar/language-core': 2.4.0 + '@volar/language-core': https://pkg.pr.new/volarjs/volar.js/@volar/language-core@337182c path-browserify: 1.0.1 vscode-uri: 3.0.8 - '@volar/vscode@2.4.0': + '@volar/vscode@https://pkg.pr.new/volarjs/volar.js/@volar/vscode@337182c': dependencies: - '@volar/language-server': 2.4.0 + '@volar/language-server': https://pkg.pr.new/volarjs/volar.js/@volar/language-server@337182c path-browserify: 1.0.1 vscode-languageclient: 9.0.1 vscode-nls: 5.2.0 @@ -6754,61 +6775,61 @@ snapshots: - supports-color - terser - volar-service-css@0.0.61(@volar/language-service@2.4.0): + volar-service-css@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: vscode-css-languageservice: 6.3.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c - volar-service-emmet@0.0.61(@volar/language-service@2.4.0): + volar-service-emmet@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: '@emmetio/css-parser': 0.4.0 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.9.3 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c - volar-service-html@0.0.61(@volar/language-service@2.4.0): + volar-service-html@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: vscode-html-languageservice: 5.3.0 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c - volar-service-json@0.0.61(@volar/language-service@2.4.0): + volar-service-json@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: vscode-json-languageservice: 5.4.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c - volar-service-pug-beautify@0.0.61(@volar/language-service@2.4.0): + volar-service-pug-beautify@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c volar-service-pug@0.0.61: dependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c muggle-string: 0.4.1 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.61(@volar/language-service@2.4.0) + volar-service-html: 0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c) vscode-html-languageservice: 5.3.0 vscode-languageserver-textdocument: 1.0.11 - volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@2.4.0): + volar-service-typescript-twoslash-queries@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c - volar-service-typescript@0.0.61(@volar/language-service@2.4.0): + volar-service-typescript@0.0.61(@volar/language-service@https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c): dependencies: path-browserify: 1.0.1 semver: 7.6.2 @@ -6817,7 +6838,7 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.4.0 + '@volar/language-service': https://pkg.pr.new/volarjs/volar.js/@volar/language-service@337182c vscode-css-languageservice@6.3.0: dependencies: From cdf89393aa97bbffef804d2f2c437e0afd576adf Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 02:02:10 +0800 Subject: [PATCH 06/15] Reduce component definition virtual code --- .../lib/codegen/template/element.ts | 56 ++++++++----------- .../lib/codegen/template/index.ts | 4 +- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index d6a015d8d5..e876325800 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -133,29 +133,21 @@ export function* generateComponent( yield `)${endOfLine}`; } else if (!isComponentTag) { - yield `// @ts-ignore${newLine}`; - yield `const ${var_originalComponent} = __VLS_nonNullable(__VLS_resolvedLocalAndGlobalComponents`; - yield newLine; - yield* generatePropertyAccess( - options, - ctx, - getCanonicalComponentName(node.tag), + yield `const ${var_originalComponent} = __VLS_resolvedLocalAndGlobalComponents.`; + yield* generateCanonicalComponentName( + node.tag, startTagOffset, - ctx.codeFeatures.verification + options.typeCheckOnly + ? ctx.codeFeatures.verification + : { + // hover support + ...ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation, + ...ctx.codeFeatures.verification, + } ); - yield `)${endOfLine}`; + yield `${endOfLine}`; if (!options.typeCheckOnly) { - // hover support - for (const offset of tagOffsets) { - yield `({} as { ${getCanonicalComponentName(node.tag)}: typeof ${var_originalComponent} }).`; - yield* generateCanonicalComponentName( - node.tag, - offset, - ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation - ); - yield endOfLine; - } const camelizedTag = camelize(node.tag); if (variableNameRegex.test(camelizedTag)) { // renaming / find references support @@ -179,21 +171,17 @@ export function* generateComponent( yield `${newLine}`; // auto import support yield `// @ts-ignore${newLine}`; // #2304 - yield `[`; - for (const tagOffset of tagOffsets) { - yield* generateCamelized( - capitalize(node.tag), - tagOffset, - { - completion: { - isAdditional: true, - onlyImport: true, - }, - } - ); - yield `,`; - } - yield `]${endOfLine}`; + yield* generateCamelized( + capitalize(node.tag), + startTagOffset, + { + completion: { + isAdditional: true, + onlyImport: true, + }, + } + ); + yield `${endOfLine}`; } } } diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index cba801ccb6..ecaf9009b3 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -116,7 +116,7 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { - yield `let __VLS_resolvedLocalAndGlobalComponents!: {}`; + yield `let __VLS_resolvedLocalAndGlobalComponents!: Required<{}`; if (options.template.ast) { const components = new Set(); for (const node of forEachElementNode(options.template.ast)) { @@ -138,7 +138,7 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator${endOfLine}`; } function* escapeString(className: string, offset: number, escapeTargets: string[]): Generator { From 3b5258aa9dc7acdf1ef5d0632ca2b8dc09ec6fa5 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 02:27:51 +0800 Subject: [PATCH 07/15] only generate auto import virtual code for editing scripts --- packages/component-meta/lib/base.ts | 3 +- .../language-core/lib/codegen/script/index.ts | 2 +- .../lib/codegen/script/template.ts | 2 +- .../lib/codegen/template/context.ts | 4 +- .../lib/codegen/template/element.ts | 56 +++++++++---------- .../lib/codegen/template/index.ts | 2 +- packages/language-core/lib/languagePlugin.ts | 10 +--- packages/language-core/lib/plugins/vue-tsx.ts | 7 ++- packages/language-core/lib/types.ts | 1 - packages/language-server/lib/initialize.ts | 3 +- packages/language-server/node.ts | 3 +- packages/tsc/index.ts | 3 +- packages/typescript-plugin/index.ts | 3 +- 13 files changed, 45 insertions(+), 54 deletions(-) diff --git a/packages/component-meta/lib/base.ts b/packages/component-meta/lib/base.ts index 0abd8e47ae..e71738e5e4 100644 --- a/packages/component-meta/lib/base.ts +++ b/packages/component-meta/lib/base.ts @@ -92,8 +92,7 @@ export function baseCreate( ts.sys.useCaseSensitiveFileNames ), projectHost.getCompilationSettings(), - commandLine.vueOptions, - true + commandLine.vueOptions ); const language = vue.createLanguage( [ diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index dd6f4093ef..92da84d736 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -45,7 +45,7 @@ export interface ScriptCodegenOptions { scriptSetupRanges: ScriptSetupRanges | undefined; templateCodegen: TemplateCodegenContext & { codes: Code[]; } | undefined; globalTypes: boolean; - typeCheckOnly: boolean; + edited: boolean; getGeneratedLength: () => number; linkedCodeMappings: Mapping[]; } diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index d742be2e59..c60bc11e52 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -22,7 +22,7 @@ export function* generateTemplate( else { yield `function __VLS_template() {${newLine}`; } - const templateCodegenCtx = createTemplateCodegenContext({ scriptSetupBindingNames: new Set(), typeCheckOnly: options.typeCheckOnly }); + const templateCodegenCtx = createTemplateCodegenContext({ scriptSetupBindingNames: new Set(), edited: options.edited }); yield* generateCtx(options, ctx, isClassComponent); yield* generateTemplateContext(options, templateCodegenCtx); yield* generateExportOptions(options); diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index 5ef1666545..2ecca7891c 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -57,7 +57,7 @@ const _codeFeatures = { export type TemplateCodegenContext = ReturnType; -export function createTemplateCodegenContext(options: Pick) { +export function createTemplateCodegenContext(options: Pick) { let ignoredError = false; let expectErrorToken: { errors: number; @@ -184,7 +184,7 @@ export function createTemplateCodegenContext(options: Pick { - if (options.typeCheckOnly) { + if (!options.edited) { return; } const all = [...accessExternalVariables.entries()]; diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index e876325800..047314bed7 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -137,39 +137,37 @@ export function* generateComponent( yield* generateCanonicalComponentName( node.tag, startTagOffset, - options.typeCheckOnly - ? ctx.codeFeatures.verification - : { - // hover support - ...ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation, - ...ctx.codeFeatures.verification, - } + { + // with hover support + ...ctx.codeFeatures.withoutHighlightAndCompletionAndNavigation, + ...ctx.codeFeatures.verification, + } ); yield `${endOfLine}`; - if (!options.typeCheckOnly) { - const camelizedTag = camelize(node.tag); - if (variableNameRegex.test(camelizedTag)) { - // renaming / find references support - for (const tagOffset of tagOffsets) { - for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) { - const expectName = shouldCapitalize ? capitalize(camelizedTag) : camelizedTag; - yield `__VLS_components.`; - yield* generateCamelized( - shouldCapitalize ? capitalize(node.tag) : node.tag, - tagOffset, - { - navigation: { - resolveRenameNewName: node.tag !== expectName ? camelizeComponentName : undefined, - resolveRenameEditText: getTagRenameApply(node.tag), - }, - } - ); - yield `;`; - } + const camelizedTag = camelize(node.tag); + if (variableNameRegex.test(camelizedTag)) { + // renaming / find references support + for (const tagOffset of tagOffsets) { + for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) { + const expectName = shouldCapitalize ? capitalize(camelizedTag) : camelizedTag; + yield `__VLS_components.`; + yield* generateCamelized( + shouldCapitalize ? capitalize(node.tag) : node.tag, + tagOffset, + { + navigation: { + resolveRenameNewName: node.tag !== expectName ? camelizeComponentName : undefined, + resolveRenameEditText: getTagRenameApply(node.tag), + }, + } + ); + yield `;`; } - yield `${newLine}`; - // auto import support + } + yield `${newLine}`; + // auto import support + if (options.edited) { yield `// @ts-ignore${newLine}`; // #2304 yield* generateCamelized( capitalize(node.tag), diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index ecaf9009b3..02f1b71dbd 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -14,7 +14,7 @@ export interface TemplateCodegenOptions { template: NonNullable; scriptSetupBindingNames: Set; scriptSetupImportComponentNames: Set; - typeCheckOnly: boolean; + edited: boolean; hasDefineSlots?: boolean; slotsAssignName?: string; propsAssignName?: string; diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index 0e315f1ea8..d6bb0ff457 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -76,16 +76,14 @@ export function createVueLanguagePlugin( _getProjectVersion: (() => string) | undefined, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions, - typeCheckOnly = true + vueCompilerOptions: VueCompilerOptions ): LanguagePlugin { return createVueLanguagePlugin2( ts, asFileName, isRootFile, compilerOptions, - vueCompilerOptions, - typeCheckOnly + vueCompilerOptions ); } @@ -94,8 +92,7 @@ export function createVueLanguagePlugin2( asFileName: (scriptId: T) => string, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions, - typeCheckOnly = true + vueCompilerOptions: VueCompilerOptions ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -109,7 +106,6 @@ export function createVueLanguagePlugin2( }, compilerOptions, vueCompilerOptions, - typeCheckOnly, globalTypesHolder: undefined, }; const plugins = createPlugins(pluginContext); diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index dd99302a86..861e056269 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -9,6 +9,8 @@ import type { Code, Sfc, VueLanguagePlugin } from '../types'; export const tsCodegen = new WeakMap>(); +const fileEditTimes = new Map(); + const plugin: VueLanguagePlugin = ctx => { return { @@ -91,8 +93,8 @@ function createTsx( ts, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, - typeCheckOnly: ctx.typeCheckOnly, template: _sfc.template, + edited: (fileEditTimes.get(fileName) ?? 0) >= 2, scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), hasDefineSlots: hasDefineSlots(), @@ -152,10 +154,11 @@ function createTsx( templateCodegen: _template, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, - typeCheckOnly: ctx.typeCheckOnly, + edited: (fileEditTimes.get(fileName) ?? 0) >= 2, getGeneratedLength: () => generatedLength, linkedCodeMappings, }); + fileEditTimes.set(fileName, (fileEditTimes.get(fileName) ?? 0) + 1); let current = codegen.next(); diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index aa8ffcc96e..ac0e9faca8 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -78,7 +78,6 @@ export type VueLanguagePlugin = (ctx: { compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; globalTypesHolder: string | undefined; - typeCheckOnly: boolean; }) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock { diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index ad0838c570..0ef344ed69 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -48,8 +48,7 @@ export function initialize( sys.useCaseSensitiveFileNames ), compilerOptions, - vueCompilerOptions, - false + vueCompilerOptions )], setup({ project }) { project.vue = { compilerOptions: vueCompilerOptions }; diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 0aa8d6cd00..541467169d 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -32,8 +32,7 @@ connection.onInitialize(params => { asFileName, () => false, commandLine.options, - commandLine.vueOptions, - false + commandLine.vueOptions )], setup({ project }) { project.vue = { compilerOptions: commandLine.vueOptions }; diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index fd03862199..c82cbc4ac5 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -34,8 +34,7 @@ export function run() { options.host?.useCaseSensitiveFileNames?.() ?? false ), options.options, - vueOptions, - true + vueOptions ); return { languagePlugins: [vueLanguagePlugin] }; } diff --git a/packages/typescript-plugin/index.ts b/packages/typescript-plugin/index.ts index ef09b01c96..baa5b8a4db 100644 --- a/packages/typescript-plugin/index.ts +++ b/packages/typescript-plugin/index.ts @@ -19,8 +19,7 @@ const plugin = createLanguageServicePlugin( info.languageServiceHost.useCaseSensitiveFileNames?.() ?? false ), info.languageServiceHost.getCompilationSettings(), - vueOptions, - false + vueOptions ); return { From be0e5b8842408b4411dbaada4251a9d86e3b4096 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 02:28:30 +0800 Subject: [PATCH 08/15] Update createTester.ts --- packages/language-service/tests/utils/createTester.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/language-service/tests/utils/createTester.ts b/packages/language-service/tests/utils/createTester.ts index 4b4e866fca..e0c9e6f017 100644 --- a/packages/language-service/tests/utils/createTester.ts +++ b/packages/language-service/tests/utils/createTester.ts @@ -32,8 +32,7 @@ function createTester(rootUri: URI) { ts.sys.useCaseSensitiveFileNames ), parsedCommandLine.options, - parsedCommandLine.vueOptions, - false + parsedCommandLine.vueOptions ); const vueServicePlugins = getFullLanguageServicePlugins(ts); const defaultVSCodeSettings: any = { From 88bff5a66ec4cf007c6f439617f353e92ef970bf Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 02:49:09 +0800 Subject: [PATCH 09/15] fix test --- packages/language-core/lib/languagePlugin.ts | 4 +++- packages/language-core/lib/plugins/vue-tsx.ts | 4 ++-- packages/language-core/lib/types.ts | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index d6bb0ff457..66188ac483 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -92,7 +92,8 @@ export function createVueLanguagePlugin2( asFileName: (scriptId: T) => string, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions + vueCompilerOptions: VueCompilerOptions, + test?: boolean ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -107,6 +108,7 @@ export function createVueLanguagePlugin2( compilerOptions, vueCompilerOptions, globalTypesHolder: undefined, + test, }; const plugins = createPlugins(pluginContext); diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 861e056269..031e764217 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -94,7 +94,7 @@ function createTsx( compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, template: _sfc.template, - edited: (fileEditTimes.get(fileName) ?? 0) >= 2, + edited: ctx.test || (fileEditTimes.get(fileName) ?? 0) >= 2, scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), hasDefineSlots: hasDefineSlots(), @@ -154,7 +154,7 @@ function createTsx( templateCodegen: _template, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, - edited: (fileEditTimes.get(fileName) ?? 0) >= 2, + edited: ctx.test || (fileEditTimes.get(fileName) ?? 0) >= 2, getGeneratedLength: () => generatedLength, linkedCodeMappings, }); diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index ac0e9faca8..d860bb2bfe 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -78,6 +78,7 @@ export type VueLanguagePlugin = (ctx: { compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; globalTypesHolder: string | undefined; + test?: boolean; }) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock { From 00e5d217b1511b93e9b9e505e5fee80ba1eef264 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 02:49:40 +0800 Subject: [PATCH 10/15] Update createTester.ts --- packages/language-service/tests/utils/createTester.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/language-service/tests/utils/createTester.ts b/packages/language-service/tests/utils/createTester.ts index e0c9e6f017..4e71153f36 100644 --- a/packages/language-service/tests/utils/createTester.ts +++ b/packages/language-service/tests/utils/createTester.ts @@ -32,7 +32,8 @@ function createTester(rootUri: URI) { ts.sys.useCaseSensitiveFileNames ), parsedCommandLine.options, - parsedCommandLine.vueOptions + parsedCommandLine.vueOptions, + true ); const vueServicePlugins = getFullLanguageServicePlugins(ts); const defaultVSCodeSettings: any = { From 598cfadba0ffe4c0797063b778d3f2c2941c16ea Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 03:59:00 +0800 Subject: [PATCH 11/15] Simplify __VLS_pickFunctionalComponentCtx usages --- packages/language-core/lib/codegen/script/globalTypes.ts | 4 ++-- packages/language-core/lib/codegen/template/element.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/language-core/lib/codegen/script/globalTypes.ts b/packages/language-core/lib/codegen/script/globalTypes.ts index bc1751d08f..8df4102c5a 100644 --- a/packages/language-core/lib/codegen/script/globalTypes.ts +++ b/packages/language-core/lib/codegen/script/globalTypes.ts @@ -86,10 +86,10 @@ declare global { : (_: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record'}, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {}${vueCompilerOptions.strictTemplates ? '' : ' & Record'} } }; function __VLS_elementAsFunction(tag: T, endTag?: T): (_: T${vueCompilerOptions.strictTemplates ? '' : ' & Record'}) => void; function __VLS_functionalComponentArgsRest any>(t: T): Parameters['length'] extends 2 ? [any] : []; - function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): __VLS_PickNotAny< + function __VLS_pickFunctionalComponentCtx(comp: T, compInstance: K): NonNullable<__VLS_PickNotAny< '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: infer Ctx } ? Ctx : never : any , T extends (props: any, ctx: infer Ctx) => any ? Ctx : any - >; + >>; type __VLS_FunctionalComponentProps = '__ctx' extends keyof __VLS_PickNotAny ? K extends { __ctx?: { props?: infer P } } ? NonNullable

: never : T extends (props: infer P, ...args: any) => any ? P : diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 047314bed7..5196be7079 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -237,7 +237,7 @@ export function* generateComponent( } if (ctx.usedComponentCtxVars.has(var_defineComponentCtx)) { - yield `const ${var_defineComponentCtx} = __VLS_nonNullable(__VLS_pickFunctionalComponentCtx(${var_originalComponent}, ${var_componentInstance}))${endOfLine}`; + yield `const ${var_defineComponentCtx} = __VLS_pickFunctionalComponentCtx(${var_originalComponent}, ${var_componentInstance})${endOfLine}`; } } From 57eebba5858cddc30359900a90e3f3bf77f9600e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Fri, 23 Aug 2024 04:37:56 +0800 Subject: [PATCH 12/15] Use JSDocs --- packages/language-core/lib/codegen/template/element.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index 5196be7079..ad9f4684e7 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -148,10 +148,11 @@ export function* generateComponent( const camelizedTag = camelize(node.tag); if (variableNameRegex.test(camelizedTag)) { // renaming / find references support + yield `/** @type { [`; for (const tagOffset of tagOffsets) { for (const shouldCapitalize of (node.tag[0] === node.tag[0].toUpperCase() ? [false] : [true, false])) { const expectName = shouldCapitalize ? capitalize(camelizedTag) : camelizedTag; - yield `__VLS_components.`; + yield `typeof __VLS_components.`; yield* generateCamelized( shouldCapitalize ? capitalize(node.tag) : node.tag, tagOffset, @@ -162,10 +163,10 @@ export function* generateComponent( }, } ); - yield `;`; + yield `, `; } } - yield `${newLine}`; + yield `] } */${newLine}`; // auto import support if (options.edited) { yield `// @ts-ignore${newLine}`; // #2304 From 8431ccaacd90e58c0fd8d602d5187883fbd4c10e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 08:30:50 +0800 Subject: [PATCH 13/15] fix test --- packages/language-server/lib/initialize.ts | 3 ++- packages/language-server/node.ts | 3 ++- packages/language-server/tests/completions.spec.ts | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index 450353bfcb..eac8bf472d 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -48,7 +48,8 @@ export function initialize( sys.useCaseSensitiveFileNames ), compilerOptions, - vueCompilerOptions + vueCompilerOptions, + params.initializationOptions.typescript.disableAutoImportCache )], setup({ project }) { project.vue = { compilerOptions: vueCompilerOptions }; diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 541467169d..7be12f66bb 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -32,7 +32,8 @@ connection.onInitialize(params => { asFileName, () => false, commandLine.options, - commandLine.vueOptions + commandLine.vueOptions, + params.initializationOptions.typescript.disableAutoImportCache )], setup({ project }) { project.vue = { compilerOptions: commandLine.vueOptions }; diff --git a/packages/language-server/tests/completions.spec.ts b/packages/language-server/tests/completions.spec.ts index 96c9624688..044f28966f 100644 --- a/packages/language-server/tests/completions.spec.ts +++ b/packages/language-server/tests/completions.spec.ts @@ -338,6 +338,12 @@ describe('Completions', async () => { }, }, ], + "commitCharacters": [ + ".", + ",", + ";", + "(", + ], "detail": "Add import from "./ComponentForAutoImport.vue" (property) default: DefineComponent<{}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly>, {}, {}>", "documentation": { From 39235d8ea278936906e8bed888513985b1fcd447 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 08:34:49 +0800 Subject: [PATCH 14/15] remove test param --- packages/language-core/lib/languagePlugin.ts | 4 +--- packages/language-core/lib/types.ts | 3 +++ packages/language-server/lib/initialize.ts | 4 ++-- packages/language-server/node.ts | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/language-core/lib/languagePlugin.ts b/packages/language-core/lib/languagePlugin.ts index 66188ac483..d6bb0ff457 100644 --- a/packages/language-core/lib/languagePlugin.ts +++ b/packages/language-core/lib/languagePlugin.ts @@ -92,8 +92,7 @@ export function createVueLanguagePlugin2( asFileName: (scriptId: T) => string, isRootFile: (fileName: string) => boolean, compilerOptions: ts.CompilerOptions, - vueCompilerOptions: VueCompilerOptions, - test?: boolean + vueCompilerOptions: VueCompilerOptions ): LanguagePlugin { const pluginContext: Parameters[0] = { modules: { @@ -108,7 +107,6 @@ export function createVueLanguagePlugin2( compilerOptions, vueCompilerOptions, globalTypesHolder: undefined, - test, }; const plugins = createPlugins(pluginContext); diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index d2819e85eb..b6d9031148 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -52,6 +52,9 @@ export interface VueCompilerOptions { experimentalDefinePropProposal: 'kevinEdition' | 'johnsonEdition' | false; experimentalResolveStyleCssClasses: 'scoped' | 'always' | 'never'; experimentalModelPropName: Record | Record[]>>; + + // internal + __test?: boolean; } export const validVersions = [2, 2.1] as const; diff --git a/packages/language-server/lib/initialize.ts b/packages/language-server/lib/initialize.ts index eac8bf472d..bfb91fb916 100644 --- a/packages/language-server/lib/initialize.ts +++ b/packages/language-server/lib/initialize.ts @@ -37,6 +37,7 @@ export function initialize( compilerOptions = ts.getDefaultCompilerOptions(); vueCompilerOptions = resolveVueCompilerOptions({}); } + vueCompilerOptions.__test = params.initializationOptions.typescript.disableAutoImportCache; updateFileWatcher(vueCompilerOptions); return { languagePlugins: [createVueLanguagePlugin2( @@ -48,8 +49,7 @@ export function initialize( sys.useCaseSensitiveFileNames ), compilerOptions, - vueCompilerOptions, - params.initializationOptions.typescript.disableAutoImportCache + vueCompilerOptions )], setup({ project }) { project.vue = { compilerOptions: vueCompilerOptions }; diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 7be12f66bb..65b4c4d787 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -26,14 +26,14 @@ connection.onInitialize(params => { vueOptions: resolveVueCompilerOptions({}), options: ts.getDefaultCompilerOptions(), }; + commandLine.vueOptions.__test = params.initializationOptions.typescript.disableAutoImportCache; return { languagePlugins: [createVueLanguagePlugin2( ts, asFileName, () => false, commandLine.options, - commandLine.vueOptions, - params.initializationOptions.typescript.disableAutoImportCache + commandLine.vueOptions )], setup({ project }) { project.vue = { compilerOptions: commandLine.vueOptions }; From 2fd7159891fc14be969f8427a1c4635f62e955ac Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Mon, 26 Aug 2024 08:46:14 +0800 Subject: [PATCH 15/15] update --- packages/language-core/lib/plugins/vue-tsx.ts | 4 ++-- packages/language-core/lib/types.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index 5b684cba32..c5e1308e9c 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -94,7 +94,7 @@ function createTsx( compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, template: _sfc.template, - edited: ctx.test || (fileEditTimes.get(fileName) ?? 0) >= 2, + edited: ctx.vueCompilerOptions.__test || (fileEditTimes.get(fileName) ?? 0) >= 2, scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), templateRefNames: new Map(), @@ -160,7 +160,7 @@ function createTsx( templateCodegen: _template, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, - edited: ctx.test || (fileEditTimes.get(fileName) ?? 0) >= 2, + edited: ctx.vueCompilerOptions.__test || (fileEditTimes.get(fileName) ?? 0) >= 2, getGeneratedLength: () => generatedLength, linkedCodeMappings, }); diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index b6d9031148..0932528876 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -85,7 +85,6 @@ export type VueLanguagePlugin = (ctx: { compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; globalTypesHolder: string | undefined; - test?: boolean; }) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock {