blob: 63426c2a1ed6ff3ec9c12fd96a618e3b6fcbce87 [file] [log] [blame]
// 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);
}