@@ -14,6 +14,7 @@ import 'package:analyzer/error/listener.dart';
1414import 'package:analyzer/src/dart/ast/token.dart' show KeywordToken;
1515import 'package:analyzer/src/dart/element/member.dart' ;
1616import 'package:analyzer/src/dart/element/type.dart' ;
17+ import 'package:analyzer/src/dart/resolver/variance.dart' ;
1718import 'package:analyzer/src/error/codes.dart' ;
1819import 'package:analyzer/src/generated/engine.dart' ;
1920import 'package:analyzer/src/generated/resolver.dart' ;
@@ -1948,6 +1949,137 @@ class GreatestLowerBoundTest extends BoundTestBase {
19481949 _checkGreatestLowerBound (listOfIntType, listOfIntType, listOfIntType);
19491950 }
19501951
1952+ void test_typeParameters_covariant_same () {
1953+ // class A<out T>
1954+ var T = typeParameter ('T' , variance: Variance .covariant );
1955+ var A = class_ (name: 'A' , typeParameters: [T ]);
1956+
1957+ // A<num>
1958+ var aNum = interfaceType (A , typeArguments: [numType]);
1959+
1960+ _checkLeastUpperBound (aNum, aNum, aNum);
1961+ }
1962+
1963+ void test_typeParameters_covariant_different () {
1964+ // class A<out T>
1965+ var T = typeParameter ('T' , variance: Variance .covariant );
1966+ var A = class_ (name: 'A' , typeParameters: [T ]);
1967+
1968+ // A<num>
1969+ // A<int>
1970+ var aNum = interfaceType (A , typeArguments: [numType]);
1971+ var aInt = interfaceType (A , typeArguments: [intType]);
1972+
1973+ _checkLeastUpperBound (aInt, aNum, aNum);
1974+ }
1975+
1976+ void test_typeParameters_contravariant_same () {
1977+ // class A<in T>
1978+ var T = typeParameter ('T' , variance: Variance .contravariant);
1979+ var A = class_ (name: 'A' , typeParameters: [T ]);
1980+
1981+ // A<num>
1982+ var aNum = interfaceType (A , typeArguments: [numType]);
1983+
1984+ _checkLeastUpperBound (aNum, aNum, aNum);
1985+ }
1986+
1987+ void test_typeParameters_contravariant_different () {
1988+ // class A<in T>
1989+ var T = typeParameter ('T' , variance: Variance .contravariant);
1990+ var A = class_ (name: 'A' , typeParameters: [T ]);
1991+
1992+ // A<num>
1993+ // A<int>
1994+ var aNum = interfaceType (A , typeArguments: [numType]);
1995+ var aInt = interfaceType (A , typeArguments: [intType]);
1996+
1997+ _checkLeastUpperBound (aInt, aNum, aInt);
1998+ }
1999+
2000+ void test_typeParameters_invariant_same () {
2001+ // class A<inout T>
2002+ var T = typeParameter ('T' , variance: Variance .invariant);
2003+ var A = class_ (name: 'A' , typeParameters: [T ]);
2004+
2005+ // A<num>
2006+ var aNum = interfaceType (A , typeArguments: [numType]);
2007+
2008+ _checkLeastUpperBound (aNum, aNum, aNum);
2009+ }
2010+
2011+ void test_typeParameters_invariant_object () {
2012+ // class A<inout T>
2013+ var T = typeParameter ('T' , variance: Variance .invariant);
2014+ var A = class_ (name: 'A' , typeParameters: [T ]);
2015+
2016+ // A<num>
2017+ // A<int>
2018+ var aNum = interfaceType (A , typeArguments: [numType]);
2019+ var aInt = interfaceType (A , typeArguments: [intType]);
2020+
2021+ _checkLeastUpperBound (aNum, aInt, objectType);
2022+ }
2023+
2024+ void test_typeParameters_multi_basic () {
2025+ // class Multi<out T, inout U, in V>
2026+ var T = typeParameter ('T' , variance: Variance .covariant );
2027+ var U = typeParameter ('T' , variance: Variance .invariant);
2028+ var V = typeParameter ('T' , variance: Variance .contravariant);
2029+ var Multi = class_ (name: 'A' , typeParameters: [T , U , V ]);
2030+
2031+ // Multi<num, num, num>
2032+ // Multi<int, num, int>
2033+ var multiNumNumNum =
2034+ interfaceType (Multi , typeArguments: [numType, numType, numType]);
2035+ var multiIntNumInt =
2036+ interfaceType (Multi , typeArguments: [intType, numType, intType]);
2037+
2038+ // We expect Multi<num, num, int>
2039+ var multiNumNumInt =
2040+ interfaceType (Multi , typeArguments: [numType, numType, intType]);
2041+
2042+ _checkLeastUpperBound (multiNumNumNum, multiIntNumInt, multiNumNumInt);
2043+ }
2044+
2045+ void test_typeParameters_multi_objectInterface () {
2046+ // class Multi<out T, inout U, in V>
2047+ var T = typeParameter ('T' , variance: Variance .covariant );
2048+ var U = typeParameter ('T' , variance: Variance .invariant);
2049+ var V = typeParameter ('T' , variance: Variance .contravariant);
2050+ var Multi = class_ (name: 'A' , typeParameters: [T , U , V ]);
2051+
2052+ // Multi<num, String, num>
2053+ // Multi<int, num, int>
2054+ var multiNumStringNum =
2055+ interfaceType (Multi , typeArguments: [numType, stringType, numType]);
2056+ var multiIntNumInt =
2057+ interfaceType (Multi , typeArguments: [intType, numType, intType]);
2058+
2059+ _checkLeastUpperBound (multiNumStringNum, multiIntNumInt, objectType);
2060+ }
2061+
2062+ void test_typeParameters_multi_objectType () {
2063+ // class Multi<out T, inout U, in V>
2064+ var T = typeParameter ('T' , variance: Variance .covariant );
2065+ var U = typeParameter ('T' , variance: Variance .invariant);
2066+ var V = typeParameter ('T' , variance: Variance .contravariant);
2067+ var Multi = class_ (name: 'A' , typeParameters: [T , U , V ]);
2068+
2069+ // Multi<String, num, num>
2070+ // Multi<int, num, int>
2071+ var multiStringNumNum =
2072+ interfaceType (Multi , typeArguments: [stringType, numType, numType]);
2073+ var multiIntNumInt =
2074+ interfaceType (Multi , typeArguments: [intType, numType, intType]);
2075+
2076+ // We expect Multi<Object, num, int>
2077+ var multiObjectNumInt =
2078+ interfaceType (Multi , typeArguments: [objectType, numType, intType]);
2079+
2080+ _checkLeastUpperBound (multiStringNumNum, multiIntNumInt, multiObjectNumInt);
2081+ }
2082+
19512083 void test_unrelatedClasses () {
19522084 // class A
19532085 // class B
0 commit comments