fix(compiler-sfc): fix local var access check for bindings in normal script

fix #4644
This commit is contained in:
Evan You 2021-09-22 10:10:20 -04:00
parent 2476eaad6e
commit 6d6cc90912
2 changed files with 24 additions and 4 deletions

View File

@ -1181,6 +1181,19 @@ const emit = defineEmits(['a', 'b'])
defineEmits([bar]) defineEmits([bar])
</script>`) </script>`)
).toThrow(`cannot reference locally declared variables`) ).toThrow(`cannot reference locally declared variables`)
// #4644
expect(() =>
compile(`
<script>const bar = 1</script>
<script setup>
defineProps({
foo: {
default: () => bar
}
})
</script>`)
).not.toThrow(`cannot reference locally declared variables`)
}) })
test('should allow defineProps/Emit() referencing scope var', () => { test('should allow defineProps/Emit() referencing scope var', () => {

View File

@ -239,6 +239,7 @@ export function compileScript(
const helperImports: Set<string> = new Set() const helperImports: Set<string> = new Set()
const userImports: Record<string, ImportBinding> = Object.create(null) const userImports: Record<string, ImportBinding> = Object.create(null)
const userImportAlias: Record<string, string> = Object.create(null) const userImportAlias: Record<string, string> = Object.create(null)
const scriptBindings: Record<string, BindingTypes> = Object.create(null)
const setupBindings: Record<string, BindingTypes> = Object.create(null) const setupBindings: Record<string, BindingTypes> = Object.create(null)
let defaultExport: Node | undefined let defaultExport: Node | undefined
@ -739,7 +740,7 @@ export function compileScript(
} }
} }
if (node.declaration) { if (node.declaration) {
walkDeclaration(node.declaration, setupBindings, userImportAlias) walkDeclaration(node.declaration, scriptBindings, userImportAlias)
} }
} else if ( } else if (
(node.type === 'VariableDeclaration' || (node.type === 'VariableDeclaration' ||
@ -747,7 +748,7 @@ export function compileScript(
node.type === 'ClassDeclaration') && node.type === 'ClassDeclaration') &&
!node.declare !node.declare
) { ) {
walkDeclaration(node, setupBindings, userImportAlias) walkDeclaration(node, scriptBindings, userImportAlias)
} }
} }
@ -1070,6 +1071,9 @@ export function compileScript(
? BindingTypes.SETUP_CONST ? BindingTypes.SETUP_CONST
: BindingTypes.SETUP_MAYBE_REF : BindingTypes.SETUP_MAYBE_REF
} }
for (const key in scriptBindings) {
bindingMetadata[key] = scriptBindings[key]
}
for (const key in setupBindings) { for (const key in setupBindings) {
bindingMetadata[key] = setupBindings[key] bindingMetadata[key] = setupBindings[key]
} }
@ -1198,8 +1202,11 @@ export function compileScript(
returned = `() => {}` returned = `() => {}`
} }
} else { } else {
// return bindings from setup // return bindings from script and script setup
const allBindings: Record<string, any> = { ...setupBindings } const allBindings: Record<string, any> = {
...scriptBindings,
...setupBindings
}
for (const key in userImports) { for (const key in userImports) {
if (!userImports[key].isType && userImports[key].isUsedInTemplate) { if (!userImports[key].isType && userImports[key].isUsedInTemplate) {
allBindings[key] = true allBindings[key] = true