// 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 method resolution type inference.

import "package:expect/expect.dart";

void main() {
  List<num> numList = <int>[];
  // Inference of E1(numList), implicit or explicit, is the same as
  // for C1(numList), which infers `num`.
  var numListInstance1 = C1<num>(numList);

  Expect.type<List<num>>(numList.argList1);
  sameType(numListInstance1.argDynList1, numList.argDynList1);
  sameType(numListInstance1.selfList1, numList.selfList1);

  Expect.type<List<num>>(E1(numList).argList1);
  sameType(numListInstance1.argDynList1, E1(numList).argDynList1);
  sameType(numListInstance1.selfList1, E1(numList).selfList1);

  var numListInstance2 = C2<List<num>>(numList);

  Expect.type<List<List<num>>>(numList.argList2);
  sameType(numListInstance2.argDynList2, numList.argDynList2);
  sameType(numListInstance2.selfList2, numList.selfList2);

  Expect.type<List<List<num>>>(E2(numList).argList2);
  sameType(numListInstance2.argDynList2, E2(numList).argDynList2);
  sameType(numListInstance2.selfList2, E2(numList).selfList2);

  Pair<int, double> pair = Pair(1, 2.5);
  var pairInstance3 = C3<int, double>(pair);

  Expect.type<List<int>>(pair.argList3);
  Expect.type<List<double>>(pair.arg2List3);
  sameType(pairInstance3.argDynList3, pair.argDynList3);
  sameType(pairInstance3.arg2DynList3, pair.arg2DynList3);
  sameType(pairInstance3.selfList3, pair.selfList3);

  Expect.type<List<int>>(E3(pair).argList3);
  Expect.type<List<double>>(E3(pair).arg2List3);
  sameType(pairInstance3.argDynList3, E3(pair).argDynList3);
  sameType(pairInstance3.arg2DynList3, E3(pair).arg2DynList3);
  sameType(pairInstance3.selfList3, E3(pair).selfList3);

  var pairInstance4 = C4<num>(pair);

  Expect.type<List<num>>(pair.argList4);
  sameType(pairInstance4.argDynList4, pair.argDynList4);
  sameType(pairInstance4.selfList4, pair.selfList4);

  Expect.type<List<num>>(E4(pair).argList4);
  sameType(pairInstance4.argDynList4, E4(pair).argDynList4);
  sameType(pairInstance4.selfList4, E4(pair).selfList4);

  List<int> intList = <int>[1];
  var intListInstance5 = C5<int>(intList);

  Expect.type<List<int>>(intList.argList5);
  sameType(intListInstance5.argDynList5, intList.argDynList5);
  sameType(intListInstance5.selfList5, intList.selfList5);

  Expect.type<List<int>>(E5(intList).argList5);
  sameType(intListInstance5.argDynList5, E5(intList).argDynList5);
  sameType(intListInstance5.selfList5, E5(intList).selfList5);
}

void sameType(o1, o2) {
  Expect.equals(o1.runtimeType, o2.runtimeType);
}

extension E1<T> on List<T> {
  List<T> get argList1 => <T>[];
  List<Object> get argDynList1 => <T>[];
  List<Object> get selfList1 {
    var result = [this];
    return result;
  }
}

class C1<T> {
  List<T> self;
  C1(this.self);
  List<T> get argList1 => <T>[];
  List<Object> get argDynList1 => <T>[];
  List<Object> get selfList1 {
    var result = [self];
    return result;
  }
}

extension E2<T> on T {
  List<T> get argList2 => <T>[];
  List<Object> get argDynList2 => <T>[];
  List<Object> get selfList2 {
    var result = [this];
    return result;
  }
}

class C2<T> {
  T self;
  C2(this.self);
  List<T> get argList2 => <T>[];
  List<Object> get argDynList2 => <T>[];
  List<Object> get selfList2 {
    var result = [self];
    return result;
  }
}

extension E3<S, T> on Pair<T, S> {
  List<T> get argList3 => <T>[];
  List<Object> get argDynList3 => <T>[];
  List<S> get arg2List3 => <S>[];
  List<Object> get arg2DynList3 => <S>[];
  List<Object> get selfList3 {
    var result = [this];
    return result;
  }
}

class C3<T, S> {
  Pair<T, S> self;
  C3(this.self);
  List<T> get argList3 => <T>[];
  List<Object> get argDynList3 => <T>[];
  List<S> get arg2List3 => <S>[];
  List<Object> get arg2DynList3 => <S>[];
  List<Object> get selfList3 {
    var result = [self];
    return result;
  }
}

extension E4<T> on Pair<T, T> {
  List<T> get argList4 => <T>[];
  List<Object> get argDynList4 => <T>[];
  List<Object> get selfList4 {
    var result = [this];
    return result;
  }
}

class C4<T> {
  Pair<T, T> self;
  C4(this.self);
  List<T> get argList4 => <T>[];
  List<Object> get argDynList4 => <T>[];
  List<Object> get selfList4 {
    var result = [self];
    return result;
  }
}

extension E5<T extends num> on List<T> {
  List<T> get argList5 => <T>[];
  List<Object> get argDynList5 => <T>[];
  List<Object> get selfList5 {
    var result = [this];
    return result;
  }
}

class C5<T extends num> {
  List<T> self;
  C5(this.self);
  List<T> get argList5 => <T>[];
  List<Object> get argDynList5 => <T>[];
  List<Object> get selfList5 {
    var result = [self];
    return result;
  }
}

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