Checks possible break locations.

Running test: testEval
break at:
function testEval() {
  #eval('// comment only');
  eval('// comment only\n');

break at:
// comment only#

break at:
  eval('// comment only');
  #eval('// comment only\n');
}

break at:
// comment only
#

break at:
  eval('// comment only\n');
#}



Running test: testProcedure
break at:
function testProcedure() {
  #procedure();
}

break at:
function procedure() {
  var a = #1;
  var b = 2;

break at:
  var a = 1;
  var b = #2;
}

break at:
  var b = 2;
#}


break at:
  procedure();
#}



Running test: testIf
break at:
  var a;
  if (true) #a = true;
  if (!a) {

break at:
  if (true) a = true;
  #if (!a) {
    a = true;

break at:
  } else {
    #a = false;
  }

break at:
  }
  #if (returnTrue()) {
    a = false;

break at:
function returnTrue() {
  #return true;
}

break at:
function returnTrue() {
  return true;#
}

break at:
  if (returnTrue()) {
    #a = false;
  } else {

break at:
  }
#}



Running test: testEmptyFunction
break at:
function testEmptyFunction() {
  #emptyFunction();
}

break at:

function emptyFunction() {#}


break at:
  emptyFunction();
#}



Running test: testCallArguments
break at:
function testCallArguments() {
  #twoArguments(emptyFunction(), emptyFunction());
}

break at:

function emptyFunction() {#}


break at:
function testCallArguments() {
  twoArguments(emptyFunction(), #emptyFunction());
}

break at:

function emptyFunction() {#}


break at:
function testCallArguments() {
  #twoArguments(emptyFunction(), emptyFunction());
}

break at:
function twoArguments(a1, a2) {
#}


break at:
  twoArguments(emptyFunction(), emptyFunction());
#}



Running test: testNested
break at:
  }
  #nested1();
}

break at:
    }
    return #nested2();
  }

break at:
      }
      #nested3();
      return;

break at:
      function nested3() {
      #}
      nested3();

break at:
      nested3();
      #return;
    }

break at:
      nested3();
      return;#
    }

break at:
    }
    return nested2();#
  }

break at:
  nested1();
#}



Running test: testCallAtReturn
break at:
function testCallAtReturn() {
  #return returnCall();
}

break at:
function returnCall() {
  #return return42();
}

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
function returnCall() {
  return return42();#
}

break at:
function testCallAtReturn() {
  return returnCall();#
}


Running test: testWith
break at:
function testWith() {
  #with (returnObject()) {
    foo();

break at:
function returnObject() {
  #return ({ foo: () => 42 });
}

break at:
function returnObject() {
  return ({ foo: () => 42 });#
}

break at:
  with (returnObject()) {
    #foo();
  }

break at:
function returnObject() {
  return ({ foo: () => #42 });
}

break at:
function returnObject() {
  return ({ foo: () => 42# });
}

break at:
  }
  #with({}) {
    return;

break at:
  with({}) {
    #return;
  }

break at:
  with({}) {
    return;#
  }


Running test: testForLoop
break at:
function testForLoop() {
  for (var i = #0; i < 1; ++i) {}
  for (var i = 0; i < 1; ++i) i;

break at:
function testForLoop() {
  for (var i = 0; i #< 1; ++i) {}
  for (var i = 0; i < 1; ++i) i;

break at:
function testForLoop() {
  for (var i = 0; i < 1; ++#i) {}
  for (var i = 0; i < 1; ++i) i;

break at:
function testForLoop() {
  for (var i = 0; i #< 1; ++i) {}
  for (var i = 0; i < 1; ++i) i;

break at:
  for (var i = 0; i < 1; ++i) {}
  for (var i = #0; i < 1; ++i) i;
  for (var i = 0; i < 0; ++i) {}

break at:
  for (var i = 0; i < 1; ++i) {}
  for (var i = 0; i #< 1; ++i) i;
  for (var i = 0; i < 0; ++i) {}

break at:
  for (var i = 0; i < 1; ++i) {}
  for (var i = 0; i < 1; ++#i) i;
  for (var i = 0; i < 0; ++i) {}

break at:
  for (var i = 0; i < 1; ++i) {}
  for (var i = 0; i #< 1; ++i) i;
  for (var i = 0; i < 0; ++i) {}

break at:
  for (var i = 0; i < 1; ++i) i;
  for (var i = #0; i < 0; ++i) {}
}

break at:
  for (var i = 0; i < 1; ++i) i;
  for (var i = 0; i #< 0; ++i) {}
}

break at:
  for (var i = 0; i < 0; ++i) {}
#}



Running test: testForOfLoop
break at:
function testForOfLoop() {
  for (var k of #[]) {}
  for (var k of [1]) k;

break at:
function testForOfLoop() {
  for (var #k of []) {}
  for (var k of [1]) k;

break at:
  for (var k of []) {}
  for (var k of #[1]) k;
  var a = [];

break at:
  for (var k of []) {}
  for (var #k of [1]) k;
  var a = [];

break at:
  for (var k of []) {}
  for (var k of [1]) #k;
  var a = [];

break at:
  for (var k of []) {}
  for (var #k of [1]) k;
  var a = [];

break at:
  for (var k of [1]) k;
  var a = #[];
  for (var k of a) {}

break at:
  var a = [];
  for (var k of #a) {}
}

break at:
  var a = [];
  for (var #k of a) {}
}

break at:
  for (var k of a) {}
#}



Running test: testForInLoop
break at:
function testForInLoop() {
  var o = #{};
  for (var k in o) {}

break at:
  var o = {};
  for (var k in #o) {}
  for (var k in o) k;

break at:
  var o = {};
  for (var #k in o) {}
  for (var k in o) k;

break at:
  for (var k in o) {}
  for (var k in #o) k;
  for (var k in { a:1 }) {}

break at:
  for (var k in o) {}
  for (var #k in o) k;
  for (var k in { a:1 }) {}

break at:
  for (var k in o) k;
  for (var k in #{ a:1 }) {}
  for (var k in { a:1 }) k;

break at:
  for (var k in o) k;
  for (var #k in { a:1 }) {}
  for (var k in { a:1 }) k;

break at:
  for (var k in { a:1 }) {}
  for (var k in #{ a:1 }) k;
}

break at:
  for (var k in { a:1 }) {}
  for (var #k in { a:1 }) k;
}

break at:
  for (var k in { a:1 }) {}
  for (var k in { a:1 }) #k;
}

break at:
  for (var k in { a:1 }) {}
  for (var #k in { a:1 }) k;
}

break at:
  for (var k in { a:1 }) k;
#}



Running test: testSimpleExpressions
break at:
  1 + 2 + 3;
  var a = #1;
  ++a;

break at:
  var a = 1;
  #++a;
  a--;

break at:
  ++a;
  #a--;
}

break at:
  a--;
#}



Running test: testGetter
break at:
function testGetter() {
  #getterFoo();
}

break at:
Object.defineProperty(this, 'getterFoo', {
  get: () => #return42
});

break at:
Object.defineProperty(this, 'getterFoo', {
  get: () => return42#
});

break at:
function testGetter() {
  #getterFoo();
}

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
  getterFoo();
#}



Running test: testChainedCalls
break at:
function testChainedCalls() {
  #obj.foo().boo()();
}

break at:
var obj = {
  foo: () => (#{
    boo: () => return42

break at:
    boo: () => return42
  })#
};

break at:
function testChainedCalls() {
  obj.foo().#boo()();
}

break at:
  foo: () => ({
    boo: () => #return42
  })

break at:
  foo: () => ({
    boo: () => return42#
  })

break at:
function testChainedCalls() {
  obj.foo().boo()#();
}

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
  obj.foo().boo()();
#}



Running test: testChainedWithNative
break at:
function testChainedWithNative() {
  #Array.from([1]).concat([2]).map(v => v * 2);
}

break at:
function testChainedWithNative() {
  Array.from([1]).concat([2]).map(v => v #* 2);
}

break at:
function testChainedWithNative() {
  Array.from([1]).concat([2]).map(v => v * 2#);
}

break at:
function testChainedWithNative() {
  Array.from([1]).concat([2]).map(v => v #* 2);
}

break at:
function testChainedWithNative() {
  Array.from([1]).concat([2]).map(v => v * 2#);
}

break at:
  Array.from([1]).concat([2]).map(v => v * 2);
#}



Running test: testPromiseThen
break at:
function testPromiseThen() {
  #return Promise.resolve().then(v => v * 2).then(v => v * 2);
}

break at:
function testPromiseThen() {
  return Promise.resolve().then(v => v * 2).then(v => v * 2);#
}


Running test: testSwitch
break at:
function testSwitch() {
  for (var i = #0; i < 3; ++i) {
    switch(i) {

break at:
function testSwitch() {
  for (var i = 0; i #< 3; ++i) {
    switch(i) {

break at:
  for (var i = 0; i < 3; ++i) {
    #switch(i) {
      case 0: continue;

break at:
    switch(i) {
      case 0: #continue;
      case 1: return42(); break;

break at:
function testSwitch() {
  for (var i = 0; i < 3; ++#i) {
    switch(i) {

break at:
function testSwitch() {
  for (var i = 0; i #< 3; ++i) {
    switch(i) {

break at:
  for (var i = 0; i < 3; ++i) {
    #switch(i) {
      case 0: continue;

break at:
      case 0: continue;
      case 1: #return42(); break;
      default: return;

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
      case 0: continue;
      case 1: return42(); #break;
      default: return;

break at:
function testSwitch() {
  for (var i = 0; i < 3; ++#i) {
    switch(i) {

break at:
function testSwitch() {
  for (var i = 0; i #< 3; ++i) {
    switch(i) {

break at:
  for (var i = 0; i < 3; ++i) {
    #switch(i) {
      case 0: continue;

break at:
      case 1: return42(); break;
      default: #return;
    }

break at:
      case 1: return42(); break;
      default: return;#
    }


Running test: testGenerator
break at:
function testGenerator() {
  var gen = #idMaker();
  return42();

break at:
  var gen = idMaker();
  #return42();
  gen.next().value;

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
  return42();
  gen.#next().value;
  debugger;

break at:
function* idMaker() {
  #yield 1;
  yield 2;

break at:
  gen.next().value;
  #debugger;
  gen.next().value;

break at:
  debugger;
  gen.#next().value;
  return42();

break at:
  yield 1;
  #yield 2;
  yield 3;

break at:
  yield 2;
  #yield 3;
}

break at:
  yield 3;
#}


break at:
  gen.next().value;
#}



Running test: testCaughtException
break at:
  try {
    #throwException()
  } catch (e) {

break at:
function throwException() {
  #throw new Error();
}

break at:
  } catch (e) {
    #return;
  }

break at:
  } catch (e) {
    return;#
  }


Running test: testClasses
break at:
  }
  #new Lion().speak();
}

break at:
    constructor(name) {
      #super(name);
    }

break at:
    constructor(name) {
      #this.name = name;
    }

break at:
      this.name = name;
    #}


break at:
      super(name);
    #}


break at:
  }
  new Lion().#speak();
}

break at:
    speak() {
      #super.speak();
    }

break at:
    speak() {
    #}
  }

break at:
      super.speak();
    #}
  }

break at:
  new Lion().speak();
#}



Running test: testAsyncAwait
break at:
async function testAsyncAwait() {
  #await asyncFoo();
  await awaitBoo();

break at:
async function asyncFoo() {
  #await Promise.resolve().then(v => v * 2);
  return42();

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
async function asyncBoo() {
  #await Promise.resolve();
}


Running test: testPromiseAsyncWithCode
break at:
  var nextTest;
  var testPromise = #new Promise(resolve => nextTest = resolve);
  async function main() {

break at:
  var nextTest;
  var testPromise = new Promise(resolve => nextTest #= resolve);
  async function main() {

break at:
  var nextTest;
  var testPromise = new Promise(resolve => nextTest = resolve#);
  async function main() {

break at:
  }
  #main();
  return testPromise;

break at:
    }
    #setTimeout(returnCall, 0);
    await foo();

break at:
    setTimeout(returnCall, 0);
    await #foo();
    await foo();

break at:
      var resolveNested;
      var p = #new Promise(resolve => resolveNested = resolve);
      setTimeout(resolveNested, 0);

break at:
      var resolveNested;
      var p = new Promise(resolve => resolveNested #= resolve);
      setTimeout(resolveNested, 0);

break at:
      var resolveNested;
      var p = new Promise(resolve => resolveNested = resolve#);
      setTimeout(resolveNested, 0);

break at:
      var p = new Promise(resolve => resolveNested = resolve);
      #setTimeout(resolveNested, 0);
      await p;

break at:
      setTimeout(resolveNested, 0);
      #await p;
    }

break at:
      var resolveNested;
      var p = #new Promise(resolve => resolveNested = resolve);
      setTimeout(resolveNested, 0);

break at:
      var resolveNested;
      var p = new Promise(resolve => resolveNested #= resolve);
      setTimeout(resolveNested, 0);

break at:
      var resolveNested;
      var p = new Promise(resolve => resolveNested = resolve#);
      setTimeout(resolveNested, 0);

break at:
      var p = new Promise(resolve => resolveNested = resolve);
      #setTimeout(resolveNested, 0);
      await p;

break at:
      setTimeout(resolveNested, 0);
      #await p;
    }


Running test: testPromiseComplex
break at:
  var nextTest;
  var testPromise = #new Promise(resolve => nextTest = resolve);
  async function main() {

break at:
  var nextTest;
  var testPromise = new Promise(resolve => nextTest #= resolve);
  async function main() {

break at:
  var nextTest;
  var testPromise = new Promise(resolve => nextTest = resolve#);
  async function main() {

break at:
  }
  #main();
  return testPromise;

break at:
    }
    var x = #1;
    var y = 2;

break at:
    var x = 1;
    var y = #2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 *a)(5));

break at:
    var y = 2;
    #returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 *a)(5));
    nextTest();

break at:

function emptyFunction() {#}


break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, #returnCall())().a = await foo((a => 2 *a)(5));
    nextTest();

break at:
function returnCall() {
  #return return42();
}

break at:
function return42() {
  #return 42;
}

break at:
function return42() {
  return 42;#
}

break at:
function returnCall() {
  return return42();#
}

break at:
    var y = 2;
    #returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 *a)(5));
    nextTest();

break at:
function returnFunction() {
  #return returnObject;
}

break at:
function returnFunction() {
  return returnObject;#
}

break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())#().a = await foo((a => 2 *a)(5));
    nextTest();

break at:
function returnObject() {
  #return ({ foo: () => 42 });
}

break at:
function returnObject() {
  return ({ foo: () => 42 });#
}

break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 *a)#(5));
    nextTest();

break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 #*a)(5));
    nextTest();

break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await foo((a => 2 *a#)(5));
    nextTest();

break at:
    var y = 2;
    returnFunction(emptyFunction(), x++, --y, x => 2 * x, returnCall())().a = await #foo((a => 2 *a)(5));
    nextTest();

break at:
    async function foo() {
      #await Promise.resolve();
      return 42;

