|  | // Copyright (c) 2017, 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.9 | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | void foo(F f<F>(F f)) {} | 
|  |  | 
|  | B bar<B>(B g<F>(F f)) => null; | 
|  |  | 
|  | Function baz<B>() { | 
|  | B foo<F>(B b, F f) => null; | 
|  | return foo; | 
|  | } | 
|  |  | 
|  | class C<T> { | 
|  | void foo(F f<F>(T t, F f)) => null; | 
|  | B bar<B>(B g<F>(T t, F f)) => null; | 
|  | Function baz<B>() { | 
|  | B foo<F>(T t, F f) => null; | 
|  | return foo; | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | // Check the run-time type of the functions with generic parameters. | 
|  |  | 
|  | Expect.type<void Function(X Function<X>(X))>(foo); | 
|  |  | 
|  | Expect.isTrue(bar is X1 Function<X1>(X1 Function<X2>(X2))); | 
|  |  | 
|  | Expect.isTrue(baz<int>() is int Function<X1>(int, X1)); | 
|  | Expect.isTrue(baz<Object>() is Object Function<X1>(Object, X1)); | 
|  | Expect.isTrue(baz<Null>() is Null Function<X1>(Null, X1)); | 
|  |  | 
|  | void testC<T>() { | 
|  | var c = new C<T>(); | 
|  |  | 
|  | Expect.type<void Function(F Function<F>(T, F))>(c.foo); | 
|  |  | 
|  | Expect.isTrue(c.bar is X1 Function<X1>(X1 Function<X2>(T, X2))); | 
|  |  | 
|  | Expect.isTrue(c.baz<int>() is int Function<X1>(T, X1)); | 
|  | } | 
|  |  | 
|  | testC<bool>(); | 
|  | testC<Object>(); | 
|  | testC<Null>(); | 
|  | } |