Allow await when it is not in AsyncArrowHead (#11148)

This commit is contained in:
Arun Kumar Mohan
2020-03-16 16:26:48 -05:00
committed by GitHub
parent 1ba41f2084
commit 84a9ea455b
4 changed files with 122 additions and 1 deletions

View File

@@ -560,10 +560,15 @@ export default class ExpressionParser extends LValParser {
stop: false,
};
do {
const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;
if (state.maybeAsyncArrow) {
this.state.maybeInAsyncArrowHead = true;
}
base = this.parseSubscript(base, startPos, startLoc, noCalls, state);
// After parsing a subscript, this isn't "async" for sure.
state.maybeAsyncArrow = false;
this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;
} while (!state.stop);
return base;
}
@@ -953,15 +958,18 @@ export default class ExpressionParser extends LValParser {
!this.canInsertSemicolon()
) {
const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
const oldMaybeInAsyncArrowHead = this.state.maybeInAsyncArrowHead;
const oldYieldPos = this.state.yieldPos;
const oldAwaitPos = this.state.awaitPos;
this.state.maybeInArrowParameters = true;
this.state.maybeInAsyncArrowHead = true;
this.state.yieldPos = -1;
this.state.awaitPos = -1;
const params = [this.parseIdentifier()];
this.expect(tt.arrow);
this.checkYieldAwaitInDefaultParams();
this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
this.state.maybeInAsyncArrowHead = oldMaybeInAsyncArrowHead;
this.state.yieldPos = oldYieldPos;
this.state.awaitPos = oldAwaitPos;
// let foo = async bar => {};
@@ -1296,6 +1304,9 @@ export default class ExpressionParser extends LValParser {
this.shouldParseArrow() &&
(arrowNode = this.parseArrow(arrowNode))
) {
if (!this.isAwaitAllowed() && !this.state.maybeInAsyncArrowHead) {
this.state.awaitPos = oldAwaitPos;
}
this.checkYieldAwaitInDefaultParams();
this.state.yieldPos = oldYieldPos;
this.state.awaitPos = oldAwaitPos;
@@ -2128,7 +2139,7 @@ export default class ExpressionParser extends LValParser {
}
if (
this.state.awaitPos === -1 &&
(this.state.maybeInArrowParameters || this.isAwaitAllowed())
(this.state.maybeInAsyncArrowHead || this.isAwaitAllowed())
) {
this.state.awaitPos = this.state.start;
}

View File

@@ -59,6 +59,11 @@ export default class State {
// Flags to track
inParameters: boolean = false;
maybeInArrowParameters: boolean = false;
// This flag is used to track async arrow head across function declarations.
// e.g. async (foo = function (await) {}) => {}
// When parsing `await` in this expression, `maybeInAsyncArrowHead` is true
// but `maybeInArrowParameters` is false
maybeInAsyncArrowHead: boolean = false;
inPipeline: boolean = false;
inType: boolean = false;
noAnonFunctionType: boolean = false;