Skip to content

Commit

Permalink
Merge pull request #213 from meriyah/global-await
Browse files Browse the repository at this point in the history
fix(parser): allow top level await in expressions
  • Loading branch information
3cp committed Mar 31, 2022
2 parents b6a7cf6 + 37c6361 commit 39d8686
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 4 deletions.
6 changes: 3 additions & 3 deletions src/parser.ts
Expand Up @@ -3859,12 +3859,12 @@ export function parseMemberOrUpdateExpression(
if ((parser.token & Token.IsUpdateOp) === Token.IsUpdateOp && (parser.flags & Flags.NewLine) < 1) {
expr = parseUpdateExpression(parser, context, expr, start, line, column);
} else if ((parser.token & Token.IsMemberOrCallExpression) === Token.IsMemberOrCallExpression) {
context = (context | Context.DisallowIn | Context.InGlobal) ^ (Context.DisallowIn | Context.InGlobal);
context = (context | Context.DisallowIn) ^ Context.DisallowIn;

switch (parser.token) {
/* Property */
case Token.Period: {
nextToken(parser, context | Context.AllowEscapedKeyword);
nextToken(parser, (context | Context.AllowEscapedKeyword | Context.InGlobal) ^ Context.InGlobal);

parser.assignable = AssignmentKind.Assignable;

Expand Down Expand Up @@ -3940,7 +3940,7 @@ export function parseMemberOrUpdateExpression(

/* Optional chaining */
case Token.QuestionMarkPeriod: {
nextToken(parser, context); // skips: '?.'
nextToken(parser, (context | Context.AllowEscapedKeyword | Context.InGlobal) ^ Context.InGlobal); // skips: '?.'
parser.flags |= Flags.HasOptionalChaining;
parser.assignable = AssignmentKind.CannotAssign;
expr = parseOptionalChain(parser, context, expr, start, line, column);
Expand Down
57 changes: 57 additions & 0 deletions test/parser/expressions/await.ts
Expand Up @@ -3282,6 +3282,63 @@ describe('Expressions - Await', () => {
}
]
}
],
[
'foo[await 1]',
Context.Module,
{
type: 'Program',
sourceType: 'module',
body: [
{
type: 'ExpressionStatement',
expression: {
type: 'MemberExpression',
object: {
type: 'Identifier',
name: 'foo'
},
computed: true,
property: {
type: 'AwaitExpression',
argument: {
type: 'Literal',
value: 1
}
}
}
}
]
}
],
[
'foo(await bar)',
Context.Module,
{
type: 'Program',
sourceType: 'module',
body: [
{
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'foo'
},
arguments: [
{
type: 'AwaitExpression',
argument: {
type: 'Identifier',
name: 'bar'
}
}
]
}
}
]
}
]
]);
});
3 changes: 2 additions & 1 deletion test/parser/expressions/optional-chaining.ts
Expand Up @@ -6,7 +6,8 @@ import { parseSource } from '../../../src/parser';
describe('Optional chaining', () => {
for (const arg of [
'func?.()',
'obj?.prop ',
'obj?.prop',
'obj?.def\\u{61}ult',
'func?.(...args)',
'a?.[x]',
'a?.()',
Expand Down
1 change: 1 addition & 0 deletions test/parser/miscellaneous/escaped-keyword.ts
Expand Up @@ -11,6 +11,7 @@ describe('Miscellaneous - Escaped keywords', () => {
'(\\u0069nterface = 1);',
'({ def\\u0061ult: 0 })',
'({ def\\u{61}ult: 0 })',
'foo = {}; foo?.def\\u{61}ult + 3;',
'foo = {}; foo.def\\u{61}ult = 3;',
'var int\\u0065rface = 1;',
'var { int\\u0065rface } = {};',
Expand Down

0 comments on commit 39d8686

Please sign in to comment.