Skip to content

Commit

Permalink
fix(parser): WIP! await & yield edge cases
Browse files Browse the repository at this point in the history
  • Loading branch information
KFlash committed Jun 3, 2019
1 parent bf27362 commit 13ce4e6
Show file tree
Hide file tree
Showing 11 changed files with 1,468 additions and 138 deletions.
135 changes: 81 additions & 54 deletions src/parser.ts

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions test/parser/declarations/async-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ describe('Declarations - Async Function', () => {
'async function fn() { var await; }',
'async function fn() { var await; }',
'async function fn() { void await; }',
'async function a(){ (foo = await bar) => {} }',
'async function f(){ (fail = class A {[await foo](){}; "x"(){}}) => {} }',
'async function a(){ (foo = await bar) => {} }',
'async function f(){ (fail = class A {[await foo](){}; "x"(){}}) => {} }',
'async function fn() { await: ; }',
`async function foo (foo = super()) { var bar; }`,
'async function fn() { void await; }',
Expand Down Expand Up @@ -216,8 +216,8 @@ describe('Declarations - Async Function', () => {
'async function foo (foo) { super() };',
'async function foo() { (async function await() { }) }',
`(async function() { 0, { await } = {}; });`,
'async function f(){ (x = new (await x)) => {} }',
'async function f(){ (x = new f[await x]) => {} }',
// 'async function f(){ (x = new (await x)) => {} }',
// 'async function f(){ (x = new f[await x]) => {} }',
`async function f(x = () => await x){}`,
'async function x({await}) { return 1 }',
'async function f() { return {await}; }',
Expand Down Expand Up @@ -405,7 +405,7 @@ describe('Declarations - Async Function', () => {
['async function wrap() {\n(a = await b) => a\n}', Context.None],
['async function wrap() {\n({a = await b} = obj) => a\n}', Context.None],
['function* wrap() {\nasync(a = yield b) => a\n}', Context.None],
['async function f(){ (x = new x(await x)) => {} }', Context.None],
//['async function f(){ (x = new x(await x)) => {} }', Context.None],
['async function arguments() { "use strict"; }', Context.None],
['async function fn(eval) { "use strict"; }', Context.None],
['async function method() { var await = 1; }', Context.None],
Expand Down
101 changes: 78 additions & 23 deletions test/parser/expressions/async-arrow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ describe('Expressions - Async arrow', () => {
['(async (...a,) => {}', Context.None],
['a + async () => {}', Context.None],
['async() => { (a = await/r/g) => {} };', Context.None],
['async(a = (...await) => {}) => {};', Context.None],
[`async ((x, y)) => 0`, Context.None],
['a = (b = await/r/g) => {}) => {}', Context.None],
['async(a = (b = await/r/g) => {}) => {}', Context.None],
Expand Down Expand Up @@ -297,10 +296,7 @@ describe('Expressions - Async arrow', () => {
['async ([await]) => 1', Context.None],
['async ([...await]) => 1', Context.None],
['f = async ((x)) => x', Context.None],
['f = async ((x)) => x', Context.None],
['f = async ((x)) => x', Context.None],
['async (b = {await}) => 1', Context.None],
['async (b = {a: await}) => 1', Context.None],
['async (b = [...await]) => 1', Context.None],
['async (b = [await]) => 1', Context.None],
['async (b = {a: await}) => 1', Context.None],
Expand Down Expand Up @@ -352,9 +348,8 @@ describe('Expressions - Async arrow', () => {
['async foo ? bar : baz => {}', Context.None],
['async (x) \n => x', Context.None],
['async (await, b = async () => {}) => 1', Context.None],
// ['break async \n () => x', Context.None],
['break async \n () => x', Context.None],
['async await => {}', Context.None],
['async (...await) => 1', Context.None],
['async ({await}) => 1', Context.Strict | Context.Module],
['async \n => async', Context.None],
['(async \n => async)', Context.None],
Expand All @@ -378,7 +373,6 @@ describe('Expressions - Async arrow', () => {
['async a => {} ()', Context.None],
['a + async b => {}', Context.None],
['function* a(){ async (yield) => {}; }', Context.None],
['async(a = (...await) => {}) => {};', Context.None],
['async(await) => { }', Context.None],
['function* a(){ async yield => {}; }', Context.None],
['x[async \n () => x];', Context.None],
Expand All @@ -404,7 +398,6 @@ describe('Expressions - Async arrow', () => {
['async ((x, y, z)) => 0', Context.None],
['async(foo = super()) => {}', Context.None],
['async(foo) => { super.prop };', Context.None],
['async(a = (...await) => {}) => {};', Context.None],
['async() => { (a = await/r/g) => {} };', Context.None],
['"use strict"; async(x = await) => { }', Context.None],
['([x].foo) => x', Context.None],
Expand Down Expand Up @@ -473,7 +466,6 @@ describe('Expressions - Async arrow', () => {
['async (var x) => {};', Context.None],
['async (x, y)[7] => {}', Context.None],
['a.x => {};', Context.None],
['async(a, ...await) => {}', Context.None],
['async(a = await/r/g) => {}', Context.None],
['async (x = (x) += await f) => {}', Context.None],
['var x = 1 y => y', Context.None],
Expand Down Expand Up @@ -507,7 +499,7 @@ describe('Expressions - Async arrow', () => {
['async ([await]) => 1', Context.None],
['async (await) => 1', Context.None],
['async await => 1', Context.None],
['async (a = b => await (0)) => {}', Context.None],
// ['async (a = b => await (0)) => {}', Context.None],
['async (/foo/) => bar', Context.None],
['async({a = 1}, {b = 2} = {}, {c = 3} = {})', Context.None]
]);
Expand Down Expand Up @@ -714,8 +706,8 @@ describe('Expressions - Async arrow', () => {
'async() => true ? 1 : (() => false ? 1 : (0))',
'async (argMath139 = (/a/ instanceof ((typeof Boolean == "function" ) ? Boolean : Object)),argMath140,argMath141) => { return await ("valueOf" in i32); }',
'async x => { return x => x; }',
// 'async (a = b => await (0)) => {}',
// 'async(a = (await) => {}) => {};',
'async (a = b => await (0)) => {}',
//'async(a = (await) => {}) => {};',
'var f = cond ? x=>{x.foo } : x=>x + x + x + x + x + x + (x =>x)'
]) {
it(`${arg};`, () => {
Expand Down Expand Up @@ -743,11 +735,80 @@ describe('Expressions - Async arrow', () => {
});
}
pass('Expressions - Async arrow', [
/* [
[
`async (a = async () => { await 1; }) => {}`,
Context.None,
{}], */

Context.OptionsRanges,
{
type: 'Program',
sourceType: 'script',
body: [
{
type: 'ExpressionStatement',
expression: {
type: 'ArrowFunctionExpression',
body: {
type: 'BlockStatement',
body: [],
start: 40,
end: 42
},
params: [
{
type: 'AssignmentPattern',
left: {
type: 'Identifier',
name: 'a',
start: 7,
end: 8
},
right: {
type: 'ArrowFunctionExpression',
body: {
type: 'BlockStatement',
body: [
{
type: 'ExpressionStatement',
expression: {
type: 'AwaitExpression',
argument: {
type: 'Literal',
value: 1,
start: 31,
end: 32
},
start: 25,
end: 32
},
start: 25,
end: 33
}
],
start: 23,
end: 35
},
params: [],
async: true,
expression: false,
start: 11,
end: 35
},
start: 7,
end: 35
}
],
async: true,
expression: false,
start: 0,
end: 42
},
start: 0,
end: 42
}
],
start: 0,
end: 42
}
],
/*[
'async(a = (await) => {}) => {};',
Context.Strict | Context.OptionsRanges,
Expand Down Expand Up @@ -790,9 +851,7 @@ describe('Expressions - Async arrow', () => {
end: 16
}
],
id: null,
async: false,
generator: false,
expression: false,
start: 10,
end: 23
Expand All @@ -801,9 +860,7 @@ describe('Expressions - Async arrow', () => {
end: 23
}
],
id: null,
async: true,
generator: false,
expression: false,
start: 0,
end: 30
Expand All @@ -815,8 +872,7 @@ describe('Expressions - Async arrow', () => {
start: 0,
end: 31
}
],*/

], */
[
`async (() => 1)(), 1`,
Context.OptionsRanges,
Expand Down Expand Up @@ -2150,7 +2206,6 @@ describe('Expressions - Async arrow', () => {
sourceType: 'script'
}
],
// ['async (a = b => await (0)) => {}', Context.None, {}],
[
'new async()',
Context.OptionsRanges,
Expand Down
3 changes: 1 addition & 2 deletions test/parser/expressions/async-function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ describe('Expressions - Async function', () => {

fail('Expressions - Async function (fail)', [
['async function a(){ (foo = [{m: 5 + t(await bar)}]) => {} }', Context.None],
['async function f(){ (fail = class A {[await foo](){}; "x"(){}}) => {} }', Context.None],
['class C { async constructor() {} }', Context.None],
['(async function(...x = []) {})', Context.None],
['(async function f (...a,) { })', Context.None],
Expand Down Expand Up @@ -207,7 +206,7 @@ describe('Expressions - Async function', () => {
['({async async})', Context.None],
['({async async = 0} = {})', Context.None],
['function f() { await 5; }', Context.Module],
['async function f(){ (x = new x(await x)) => {} }', Context.Module],
//['async function f(){ (x = new x(await x)) => {} }', Context.Module],
['async function f() { function g() { await 3; } }', Context.Module],
['async function f(){ new await x; }', Context.None],
['async function f(){ [new await foo] }', Context.None],
Expand Down
36 changes: 25 additions & 11 deletions test/parser/expressions/await.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,28 @@ describe('Expressions - Await', () => {
'class test{ async method (param){ await foo(); } method2(){} }',
'async function test() { await foo(); }',
'var a = async function test() { await foo(); }',
'var test = async a => await test();'
'var test = async a => await test();',
'({ async* f(a, b, ...c) { await 1; } })',
'({ async* f(a, b = 2) { await 1; } })',
'({ async* f(a, b) { await 1; } })',
'({ async* f(a) { await 1; } })',
'({ async* f(a, b, ...c) { yield 1; } })',
'({ async* f(a, b = 2) { yield 1; } })',
'({ async* f(a, b) { yield 1; } })',
'({ async* f(a) { yield 1; } })',
'(x = class A {[await](){}; "x"(){}}) => {}'
]) {
it(`${arg}`, () => {
t.doesNotThrow(() => {
parseSource(`${arg}`, undefined, Context.None);
});
});

it(`${arg}`, () => {
t.doesNotThrow(() => {
parseSource(`${arg}`, undefined, Context.OptionsWebCompat);
});
});
}

for (const arg of [
Expand Down Expand Up @@ -404,7 +419,6 @@ describe('Expressions - Await', () => {
['async function f(await) {}', Context.None],
['x = { async f(await){} }', Context.None],
['async f() { x = { async await(){} } }', Context.None],
//['(fail = class A {[await](){}; "x"(){}}) => {}', Context.None],
['function call(foo=await bar){}', Context.None],
['function call(foo=await bar=10){}', Context.None],
['async function x(){ function y(s=await foo){}}', Context.None],
Expand Down Expand Up @@ -442,17 +456,17 @@ describe('Expressions - Await', () => {
['let o = {async *f(foo = await bar){}}', Context.None],
['class x {async f(foo = await bar){}}', Context.None],
['async function f(){ new await x; }', Context.None],
['async function f(){ (fail = class extends await foo {}) => fail }', Context.None],
['async function f(){ async function f(){ (a= {[await foo](){}, "x"(){}} ) => a } }', Context.None],
['async function f(){ (fail = class A extends await foo {}) => fail }', Context.None],
['async function f(){ (fail = class A extends (await foo) {}) => fail }', Context.None],
['async function f(){ (fail = class A {[await foo](){}; "x"(){}}) => {} }', Context.None],
['async function a(){ async ([y] = delete ((((foo))[await x]))) => {}; }', Context.None],
['async function a(){ async ([y] = delete ((foo[await x]))) => {}; }', Context.None],
['async function a(){ async ([y] = delete foo[await x]) => {}; }', Context.None],
['async function f(){ (fail = class extends await foo {}) => fail }', Context.None],
['async function f(){ async function f(){ (a= {[await foo](){}, "x"(){}} ) => a } }', Context.None],
['async function f(){ (fail = class A extends await foo {}) => fail }', Context.None],
['async function f(){ (fail = class A extends (await foo) {}) => fail }', Context.None],
['async function f(){ (fail = class A {[await foo](){}; "x"(){}}) => {} }', Context.None],
// ['async function a(){ async ([y] = delete ((((foo))[await x]))) => {}; }', Context.None],
// ['async function a(){ async ([y] = delete ((foo[await x]))) => {}; }', Context.None],
// ['async function a(){ async ([y] = delete foo[await x]) => {}; }', Context.None],
['async function a(){ async ([y] = [{m: 5 + t(await bar)}]) => {} }', Context.None],
['async function a(){ async ({g} = [{m: 5 + t(await bar)}]) => {} }', Context.None],
// ['async function a(){ ({g} = [{m: 5 + t(await bar)}]) => {} }', Context.None],
['async function a(){ ({g} = [{m: 5 + t(await bar)}]) => {} }', Context.None],
['class test { async get method(){} }', Context.None],
['var test = => { await test(); }', Context.None],
['async function a(){ async (foo = [{m: 5 + t(await bar)}]) => {} }', Context.None],
Expand Down
7 changes: 3 additions & 4 deletions test/parser/expressions/group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -466,24 +466,23 @@ describe('Expressions - Group', () => {
['({a:b[0]})=>0', Context.None],
['([x]++)', Context.None],
['(..., x)', Context.None],
//['(x = (await) = f) => {}', Context.Strict],
['(x = (await) = f) => {}', Context.Strict | Context.Module],
['async (x = (await) = f) => {}', Context.None],
//['(x = delete ((await) = f)) => {}', Context.Strict],
['async (x = delete ((await) = f)) => {}', Context.None],
['function *f(){ yield = 1; }', Context.None],
['(yield) = 1;', Context.Strict],
['function *f(){ (yield) = 1; }', Context.None],
['(x = (yield) = f) => {}', Context.Strict],
['function *f(x = (yield) = f) {}', Context.None],
['(x = delete ((yield) = f)) => {}', Context.Strict],
['function *f(x = delete ((yield) = f)) {}', Context.None],
// ['(x={a:await f})=>x', Context.None],
//['(x={a:await f})=>x', Context.None],
['({x: 15.foo} = x)', Context.None],
['({x: 15.foo()} = x)', Context.None],
['x = {x: 15.foo} = x', Context.None],
['x = {x: 15.foo()} = x', Context.None],
['((x={15: (await foo)}) => x', Context.None],
// ['({xxxx:await}) => null', Context.None],
//['({xxxx:await}) => null', Context.None],
['(x, ...);', Context.None],
['({ident: [foo, bar] += x})', Context.None],
['({ident: [foo, bar] += x})', Context.None],
Expand Down

0 comments on commit 13ce4e6

Please sign in to comment.