// 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. // Tests extension method resolution type inference. import "package:expect/expect.dart"; void main() { List numList = []; // Inference of E1(numList), implicit or explicit, is the same as // for C1(numList), which infers `num`. var numListInstance1 = C1(numList); Expect.type>(numList.argList1); sameType(numListInstance1.argDynList1, numList.argDynList1); sameType(numListInstance1.selfList1, numList.selfList1); Expect.type>(E1(numList).argList1); sameType(numListInstance1.argDynList1, E1(numList).argDynList1); sameType(numListInstance1.selfList1, E1(numList).selfList1); var numListInstance2 = C2>(numList); Expect.type>>(numList.argList2); sameType(numListInstance2.argDynList2, numList.argDynList2); sameType(numListInstance2.selfList2, numList.selfList2); Expect.type>>(E2(numList).argList2); sameType(numListInstance2.argDynList2, E2(numList).argDynList2); sameType(numListInstance2.selfList2, E2(numList).selfList2); Pair pair = Pair(1, 2.5); var pairInstance3 = C3(pair); Expect.type>(pair.argList3); Expect.type>(pair.arg2List3); sameType(pairInstance3.argDynList3, pair.argDynList3); sameType(pairInstance3.arg2DynList3, pair.arg2DynList3); sameType(pairInstance3.selfList3, pair.selfList3); Expect.type>(E3(pair).argList3); Expect.type>(E3(pair).arg2List3); sameType(pairInstance3.argDynList3, E3(pair).argDynList3); sameType(pairInstance3.arg2DynList3, E3(pair).arg2DynList3); sameType(pairInstance3.selfList3, E3(pair).selfList3); var pairInstance4 = C4(pair); Expect.type>(pair.argList4); sameType(pairInstance4.argDynList4, pair.argDynList4); sameType(pairInstance4.selfList4, pair.selfList4); Expect.type>(E4(pair).argList4); sameType(pairInstance4.argDynList4, E4(pair).argDynList4); sameType(pairInstance4.selfList4, E4(pair).selfList4); List intList = [1]; var intListInstance5 = C5(intList); Expect.type>(intList.argList5); sameType(intListInstance5.argDynList5, intList.argDynList5); sameType(intListInstance5.selfList5, intList.selfList5); Expect.type>(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 on List { List get argList1 => []; List get argDynList1 => []; List get selfList1 { var result = [this]; return result; } } class C1 { List self; C1(this.self); List get argList1 => []; List get argDynList1 => []; List get selfList1 { var result = [self]; return result; } } extension E2 on T { List get argList2 => []; List get argDynList2 => []; List get selfList2 { var result = [this]; return result; } } class C2 { T self; C2(this.self); List get argList2 => []; List get argDynList2 => []; List get selfList2 { var result = [self]; return result; } } extension E3 on Pair { List get argList3 => []; List get argDynList3 => []; List get arg2List3 => []; List get arg2DynList3 => []; List get selfList3 { var result = [this]; return result; } } class C3 { Pair self; C3(this.self); List get argList3 => []; List get argDynList3 => []; List get arg2List3 => []; List get arg2DynList3 => []; List get selfList3 { var result = [self]; return result; } } extension E4 on Pair { List get argList4 => []; List get argDynList4 => []; List get selfList4 { var result = [this]; return result; } } class C4 { Pair self; C4(this.self); List get argList4 => []; List get argDynList4 => []; List get selfList4 { var result = [self]; return result; } } extension E5 on List { List get argList5 => []; List get argDynList5 => []; List get selfList5 { var result = [this]; return result; } } class C5 { List self; C5(this.self); List get argList5 => []; List get argDynList5 => []; List get selfList5 { var result = [self]; return result; } } class Pair { final A first; final B second; Pair(this.first, this.second); }