From 242dda6d5a2545660779f7f8980f5eec7a9b6318 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 27 Apr 2023 18:30:01 +0800 Subject: [PATCH] fix: fixed `` error when `strictTemplates` enabled close #2726, close #2723 --- CHANGELOG.md | 5 ++++ .../src/generators/template.ts | 24 ++++++++++++------- .../vue-test-workspace/vue-tsc/#2726/main.vue | 18 ++++++++++++++ 3 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 packages/vue-test-workspace/vue-tsc/#2726/main.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index 105fe3792..ff837fb48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Unreleased + +- fix: avoid `` type checking with string literal assignment ([#2725](https://github.com/johnsoncodehk/volar/issues/2725)) +- fix: `` reporting false positive error when `strictTemplates` enabled ([#2726](https://github.com/johnsoncodehk/volar/issues/2726)) ([#2723](https://github.com/johnsoncodehk/volar/issues/2723)) + ## 1.6.0 (2023/4/27) - feat(doctor): show warning for TS 4.9 ([#2190](https://github.com/johnsoncodehk/volar/issues/2190)) diff --git a/packages/vue-language-core/src/generators/template.ts b/packages/vue-language-core/src/generators/template.ts index b78c7c3f7..731ec7dd6 100644 --- a/packages/vue-language-core/src/generators/template.ts +++ b/packages/vue-language-core/src/generators/template.ts @@ -256,7 +256,10 @@ export function generate( const tagOffsetsMap: Record = {}; walkElementNodes(templateAst, node => { - if (node.tag === 'component' || node.tag === 'Component') { + if (node.tag === 'slot') { + // ignore + } + else if (node.tag === 'component' || node.tag === 'Component') { for (const prop of node.props) { if (prop.type === CompilerDOM.NodeTypes.ATTRIBUTE && prop.name === 'is' && prop.value) { const tag = prop.value.content; @@ -512,7 +515,10 @@ export function generate( let dynamicTagExp: CompilerDOM.ExpressionNode | undefined; - if (tag === 'component' || tag === 'Component') { + if (tag === 'slot') { + tagOffsets.length = 0; + } + else if (tag === 'component' || tag === 'Component') { tagOffsets.length = 0; for (const prop of node.props) { if (prop.type === CompilerDOM.NodeTypes.ATTRIBUTE && prop.name === 'is' && prop.value) { @@ -529,7 +535,10 @@ export function generate( } } - if (isNamespacedTag) { + if (node.tag === 'slot') { + codes.push(`const ${componentVar} = {} as any;\n`); + } + else if (isNamespacedTag) { codes.push( `const ${componentVar} = (await import('./__VLS_types.d.ts')).asFunctionalComponent(${tag}, new ${tag}({`, ...createPropsCode(node, props, 'slots'), @@ -606,7 +615,7 @@ export function generate( `, ...(await import('./__VLS_types.d.ts')).functionalComponentArgsRest(${componentVar}));\n`, ); - if (tag !== 'template') { + if (tag !== 'template' && tag !== 'slot') { componentCtxVar = `__VLS_${elementIndex++}`; codes.push(`const ${componentCtxVar} = (await import('./__VLS_types.d.ts')).pickFunctionalComponentCtx(${componentVar}, ${componentInstanceVar})!;\n`); parentEl = node; @@ -670,8 +679,8 @@ export function generate( if (componentCtxVar) { generateEvents(node, componentVar, componentInstanceVar, componentCtxVar); } - if (tagOffsets.length) { - generateSlot(node, tagOffsets[0]); + if (node.tag === 'slot') { + generateSlot(node, startTagOffset); } if (inScope) { @@ -1477,9 +1486,6 @@ export function generate( function generateSlot(node: CompilerDOM.ElementNode, startTagOffset: number) { - if (node.tag !== 'slot') - return; - const varSlot = `__VLS_${elementIndex++}`; const slotNameExpNode = getSlotNameExpNode(); diff --git a/packages/vue-test-workspace/vue-tsc/#2726/main.vue b/packages/vue-test-workspace/vue-tsc/#2726/main.vue new file mode 100644 index 000000000..dd56d11c0 --- /dev/null +++ b/packages/vue-test-workspace/vue-tsc/#2726/main.vue @@ -0,0 +1,18 @@ + + + + +