diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts index 52fabeea8..90ebd0921 100644 --- a/packages/compiler-core/src/babelUtils.ts +++ b/packages/compiler-core/src/babelUtils.ts @@ -81,13 +81,21 @@ export function walkIdentifiers( ) } } else if (node.type === 'CatchClause' && node.param) { - for (const id of extractIdentifiers(node.param)) { - markScopeIdentifier(node, id, knownIds) + if (node.scopeIds) { + node.scopeIds.forEach(id => markKnownIds(id, knownIds)) + } else { + for (const id of extractIdentifiers(node.param)) { + markScopeIdentifier(node, id, knownIds) + } } } else if (isForStatement(node)) { - walkForStatement(node, false, id => - markScopeIdentifier(node, id, knownIds), - ) + if (node.scopeIds) { + node.scopeIds.forEach(id => markKnownIds(id, knownIds)) + } else { + walkForStatement(node, false, id => + markScopeIdentifier(node, id, knownIds), + ) + } } }, leave(node: Node & { scopeIds?: Set }, parent: Node | null) { diff --git a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts index 2ea1eb9d3..4a0bc05f3 100644 --- a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts +++ b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts @@ -428,6 +428,31 @@ test('prefixing edge case for reused AST', () => { expect(code).not.toMatch(`_ctx.t`) }) +test('for loop prefixing edge case for reused AST', () => { + const src = ` + + + ` + const { descriptor } = parse(src) + // compileScript triggers importUsageCheck + compileScript(descriptor, { id: 'xxx' }) + const { code } = compileTemplate({ + id: 'xxx', + filename: 'test.vue', + ast: descriptor.template!.ast, + source: descriptor.template!.content, + }) + expect(code).not.toMatch(`_ctx.item`) +}) + test('prefixing edge case for reused AST ssr mode', () => { const src = `