Checks possible break locations.

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

break at:
// comment onl#y

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:
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;

