Tests breakable locations in await expression.

Running test: testBreakLocations

function testFunction() {
  async function f1() {
    for (let x = |_|0; x |_|< 1; ++|_|x) |_|await x;
    |_|return |_|await Promise.|C|resolve(2);|R|
  |R|}

  async function f2() {
    let r = |_|await |C|f1() + |_|await |C|f1();
    |_|await |C|f1();
    |_|await |C|f1().|C|then(x => x |_|* 2|R|);
    |_|await [1].|C|map(x => Promise.|C|resolve(x)|R|)[0];
    |_|await Promise.|C|resolve().|C|then(x => x |_|* 2|R|);
    let p = |_|Promise.|C|resolve(42);
    |_|await p;
    |_|return r;|R|
  |R|}

  return |C|f2();|R|
}


Running test: testStepInto
(anonymous) (expr.js:0:0)


testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)

  return #f2();
}

f2 (test.js:8:12)
testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)
  async function f2() {
    let r = #await f1() + await f1();
    await f1();

f1 (test.js:3:17)
f2 (test.js:8:18)
testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)
  async function f1() {
    for (let x = #0; x < 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
f2 (test.js:8:18)
testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:32)
f2 (test.js:8:18)
testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)
  async function f1() {
    for (let x = 0; x < 1; ++x) #await x;
    return await Promise.resolve(2);

f1 (test.js:3:29)
  async function f1() {
    for (let x = 0; x < 1; ++#x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:4:4)
    for (let x = 0; x < 1; ++x) await x;
    #return await Promise.resolve(2);
  }

f1 (test.js:4:36)
    for (let x = 0; x < 1; ++x) await x;
    return await Promise.resolve(2);#
  }

f2 (test.js:8:31)
  async function f2() {
    let r = await f1() + await #f1();
    await f1();

f1 (test.js:3:17)
f2 (test.js:8:31)
  async function f1() {
    for (let x = #0; x < 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
f2 (test.js:8:31)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:32)
f2 (test.js:8:31)
  async function f1() {
    for (let x = 0; x < 1; ++x) #await x;
    return await Promise.resolve(2);

f1 (test.js:3:29)
  async function f1() {
    for (let x = 0; x < 1; ++#x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:4:4)
    for (let x = 0; x < 1; ++x) await x;
    #return await Promise.resolve(2);
  }

f1 (test.js:4:36)
    for (let x = 0; x < 1; ++x) await x;
    return await Promise.resolve(2);#
  }

f2 (test.js:9:4)
    let r = await f1() + await f1();
    #await f1();
    await f1().then(x => x * 2);

f1 (test.js:3:17)
f2 (test.js:9:10)
  async function f1() {
    for (let x = #0; x < 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
f2 (test.js:9:10)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:32)
f2 (test.js:9:10)
  async function f1() {
    for (let x = 0; x < 1; ++x) #await x;
    return await Promise.resolve(2);

f1 (test.js:3:29)
  async function f1() {
    for (let x = 0; x < 1; ++#x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:4:4)
    for (let x = 0; x < 1; ++x) await x;
    #return await Promise.resolve(2);
  }

f1 (test.js:4:36)
    for (let x = 0; x < 1; ++x) await x;
    return await Promise.resolve(2);#
  }

f2 (test.js:10:4)
    await f1();
    #await f1().then(x => x * 2);
    await [1].map(x => Promise.resolve(x))[0];

f1 (test.js:3:17)
f2 (test.js:10:10)
  async function f1() {
    for (let x = #0; x < 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
f2 (test.js:10:10)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:32)
f2 (test.js:10:10)
  async function f1() {
    for (let x = 0; x < 1; ++x) #await x;
    return await Promise.resolve(2);

f1 (test.js:3:29)
  async function f1() {
    for (let x = 0; x < 1; ++#x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:4:4)
    for (let x = 0; x < 1; ++x) await x;
    #return await Promise.resolve(2);
  }

f1 (test.js:4:36)
    for (let x = 0; x < 1; ++x) await x;
    return await Promise.resolve(2);#
  }

(anonymous) (test.js:10:27)
    await f1();
    await f1().then(x => x #* 2);
    await [1].map(x => Promise.resolve(x))[0];

(anonymous) (test.js:10:30)
    await f1();
    await f1().then(x => x * 2#);
    await [1].map(x => Promise.resolve(x))[0];

f2 (test.js:11:4)
    await f1().then(x => x * 2);
    #await [1].map(x => Promise.resolve(x))[0];
    await Promise.resolve().then(x => x * 2);

(anonymous) (test.js:11:31)
f2 (test.js:11:14)
    await f1().then(x => x * 2);
    await [1].map(x => Promise.#resolve(x))[0];
    await Promise.resolve().then(x => x * 2);

(anonymous) (test.js:11:41)
f2 (test.js:11:14)
    await f1().then(x => x * 2);
    await [1].map(x => Promise.resolve(x)#)[0];
    await Promise.resolve().then(x => x * 2);

f2 (test.js:12:4)
    await [1].map(x => Promise.resolve(x))[0];
    #await Promise.resolve().then(x => x * 2);
    let p = Promise.resolve(42);

f2 (test.js:13:12)
    await Promise.resolve().then(x => x * 2);
    let p = #Promise.resolve(42);
    await p;

f2 (test.js:14:4)
    let p = Promise.resolve(42);
    #await p;
    return r;

f2 (test.js:15:4)
    await p;
    #return r;
  }

f2 (test.js:15:13)
    await p;
    return r;#
  }


Running test: testStepOver
f2 (test.js:8:12)
testFunction (test.js:18:9)
(anonymous) (expr.js:0:0)
  async function f2() {
    let r = #await f1() + await f1();
    await f1();

f2 (test.js:8:31)
  async function f2() {
    let r = await f1() + await #f1();
    await f1();

f2 (test.js:9:4)
    let r = await f1() + await f1();
    #await f1();
    await f1().then(x => x * 2);

f2 (test.js:10:4)
    await f1();
    #await f1().then(x => x * 2);
    await [1].map(x => Promise.resolve(x))[0];

f2 (test.js:11:4)
    await f1().then(x => x * 2);
    #await [1].map(x => Promise.resolve(x))[0];
    await Promise.resolve().then(x => x * 2);

f2 (test.js:12:4)
    await [1].map(x => Promise.resolve(x))[0];
    #await Promise.resolve().then(x => x * 2);
    let p = Promise.resolve(42);

f2 (test.js:13:12)
    await Promise.resolve().then(x => x * 2);
    let p = #Promise.resolve(42);
    await p;

f2 (test.js:14:4)
    let p = Promise.resolve(42);
    #await p;
    return r;

f2 (test.js:15:4)
    await p;
    #return r;
  }

f2 (test.js:15:13)
    await p;
    return r;#
  }


Running test: testStepIntoAfterBreakpoint
f2 (test.js:9:4)
    let r = await f1() + await f1();
    #await f1();
    await f1().then(x => x * 2);

f1 (test.js:3:17)
f2 (test.js:9:10)
  async function f1() {
    for (let x = #0; x < 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
f2 (test.js:9:10)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:32)
f2 (test.js:9:10)
  async function f1() {
    for (let x = 0; x < 1; ++x) #await x;
    return await Promise.resolve(2);

f1 (test.js:3:29)
  async function f1() {
    for (let x = 0; x < 1; ++#x) await x;
    return await Promise.resolve(2);

f1 (test.js:3:22)
  async function f1() {
    for (let x = 0; x #< 1; ++x) await x;
    return await Promise.resolve(2);

f1 (test.js:4:4)
    for (let x = 0; x < 1; ++x) await x;
    #return await Promise.resolve(2);
  }

