// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

main() {
  staticCalledInForLoop();
  staticCalledInForInLoop();
  staticCalledInWhileLoop();
  staticCalledInDoLoop();
  instanceCalledInForLoop();
  staticCalledIndirectlyInForLoop();
}

/*member: _staticCalledInForLoop:loop*/
_staticCalledInForLoop() {}

/*member: _staticNotCalledInForLoop:*/
_staticNotCalledInForLoop() {}

/*member: staticCalledInForLoop:*/
staticCalledInForLoop() {
  _staticNotCalledInForLoop();
  for (int i = 0; i < 10; i++) {
    _staticCalledInForLoop();
  }
  _staticNotCalledInForLoop();
}

/*member: _staticCalledInForInLoop:loop*/
_staticCalledInForInLoop() {}

/*member: _staticNotCalledInForInLoop:*/
_staticNotCalledInForInLoop() {}

/*member: staticCalledInForInLoop:*/
staticCalledInForInLoop() {
  _staticNotCalledInForInLoop();
  // ignore: unused_local_variable
  for (int i in [1, 2, 3]) {
    _staticCalledInForInLoop();
  }
  _staticNotCalledInForInLoop();
}

/*member: _staticCalledInWhileLoop:loop*/
_staticCalledInWhileLoop() {}

/*member: _staticNotCalledInWhileLoop:*/
_staticNotCalledInWhileLoop() {}

/*member: staticCalledInWhileLoop:*/
staticCalledInWhileLoop() {
  int i = 0;
  _staticNotCalledInWhileLoop();
  while (i < 10) {
    _staticCalledInWhileLoop();
    i++;
  }
  _staticNotCalledInWhileLoop();
}

/*member: _staticCalledInDoLoop:loop*/
_staticCalledInDoLoop() {}

/*member: _staticNotCalledInDoLoop:*/
_staticNotCalledInDoLoop() {}

/*member: staticCalledInDoLoop:*/
staticCalledInDoLoop() {
  int i = 0;
  _staticNotCalledInDoLoop();
  do {
    _staticCalledInDoLoop();
    i++;
  } while (i <= 10);
  _staticNotCalledInDoLoop();
}

class Class {
  /*member: Class.constructorCalledInForLoop:loop*/
  Class.constructorCalledInForLoop();

  /*member: Class.constructorNotCalledInForLoop:*/
  Class.constructorNotCalledInForLoop();

  // TODO(johnniwinther): Should we track instance calls in loops?
  /*member: Class.instanceCalledInForLoop:*/
  instanceCalledInForLoop() {}

  /*member: Class.instanceNotCalledInForLoop:*/
  instanceNotCalledInForLoop() {}
}

/*member: instanceCalledInForLoop:*/
instanceCalledInForLoop() {
  var c = new Class.constructorNotCalledInForLoop();
  c.instanceNotCalledInForLoop();
  for (int i = 0; i < 10; i++) {
    new Class.constructorCalledInForLoop();
    c.instanceCalledInForLoop();
  }
  c.instanceNotCalledInForLoop();
}

// TODO(johnniwinther): Should we track indirect calls in loops?
/*member: _staticCalledIndirectlyInForLoop:*/
_staticCalledIndirectlyInForLoop() {}

/*member: _staticCalledIndirectlyInForLoopHelper:loop*/
_staticCalledIndirectlyInForLoopHelper() => _staticCalledIndirectlyInForLoop();

/*member: staticCalledIndirectlyInForLoop:*/
staticCalledIndirectlyInForLoop() {
  for (int i = 0; i < 10; i++) {
    _staticCalledIndirectlyInForLoopHelper();
  }
}
