// 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.

// @dart = 2.7

main() {
  directCall();
  indirectCall();
  instanceTearOff();
  localCall();
  instantiatedCall();
}

/*member: _directCall:apply*/
_directCall() {}

/*member: directCall:*/
void directCall() {
  Function.apply(_directCall, []);
}

/*member: _indirectCall:apply*/
_indirectCall() {}

/*member: _indirectCallHelper:*/
_indirectCallHelper(f) => Function.apply(f, []);

/*member: indirectCall:*/
void indirectCall() {
  _indirectCallHelper(_indirectCall);
}

/*member: Class.:*/
class Class {
  /*member: Class.instanceTearOff1:apply*/
  instanceTearOff1() {}

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

/*member: _instanceTearOffHelper:*/
_instanceTearOffHelper(f) => Function.apply(f, []);

instanceTearOff() {
  var c = Class();
  _instanceTearOffHelper(c.instanceTearOff1);
  return c.instanceTearOff2;
}

localCall() {
  /*apply*/ local1() {}
  local2() {}
  local3() {}

  Function.apply(local1, []);
  local2();
  return local3;
}

instantiatedCall() {
  /*apply*/ local1<T>(T t) {}
  local2<T>(T t) {}
  local3<T>(T t) {}

  Function(int) f1 = local1;
  Function(int) f2 = local2;
  Function(int) f3 = local3;

  Function.apply(f1, [0]);
  f2(0);
  return f3;
}
