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

// SharedOptions=--enable-experiment=extension-methods

// 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 = [this];
    return result;
  }
}

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