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

extension Foo<U> on List {
  static U foo1() {
    throw '';
  }

  static List<U> foo1Prime() {
    throw '';
  }

  static void foo2(U x) {}

  static void foo2Prime(List<U> x) {}

  static void foo3() {
    U foo4;
    List<U> foo4Prime;
    void foo5(U y) => print(y);
    void foo5Prime(List<U> y) => print(y);
    U foo6() => throw '';
    List<U> foo6Prime() => throw '';
    void Function(U y) foo7 = (U y) => y;
    void Function(List<U> y) foo7Prime = (List<U> y) => y;
  }

  static U Function() foo8() {
    throw '';
  }

  static List<U> Function() foo8Prime() {
    throw '';
  }

  static void Function(U) foo9() {}

  static void Function(List<U>) foo9Prime() {}

  static void foo10(U Function()) {}

  static void foo10Prime(List<U> Function()) {}

  // old syntax: variable named "U" of a function called 'Function'.
  static void foo11(void Function(U)) {}

  static void foo12(void Function(U) b) {}

  static void foo12Prime(void Function(List<U>) b) {}

  // old syntax: variable named "b" of type "U" of a function called 'Function'.
  static void foo13(void Function(U b)) {}

  // old syntax: variable named "b" of type "List<U>" of a function called 'Function'.
  static void foo13Prime(void Function(List<U> b)) {}

  static late U foo14;
  static late List<U> foo14Prime;
  static late U Function(U) foo15;
  static late List<U> Function(List<U>) foo15Prime;
}

main() {}
