From 6d6cc9091280ba132d92850f30db31c9152af599 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 22 Sep 2021 10:10:20 -0400 Subject: [PATCH] fix(compiler-sfc): fix local var access check for bindings in normal script fix #4644 --- .../compiler-sfc/__tests__/compileScript.spec.ts | 13 +++++++++++++ packages/compiler-sfc/src/compileScript.ts | 15 +++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 7afc1d5cabb..20ce70a97e8 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -1181,6 +1181,19 @@ const emit = defineEmits(['a', 'b']) defineEmits([bar]) `) ).toThrow(`cannot reference locally declared variables`) + + // #4644 + expect(() => + compile(` + + `) + ).not.toThrow(`cannot reference locally declared variables`) }) test('should allow defineProps/Emit() referencing scope var', () => { diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 08eb5588395..0dac40b2340 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -239,6 +239,7 @@ export function compileScript( const helperImports: Set = new Set() const userImports: Record = Object.create(null) const userImportAlias: Record = Object.create(null) + const scriptBindings: Record = Object.create(null) const setupBindings: Record = Object.create(null) let defaultExport: Node | undefined @@ -739,7 +740,7 @@ export function compileScript( } } if (node.declaration) { - walkDeclaration(node.declaration, setupBindings, userImportAlias) + walkDeclaration(node.declaration, scriptBindings, userImportAlias) } } else if ( (node.type === 'VariableDeclaration' || @@ -747,7 +748,7 @@ export function compileScript( node.type === 'ClassDeclaration') && !node.declare ) { - walkDeclaration(node, setupBindings, userImportAlias) + walkDeclaration(node, scriptBindings, userImportAlias) } } @@ -1070,6 +1071,9 @@ export function compileScript( ? BindingTypes.SETUP_CONST : BindingTypes.SETUP_MAYBE_REF } + for (const key in scriptBindings) { + bindingMetadata[key] = scriptBindings[key] + } for (const key in setupBindings) { bindingMetadata[key] = setupBindings[key] } @@ -1198,8 +1202,11 @@ export function compileScript( returned = `() => {}` } } else { - // return bindings from setup - const allBindings: Record = { ...setupBindings } + // return bindings from script and script setup + const allBindings: Record = { + ...scriptBindings, + ...setupBindings + } for (const key in userImports) { if (!userImports[key].isType && userImports[key].isUsedInTemplate) { allBindings[key] = true