From 6c3b681d235bc70293827c535572f90be1ab6c68 Mon Sep 17 00:00:00 2001 From: liulinboyi <814921718@qq.com> Date: Wed, 27 Apr 2022 02:06:24 +0800 Subject: [PATCH] fix(compiler-sfc): async transformer doesn't correctly detect need for semicolon in block #5808 --- packages/compiler-sfc/src/compileScript.ts | 24 +++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 1139f71a7a5..7442e23c269 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -1126,6 +1126,7 @@ export function compileScript( // walk statements & named exports / variable declarations for top level // await + let body = scriptSetupAst.body if ( (node.type === 'VariableDeclaration' && !node.declare) || node.type.endsWith('Statement') @@ -1135,11 +1136,32 @@ export function compileScript( if (isFunctionType(child)) { this.skip() } + if (child.type === 'ExpressionStatement') { + if ( + child.expression.type === 'AwaitExpression' || + child.expression.type === 'BinaryExpression' + ) { + // set the parent of the AwaitExpression's body to the variable body + if (parent && parent.type === 'BlockStatement') { + body = parent.body + } else { + body = scriptSetupAst.body + } + } + } if (child.type === 'AwaitExpression') { hasAwait = true - const needsSemi = scriptSetupAst.body.some(n => { + // set the AwaitExpression's index in the parent of the AwaitExpression's body to the variable AwaitIndex + let AwaitIndex = 0 + let needsSemi = body.some((n, index) => { + AwaitIndex = index return n.type === 'ExpressionStatement' && n.start === child.start }) + // if the variable body is not equal scriptSetupAst.body + if (body !== scriptSetupAst.body) { + // judge the AwaitExpression is not in the first of the parent of the AwaitExpression's body + needsSemi = needsSemi && AwaitIndex > 0 + } processAwait( child, needsSemi,