blob: 701a4f1c3f3688d63ee5fc7891aa4e48c1a04887 [file] [log] [blame]
// 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
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);
}