// 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

// Tests extension declaration syntax combinations.

import "package:expect/expect.dart";

void checkStaticType<T>(T x) {
  Expect.type<T>(x);
}

main() {
  Object object = <int>[];
  List<Object> list = <int>[];
  List<num> numList = <int>[];
  Pair<int, double> numPair = Pair(1, 2.5);
  RecSolution recs = RecSolution();

  Expect.equals(0, object.e0);
  Expect.equals(0, list.e0);

  Expect.equals(1, object.e1);
  Expect.equals(1, list.e1);

  Expect.equals(0, object.e4);
  Expect.equals(0, list.e4);
  Expect.equals(4, numList.e4);

  Expect.equals(0, object.e5);
  Expect.equals(0, list.e5);
  Expect.equals(5, numList.e5);

  Expect.equals(0, object.e6);
  Expect.equals(6, list.e6);
  Expect.equals(6, numList.e6);
  checkStaticType<List<num>>(numList.list6);

  Expect.equals(0, object.e7);
  Expect.equals(7, list.e7);
  Expect.equals(7, numList.e7);
  checkStaticType<List<num>>(numList.list7);

  Expect.equals(10, object.e10);
  Expect.equals(10, numList.e10);
  checkStaticType<List<Object>>(object.list10);
  checkStaticType<List<List<num>>>(numList.list10);

  Expect.equals(11, object.e11);
  Expect.equals(11, numList.e11);
  checkStaticType<List<Object>>(object.list11);
  checkStaticType<List<List<num>>>(numList.list11);

  Expect.equals(0, object.e14);
  Expect.equals(14, numPair.e14);
  Expect.type<List<num>>(numPair.list14);
  checkStaticType<List<num>>(numPair.list14);

  Expect.equals(0, object.e16);
  Expect.equals(16, numPair.e16);
  Expect.type<Map<int, double>>(numPair.map16);
  checkStaticType<Map<int, double>>(numPair.map16);

  Expect.equals(0, object.e17);
  Expect.equals(0, list.e17);
  Expect.equals(17, numList.e17);
  Expect.type<List<num>>(numList.list17);
  checkStaticType<List<num>>(numList.list17);

  Expect.equals(0, object.e19);
  Expect.equals(19, recs.e19);
  Expect.type<List<RecSolution>>(recs.list19);
  checkStaticType<List<RecSolution>>(recs.list19);

  Expect.equals(0, object.e20);
  Expect.equals(20, recs.e20);
  Expect.type<List<RecSolution>>(recs.list20);
  checkStaticType<List<RecSolution>>(recs.list20);
}

extension on Object {
  int get e0 => 0;
  // Fallbacks to test cases where other extensions do not apply.
  int get e4 => 0;
  int get e5 => 0;
  int get e6 => 0;
  int get e7 => 0;
  int get e14 => 0;
  int get e16 => 0;
  int get e17 => 0;
  int get e19 => 0;
  int get e20 => 0;
}

extension E1 on Object {
  int get e1 => 1;
}

extension on List<num> {
  int get e4 => 4;
}

extension E5 on List<num> {
  int get e5 => 5;
}

extension<T> on List<T> {
  int get e6 => 6;
  List<T> get list6 => <T>[];
}

extension E7<T> on List<T> {
  int get e7 => 7;
  List<T> get list7 => <T>[];
}

extension<T> on T {
  int get e10 => 10;
  List<T> get list10 => <T>[];
}

extension E11<T> on T {
  int get e11 => 11;
  List<T> get list11 => <T>[];
}

extension<T> on Pair<T, T> {
  int get e14 => 14;
  List<T> get list14 => <T>[];
}

extension E16<S, T> on Pair<S, T> {
  int get e16 => 16;
  Map<S, T> get map16 => <S, T>{};
}

extension<T extends num> on List<T> {
  int get e17 => 17;
  List<T> get list17 => <T>[];
}

extension<T extends Rec<T>> on T {
  int get e19 => 19;
  List<T> get list19 => <T>[];
}

extension E20<T extends Rec<T>> on T {
  int get e20 => 20;
  List<T> get list20 => <T>[];
}

class Pair<A, B> {
  final A first;
  final B second;
  const Pair(this.first, this.second);
}

class Rec<T extends Rec<T>> {}

class RecSolution extends Rec<RecSolution> {}
