Skip to content

Commit

Permalink
fix: handle case of ref declaration without initial value
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Oct 30, 2020
1 parent ed2eb81 commit 8485cd4
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -292,14 +292,15 @@ exports[`SFC compile <script setup> ref: syntax sugar convert ref declarations 1
export function setup() {
const foo = ref()
const a = ref(1)
const b = ref({
count: 0
})
let c = () => {}
let d
return { a, b, c, d }
return { foo, a, b, c, d }
}
export default { setup }"
Expand Down
5 changes: 5 additions & 0 deletions packages/compiler-sfc/__tests__/compileScript.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ describe('SFC compile <script setup>', () => {
describe('ref: syntax sugar', () => {
test('convert ref declarations', () => {
const { content, bindings } = compile(`<script setup>
ref: foo
ref: a = 1
ref: b = {
count: 0
Expand All @@ -267,7 +268,10 @@ describe('SFC compile <script setup>', () => {
let d
</script>`)
expect(content).toMatch(`import { ref } from 'vue'`)
expect(content).not.toMatch(`ref: foo`)
expect(content).not.toMatch(`ref: a`)
expect(content).not.toMatch(`ref: b`)
expect(content).toMatch(`const foo = ref()`)
expect(content).toMatch(`const a = ref(1)`)
expect(content).toMatch(`
const b = ref({
Expand All @@ -279,6 +283,7 @@ describe('SFC compile <script setup>', () => {
expect(content).toMatch(`let d`)
assertCode(content)
expect(bindings).toStrictEqual({
foo: 'setup',
a: 'setup',
b: 'setup',
c: 'setup',
Expand Down
26 changes: 15 additions & 11 deletions packages/compiler-sfc/src/compileScript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,7 @@ export function compileScript(
helperImports.add('ref')
const { left, right } = exp
if (left.type === 'Identifier') {
if (left.name[0] === '$') {
error(`ref variable identifiers cannot start with $.`, left)
}
refBindings[left.name] = setupBindings[left.name] = true
refIdentifiers.add(left)
registerRefBinding(left)
s.prependRight(right.start! + startOffset, `ref(`)
s.appendLeft(right.end! + startOffset, ')')
} else if (left.type === 'ObjectPattern') {
Expand All @@ -186,11 +182,22 @@ export function compileScript(
// possible multiple declarations
// ref: x = 1, y = 2
exp.expressions.forEach(e => processRefExpression(e, statement))
} else if (exp.type === 'Identifier') {
registerRefBinding(exp)
s.appendLeft(exp.end! + startOffset, ` = ref()`)
} else {
error(`ref: statements can only contain assignment expressions.`, exp)
}
}

function registerRefBinding(id: Identifier) {
if (id.name[0] === '$') {
error(`ref variable identifiers cannot start with $.`, id)
}
refBindings[id.name] = setupBindings[id.name] = true
refIdentifiers.add(id)
}

function processRefObjectPattern(
pattern: ObjectPattern,
statement: LabeledStatement
Expand Down Expand Up @@ -227,9 +234,7 @@ export function compileScript(
s.prependRight(nameId.start! + startOffset, `__`)
}
if (nameId) {
// register binding
refBindings[nameId.name] = setupBindings[nameId.name] = true
refIdentifiers.add(nameId)
registerRefBinding(nameId)
// append binding declarations after the parent statement
s.appendLeft(
statement.end! + startOffset,
Expand Down Expand Up @@ -261,10 +266,9 @@ export function compileScript(
processRefArrayPattern(e, statement)
}
if (nameId) {
registerRefBinding(nameId)
// prefix original
s.prependRight(nameId.start! + startOffset, `__`)
// register binding
refBindings[nameId.name] = setupBindings[nameId.name] = true
refIdentifiers.add(nameId)
// append binding declarations after the parent statement
s.appendLeft(
statement.end! + startOffset,
Expand Down

0 comments on commit 8485cd4

Please sign in to comment.