Skip to content

Commit

Permalink
refactor(compiler-sfc): improve TLA codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Sep 16, 2021
1 parent 39cebf5 commit cab9541
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 86 deletions.
Expand Up @@ -96,37 +96,26 @@ export default /*#__PURE__*/ Object.assign(__default__, {
})"
`;
exports[`SFC compile <script setup> async/await detection await in expression statement 1`] = `
exports[`SFC compile <script setup> async/await detection expression statement 1`] = `
"import { withAsyncContext as _withAsyncContext } from 'vue'
export default {
async setup(__props, { expose }) {
expose()
let __temp, __restore
foo()
;(
([__temp,__restore] = _withAsyncContext(() => {
return 1
})),
__temp = await __temp,
__restore(),
__temp
) + (
([__temp,__restore] = _withAsyncContext(() => {
return 2
})),
__temp = await __temp,
__restore(),
__temp
([__temp,__restore] = _withAsyncContext(() => foo)),
await __temp,
__restore()
)
return { }
}
}"
`;
exports[`SFC compile <script setup> async/await detection expression statement 1`] = `
exports[`SFC compile <script setup> async/await detection nested await 1`] = `
"import { withAsyncContext as _withAsyncContext } from 'vue'
export default {
Expand All @@ -135,20 +124,22 @@ export default {
let __temp, __restore
;(
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
([__temp,__restore] = _withAsyncContext(async () => ((
([__temp,__restore] = _withAsyncContext(() => foo)),
__temp = await __temp,
__restore(),
__temp
)))),
await __temp,
__restore()
)
return { }
}
}"
`;
exports[`SFC compile <script setup> async/await detection nested await 1`] = `
exports[`SFC compile <script setup> async/await detection nested await 2`] = `
"import { withAsyncContext as _withAsyncContext } from 'vue'
export default {
Expand All @@ -157,27 +148,22 @@ export default {
let __temp, __restore
;(
([__temp,__restore] = _withAsyncContext(async () => {
return ((
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
__temp = await __temp,
__restore(),
__temp
))
})),
([__temp,__restore] = _withAsyncContext(async () => (((
([__temp,__restore] = _withAsyncContext(() => foo)),
__temp = await __temp,
__restore(),
__temp
))))),
await __temp,
__restore()
)
return { }
}
}"
`;
exports[`SFC compile <script setup> async/await detection nested await 2`] = `
exports[`SFC compile <script setup> async/await detection nested await 3`] = `
"import { withAsyncContext as _withAsyncContext } from 'vue'
export default {
Expand All @@ -186,52 +172,42 @@ export default {
let __temp, __restore
;(
([__temp,__restore] = _withAsyncContext(async () => {
return (((
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
([__temp,__restore] = _withAsyncContext(async () => ((
([__temp,__restore] = _withAsyncContext(async () => ((
([__temp,__restore] = _withAsyncContext(() => foo)),
__temp = await __temp,
__restore(),
__temp
)))
})),
)))),
__temp = await __temp,
__restore(),
__temp
)))),
await __temp,
__restore()
)
return { }
}
}"
`;
exports[`SFC compile <script setup> async/await detection nested await 3`] = `
exports[`SFC compile <script setup> async/await detection nested leading await in expression statement 1`] = `
"import { withAsyncContext as _withAsyncContext } from 'vue'
export default {
async setup(__props, { expose }) {
expose()
let __temp, __restore
foo()
;(
([__temp,__restore] = _withAsyncContext(async () => {
return ((
([__temp,__restore] = _withAsyncContext(async () => {
return ((
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
([__temp,__restore] = _withAsyncContext(() => 1)),
__temp = await __temp,
__restore(),
__temp
))
})),
__temp = await __temp,
__restore(),
__temp
))
})),
) + (
([__temp,__restore] = _withAsyncContext(() => 2)),
__temp = await __temp,
__restore(),
__temp
Expand All @@ -251,19 +227,13 @@ export default {
let __temp, __restore
if (ok) { (
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
__temp = await __temp,
__restore(),
__temp
([__temp,__restore] = _withAsyncContext(() => foo)),
await __temp,
__restore()
) } else { (
([__temp,__restore] = _withAsyncContext(() => {
return bar
})),
__temp = await __temp,
__restore(),
__temp
([__temp,__restore] = _withAsyncContext(() => bar)),
await __temp,
__restore()
) }
return { }
}
Expand All @@ -280,9 +250,7 @@ export default {
let __temp, __restore
let a = _ref(1 + ((
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
([__temp,__restore] = _withAsyncContext(() => foo)),
__temp = await __temp,
__restore(),
__temp
Expand Down Expand Up @@ -346,12 +314,9 @@ export default {
let __temp, __restore
if (false) (
([__temp,__restore] = _withAsyncContext(() => {
return foo()
})),
__temp = await __temp,
__restore(),
__temp
([__temp,__restore] = _withAsyncContext(() => foo())),
await __temp,
__restore()
)
return { }
}
Expand All @@ -368,9 +333,7 @@ export default {
let __temp, __restore
const a = 1 + ((
([__temp,__restore] = _withAsyncContext(() => {
return foo
})),
([__temp,__restore] = _withAsyncContext(() => foo)),
__temp = await __temp,
__restore(),
__temp
Expand Down
2 changes: 1 addition & 1 deletion packages/compiler-sfc/__tests__/compileScript.spec.ts
Expand Up @@ -1089,7 +1089,7 @@ const emit = defineEmits(['a', 'b'])
})

// should prepend semicolon
test('await in expression statement', () => {
test('nested leading await in expression statement', () => {
const code = assertAwaitDetection(`foo()\nawait 1 + await 2`)
expect(code).toMatch(`foo()\n;(`)
})
Expand Down
37 changes: 29 additions & 8 deletions packages/compiler-sfc/src/compileScript.ts
Expand Up @@ -507,13 +507,28 @@ export function compileScript(
}

/**
* await foo() -->
* await foo()
* -->
* ;(
* ([__temp,__restore] = withAsyncContext(() => foo())),
* await __temp,
* __restore()
* )
*
* (([__temp, __restore] = withAsyncContext(async () => {
* return foo()
* })),__temp=await __temp,__restore(),__temp)
* const a = await foo()
* -->
* const a = (
* ([__temp, __restore] = withAsyncContext(() => foo())),
* __temp = await __temp,
* __restore(),
* __temp
* )
*/
function processAwait(node: AwaitExpression, needSemi: boolean) {
function processAwait(
node: AwaitExpression,
needSemi: boolean,
isStatement: boolean
) {
const argumentStart =
node.argument.extra && node.argument.extra.parenthesized
? (node.argument.extra.parenStart as number)
Expand All @@ -531,11 +546,13 @@ export function compileScript(
argumentStart + startOffset,
`${needSemi ? `;` : ``}(\n ([__temp,__restore] = ${helper(
`withAsyncContext`
)}(${containsNestedAwait ? `async ` : ``}() => {\n return `
)}(${containsNestedAwait ? `async ` : ``}() => `
)
s.appendLeft(
node.end! + startOffset,
`\n })),\n __temp = await __temp,\n __restore(),\n __temp\n)`
`)),\n ${isStatement ? `` : `__temp = `}await __temp,\n __restore()${
isStatement ? `` : `,\n __temp`
}\n)`
)
}

Expand Down Expand Up @@ -937,7 +954,11 @@ export function compileScript(
const needsSemi = scriptSetupAst.body.some(n => {
return n.type === 'ExpressionStatement' && n.start === child.start
})
processAwait(child, needsSemi)
processAwait(
child,
needsSemi,
parent.type === 'ExpressionStatement'
)
}
}
})
Expand Down

0 comments on commit cab9541

Please sign in to comment.