// Copyright (c) 2021, 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.

/// @assertion For an expression of the form e<typeArgs>, which is not followed
/// by an argument list (that would turn it into a generic function invocation),
/// the meaning of e<typeArgs> depends on the expression e:
/// ...
/// - If e denotes a generic instance method (e has the form r.name and r has a
/// static type for which name is a generic interface method), then e<typeArgs>
/// performs an explicitly instantiated method tear-off, which works just like
/// the current implicitly instantiated method tear-off except that the types
/// are provided instead of inferred.
///
/// @description Checks that if e denotes a generic instance method then then
/// e<typeArgs> performs an explicitly instantiated method tear-off
/// @author sgrekhov@unipro.ru

// SharedOptions=--enable-experiment=constructor-tearoffs

import "../../Utils/expect.dart";

class C {
  void foo1<X>(X x) {}
}

typedef CAlias = C;

main() {
  var c1 = C().foo1<int>;
  Expect.isFalse(c1 is Type);
  Expect.isTrue(c1 is void Function(int));
  Expect.runtimeIsNotType<Type>(c1);
  Expect.runtimeIsType<void Function(int)>(c1);

  var c2 = CAlias().foo1<String>;
  Expect.isFalse(c2 is Type);
  Expect.isTrue(c2 is void Function(String));
  Expect.runtimeIsNotType<Type>(c2);
  Expect.runtimeIsType<void Function(String)>(c2);
}
