// 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.
// @dart=2.9
// Testing that i2b and checks for correct super-boundedness are applied
// to type arguments, taking the variance of type parameters into account.

// Standard type comparison support.

typedef F<X> = void Function<Y extends X>();
F<X> toF<X>(X x) => null;

// Material specific to this test.

typedef Fcov<X> = X Function();
typedef Fcon<X> = Function(X);
typedef Finv<X> = X Function(X);

class Acov<X extends Fcov<Y>, Y> {}

class Acon<X extends Fcon<Y>, Y> {}

class Ainv<X extends Finv<Y>, Y> {}

typedef FcovBound<X extends num> = X Function();
typedef FconBound<X extends num> = Function(X);
typedef FinvBound<X extends num> = X Function(X);

class AcovBound<X extends FcovBound<Y>, Y extends num> {}

class AconBound<X extends FconBound<Y>, Y extends num> {}

class AinvBound<X extends FinvBound<Y>, Y extends num> {}

class A<X> {}

typedef FcovCyclicBound<X extends A<X>> = X Function();
typedef FconCyclicBound<X extends A<X>> = Function(X);
typedef FinvCyclicBound<X extends A<X>> = X Function(X);

class AcovCyclicBound<X extends FcovCyclicBound<Y>, Y extends A<Y>> {}

class AconCyclicBound<X extends FconCyclicBound<Y>, Y extends A<Y>> {}

class AinvCyclicBound<X extends FinvCyclicBound<Y>, Y extends A<Y>> {}

typedef FcovCyclicCoBound<X extends Function(X)> = X Function();
typedef FconCyclicCoBound<X extends Function(X)> = Function(X);
typedef FinvCyclicCoBound<X extends Function(X)> = X Function(X);

class AcovCyclicCoBound<X extends FcovCyclicCoBound<Y>, Y extends Function(Y)> {
}

class AconCyclicCoBound<X extends FconCyclicCoBound<Y>, Y extends Function(Y)> {
}

class AinvCyclicCoBound<X extends FinvCyclicCoBound<Y>, Y extends Function(Y)> {
}

class B<X> {}

void testTypeAliasAsTypeArgument() {
  // I2b: Use bounds (Fcov<Y>, dynamic), then replace covariant occurrence
  // (of `Y` in `Acov<Fcov<Y>, _>`) by `Y`s value `dynamic`. Resulting type
  // `Acov<Fcov<dynamic>, dynamic>` is regular-bounded.
  Acov source1;
  var fsource1 = toF(source1);
  F<Acov<Fcov<dynamic>, dynamic>> target1 = fsource1;

  // I2b: Use bounds (Fcon<Y>, dynamic), then replace contravariant occurrence
  // (of `Y` in `Acon<Fcon<Y>, _>`) by `Null`. Resulting type
  // is super-bounded: Acon<Fcon<Object>, Null> is regular-bounded.
  Acon source2;
  var fsource2 = toF(source2);
  F<Acon<Fcon<Null>, dynamic>> target2 = fsource2;

  // I2b: Use bounds (Finv<Y>, dynamic) then replace invariant occurrence
  // (of `Y` in `Ainv<Finv<Y>, _>`) by `Y`s value `dynamic`. Resulting type
  // `Ainv<Finv<dynamic>, dynamic>` is regular-bounded.
  Ainv source3;
  var fsource3 = toF(source3);
  F<Ainv<Finv<dynamic>, dynamic>> target3 = fsource3;

  // I2b: Use bounds (FcovBound<Y>, num), then replace covariant occurrence
  // (of `Y` in `AcovBound<FcovBound<Y>, _>`) by `Y`s value `num`.
  // Resulting type `AcovBound<FcovBound<num>, num>` is regular-bounded.
  AcovBound source4;
  var fsource4 = toF(source4);
  F<AcovBound<FcovBound<num>, num>> target4 = fsource4;

  // I2b: Use bounds (FconBound<Y>, num), then replace contravariant occurrence
  // of `Y` in `AconBound<FconBound<Y>, _>` by `Null`. Resulting type is
  // super-bounded: AconBound<FconBound<Object>, num> is regular-bounded.
  AconBound source5;
  var fsource5 = toF(source5);
  F<AconBound<FconBound<Null>, num>> target5 = fsource5;

  // I2b: Use bounds (FinvBound<Y>, num), then replace invariant occurrence
  // of `Y` in `AinvBound<FinvBound<Y>, _>` by `Y`s value `num`. Resulting
  // type `AinvBound<FinvBound<num>, num>` is regular-bounded.
  AinvBound source6;
  var fsource6 = toF(source6);
  F<AinvBound<FinvBound<num>, num>> target6 = fsource6;

  // I2b: Use bounds (FcovCyclicBound<Y>, A<Y>), then break cycle {Y} by
  // replacing covariant occurrence of `Y` in `AcovCyclicBound<_, A<Y>>`
  // by `dynamic`; then replace covariant occurrence of `Y` in
  // `AcovCyclicBound<FcovCyclicBound<Y>, _>` by `Y`s value `A<dynamic>`.
  // Resulting type `AcovCyclicBound<FcovCyclicBound<A<dynamic>>, A<dynamic>>>`
  // is regular-bounded.
  AcovCyclicBound source7;
  var fsource7 = toF(source7);
  F<AcovCyclicBound<FcovCyclicBound<A<dynamic>>, A<dynamic>>> target7 =
      fsource7;

  // I2b: Use bounds (FconCyclicBound<Y>, A<Y>), then break cycle {Y} by
  // replacing covariant occurrence of `Y` in `AconCyclicBound<_, A<Y>>`
  // by `dynamic`; then replace contravariant occurrence of `Y` in
  // `AconCyclicBound<FconCyclicBound<Y>, _>` by `Null`.
  // Resulting type `AconCyclicBound<FconCyclicBound<Null>, A<dynamic>>>` is
  // super-bounded because `AconCyclicBound<FconCyclicBound<Object>, A<Null>>>`
  // is regular-bounded.
  AconCyclicBound source8;
  var fsource8 = toF(source8);
  F<AconCyclicBound<FconCyclicBound<Null>, A<dynamic>>> target8 = fsource8;

  // I2b: Use bounds (FinvCyclicBound<Y>, A<Y>), then break cycle {Y} by
  // replacing covariant occurrence of `Y` in `AinvCyclicBound<_, A<Y>>`
  // by `dynamic`; then replace invariant occurrence of `Y` in
  // `AinvCyclicBound<FinvCyclicBound<Y>, _>` by `Y`s value `A<dynamic>`.
  // Resulting type `AinvCyclicBound<FinvCyclicBound<A<dynamic>>, A<dynamic>>>`
  // looks regular-bounded, but contains `FinvCyclicBound<A<dynamic>>` which
  // is not well-bounded.
  AinvCyclicBound source9; //# 01: compile-time error
  // var fsource9 = toF(source9);
  // F<AinvCyclicBound<FinvCyclicBound<A<dynamic>>, A<dynamic>>> target9 =
  //     fsource9;

  // I2b: Use bounds (FcovCyclicCoBound<Y>, Function(Y)), then break cycle {Y}
  // by replacing contravariant occurrence of `Y` in
  // `AcovCyclicCoBound<_, Function(Y)>` by `Null`; then replace covariant
  // occurrence of `Y` in `AcovCyclicCoBound<FcovCyclicCoBound<Y>, _>` by `Y`s
  // value `Function(Null)`. Resulting type
  // `AcovCyclicCoBound<FcovCyclicCoBound<Function(Null)>, Function(Null)>`
  // is regular-bounded, with subterm `FcovCyclicCoBound<Function(Null)>` which
  // is super-bounded because `FcovCyclicCoBound<Function(Object)>` is
  // regular-bounded.
  AcovCyclicCoBound source10;
  var fsource10 = toF(source10);
  F<AcovCyclicCoBound<FcovCyclicCoBound<Function(Null)>, Function(Null)>>
      target10 = fsource10;

  // I2b: Use bounds (FconCyclicCoBound<Y>, Function(Y)), then break cycle {Y}
  // by replacing contravariant occurrence of `Y` in
  // `AconCyclicCoBound<_, Function(Y)>` by `Null`; then replace contravariant
  // occurrence of `Y` in `AconCyclicCoBound<FconCyclicCoBound<Y>, _>` by
  // `Null`. Resulting type
  // `AconCyclicCoBound<FconCyclicCoBound<Null>, Function(Null)>` is
  // super-bounded because
  // `AconCyclicCoBound<FconCyclicCoBound<Object>, Function(Object)>` is
  // regular-bounded.
  AconCyclicCoBound source11;
  var fsource11 = toF(source11);
  F<AconCyclicCoBound<FconCyclicCoBound<Null>, Function(Null)>> target11 =
      fsource11;

  // I2b: Use bounds (FinvCyclicCoBound<Y>, Function(Y)), then break cycle {Y}
  // by replacing contravariant occurrence of `Y` in
  // `AinvCyclicCoBound<_, Function(Y)>` by `Null`; then replace invariant
  // occurrence of `Y` in `AinvCyclicCoBound<FinvCyclicCoBound<Y>, _>` by `Y`s
  // value `Function(Null)`.
  // Resulting type
  // `AinvCyclicCoBound<FinvCyclicCoBound<Function(Null)>, Function(Null)>>`
  // looks regular-bounded, but contains `FinvCyclicCoBound<Function(Null)>`
  // which is not well-bounded.
  AinvCyclicCoBound source12; //# 02: compile-time error
  // var fsource12 = toF(source12);
  // F<AinvCyclicCoBound<FinvCyclicCoBound<Function(Null)>, Function(Null)>>
  //     target12 = fsource12;
}

void testNested() {
  // Everything gets the same treatment when the cases from `testTopLevel`
  // are duplicated at the nested level in a covariant position.

  B<Acov> source1;
  var fsource1 = toF(source1);
  F<B<Acov<Fcov<dynamic>, dynamic>>> target1 = fsource1;

  B<Acon> source2;
  var fsource2 = toF(source2);
  F<B<Acon<Fcon<Null>, dynamic>>> target2 = fsource2;

  B<Ainv> source3;
  var fsource3 = toF(source3);
  F<B<Ainv<Finv<dynamic>, dynamic>>> target3 = fsource3;

  B<AcovBound> source4;
  var fsource4 = toF(source4);
  F<B<AcovBound<FcovBound<num>, num>>> target4 = fsource4;

  B<AconBound> source5;
  var fsource5 = toF(source5);
  F<B<AconBound<FconBound<Null>, num>>> target5 = fsource5;

  B<AinvBound> source6;
  var fsource6 = toF(source6);
  F<B<AinvBound<FinvBound<num>, num>>> target6 = fsource6;

  B<AcovCyclicBound> source7;
  var fsource7 = toF(source7);
  F<B<AcovCyclicBound<FcovCyclicBound<A<dynamic>>, A<dynamic>>>> target7 =
      fsource7;

  B<AconCyclicBound> source8;
  var fsource8 = toF(source8);
  F<B<AconCyclicBound<FconCyclicBound<Null>, A<dynamic>>>> target8 = fsource8;

  B<AinvCyclicBound> source9; //# 03: compile-time error
  // var fsource9 = toF(source9);
  // F<B<AinvCyclicBound<FinvCyclicBound<A<dynamic>>, A<dynamic>>>> target9 =
  //    fsource9;

  B<AcovCyclicCoBound> source10;
  var fsource10 = toF(source10);
  F<B<AcovCyclicCoBound<FcovCyclicCoBound<Function(Null)>, Function(Null)>>>
      target10 = fsource10;

  B<AconCyclicCoBound> source11;
  var fsource11 = toF(source11);
  F<B<AconCyclicCoBound<FconCyclicCoBound<Null>, Function(Null)>>> target11 =
      fsource11;

  B<AinvCyclicCoBound> source12; //# 04: compile-time error
  // var fsource12 = toF(source12);
  // F<B<AinvCyclicCoBound<FinvCyclicCoBound<Function(Null)>, Function(Null)>>>
  //     target12 = fsource12;
}

main() {
  testTypeAliasAsTypeArgument();
  testNested();
}
