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

T method1<T>(T t) => t;
Map<T, S> method2<T, S>(T t, S s) => {t: s};

const function0 = /*cfe.Function(method1)*/ method1;

const int Function(int) instantiation0 =
    /*cfe.Instantiation(method1<int>)*/ method1;

const Map<String, int> Function(String, int) instantiation1 =
    /*cfe.Instantiation(method2<String,int>)*/ method2;

main() {
  print(
      /*cfe|dart2js.Function(method1)*/
      /*analyzer.Function(method1,type=T Function<T>(T))*/
      function0);
  print(
      /*cfe.Instantiation(method1<int>)*/
      /*dart2js.Instantiation(method1<int*>)*/
      /*analyzer.Function(method1,type=int Function(int))*/
      instantiation0);
  print(
      /*cfe.Instantiation(method2<String,int>)*/
      /*dart2js.Instantiation(method2<String*,int*>)*/
      /*analyzer.Function(method2,type=Map<String, int> Function(String, int))*/
      instantiation1);
}
