Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(836)

Side by Side Diff: pkg/analyzer/test/src/dart/element/element_test.dart

Issue 1927103002: Add checks for type bounds on generic methods (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.test.src.dart.element.element_test; 5 library analyzer.test.src.dart.element.element_test;
6 6
7 import 'package:analyzer/dart/ast/ast.dart'; 7 import 'package:analyzer/dart/ast/ast.dart';
8 import 'package:analyzer/dart/element/element.dart'; 8 import 'package:analyzer/dart/element/element.dart';
9 import 'package:analyzer/dart/element/type.dart'; 9 import 'package:analyzer/dart/element/type.dart';
10 import 'package:analyzer/src/dart/element/element.dart'; 10 import 'package:analyzer/src/dart/element/element.dart';
(...skipping 2065 matching lines...) Expand 10 before | Expand all | Expand 10 after
2076 } 2076 }
2077 2077
2078 void test_toString_recursive_via_interface_type() { 2078 void test_toString_recursive_via_interface_type() {
2079 FunctionTypeAliasElementImpl f = 2079 FunctionTypeAliasElementImpl f =
2080 ElementFactory.functionTypeAliasElement('f'); 2080 ElementFactory.functionTypeAliasElement('f');
2081 ClassElementImpl c = ElementFactory.classElement2('C', ['T']); 2081 ClassElementImpl c = ElementFactory.classElement2('C', ['T']);
2082 f.returnType = c.type.instantiate([f.type]); 2082 f.returnType = c.type.instantiate([f.type]);
2083 expect(f.type.toString(), '() \u2192 C<...>'); 2083 expect(f.type.toString(), '() \u2192 C<...>');
2084 } 2084 }
2085 2085
2086 void test_typeParameters_genericLocalFunction_genericMethod_genericClass() {
2087 //
2088 // class C<S> {
2089 // Object m<T>() {
2090 // U f<U>() => null;
2091 // }
2092 // }
2093 //
2094 ClassElementImpl classElement =
2095 ElementFactory.classElement('C', null, ['S']);
2096 MethodElementImpl method = new MethodElementImpl('m', 0);
2097 method.enclosingElement = classElement;
2098 method.returnType = ElementFactory.objectType;
2099 method.typeParameters = ElementFactory.typeParameters(['T']);
2100 method.type = new FunctionTypeImpl(method);
2101 FunctionElementImpl function = ElementFactory.functionElement('f');
2102 function.enclosingElement = method;
2103 function.typeParameters = ElementFactory.typeParameters(['T']);
scheglov 2016/04/28 17:14:52 'U' maybe?
Brian Wilkerson 2016/04/28 20:46:11 Done
2104 function.returnType = function.typeParameters[0].type;
2105 function.type = new FunctionTypeImpl(function);
2106
2107 List<TypeParameterElement> inheritedParameters = <TypeParameterElement>[];
2108 inheritedParameters.addAll(method.typeParameters);
2109 inheritedParameters.addAll(classElement.typeParameters);
2110 expect(function.type.typeArguments,
2111 unorderedEquals(_toTypes(inheritedParameters)));
2112 expect(function.type.typeFormals, unorderedEquals(function.typeParameters));
2113 expect(function.type.typeParameters, unorderedEquals(inheritedParameters));
2114 }
2115
2116 void test_typeParameters_genericMethod_genericClass() {
2117 //
2118 // class C<S> {
2119 // Object m<T>() => null;
2120 // }
2121 //
2122 ClassElementImpl classElement =
2123 ElementFactory.classElement('C', null, ['S']);
2124 MethodElementImpl method = new MethodElementImpl('m', 0);
2125 method.enclosingElement = classElement;
2126 method.returnType = ElementFactory.objectType;
2127 method.typeParameters = ElementFactory.typeParameters(['T']);
2128 method.type = new FunctionTypeImpl(method);
2129
2130 expect(method.type.typeArguments,
2131 unorderedEquals(_toTypes(classElement.typeParameters)));
2132 expect(method.type.typeFormals, unorderedEquals(method.typeParameters));
2133 expect(method.type.typeParameters,
2134 unorderedEquals(classElement.typeParameters));
2135 }
2136
2137 void test_typeParameters_genericMethod_simpleClass() {
2138 //
2139 // class C<S> {
2140 // Object m<T>() => null;
2141 // }
2142 //
2143 ClassElementImpl classElement = ElementFactory.classElement2('C');
2144 MethodElementImpl method = new MethodElementImpl('m', 0);
2145 method.enclosingElement = classElement;
2146 method.returnType = ElementFactory.objectType;
2147 method.typeParameters = ElementFactory.typeParameters(['T']);
2148 method.type = new FunctionTypeImpl(method);
2149
2150 expect(method.type.typeArguments,
2151 unorderedEquals(_toTypes(classElement.typeParameters)));
2152 expect(method.type.typeFormals, unorderedEquals(method.typeParameters));
2153 expect(method.type.typeParameters,
2154 unorderedEquals(classElement.typeParameters));
2155 }
2156
2157 void test_typeParameters_genericTopLevelFunction() {
2158 //
2159 // Object f<T>() => null;
2160 //
2161 FunctionElementImpl function = ElementFactory.functionElement('f');
2162 function.returnType = ElementFactory.objectType;
2163 function.typeParameters = ElementFactory.typeParameters(['T']);
2164 function.type = new FunctionTypeImpl(function);
2165
2166 expect(function.type.typeArguments, isEmpty);
2167 expect(function.type.typeFormals, unorderedEquals(function.typeParameters));
2168 expect(function.type.typeParameters, isEmpty);
2169 }
2170
2171 void test_typeParameters_simpleMethod_genericClass() {
2172 //
2173 // class C<S> {
2174 // Object m<T>() => null;
2175 // }
2176 //
2177 ClassElementImpl classElement =
2178 ElementFactory.classElement('C', null, ['S']);
2179 MethodElementImpl method = new MethodElementImpl('m', 0);
2180 method.enclosingElement = classElement;
2181 method.returnType = ElementFactory.objectType;
2182 method.type = new FunctionTypeImpl(method);
scheglov 2016/04/28 17:14:52 Why don't we set <T> anywhere in this and the next
Brian Wilkerson 2016/04/28 20:46:11 Oversight. Done.
2183
2184 expect(method.type.typeArguments,
2185 unorderedEquals(_toTypes(classElement.typeParameters)));
2186 expect(method.type.typeFormals, unorderedEquals(method.typeParameters));
2187 expect(method.type.typeParameters,
2188 unorderedEquals(classElement.typeParameters));
2189 }
2190
2191 void test_typeParameters_simpleMethod_simpleClass() {
2192 //
2193 // class C<S> {
2194 // Object m<T>() => null;
2195 // }
2196 //
2197 ClassElementImpl classElement = ElementFactory.classElement2('C');
2198 MethodElementImpl method = new MethodElementImpl('m', 0);
2199 method.enclosingElement = classElement;
2200 method.returnType = ElementFactory.objectType;
2201 method.type = new FunctionTypeImpl(method);
2202
2203 expect(method.type.typeArguments,
2204 unorderedEquals(_toTypes(classElement.typeParameters)));
2205 expect(method.type.typeFormals, unorderedEquals(method.typeParameters));
2206 expect(method.type.typeParameters,
2207 unorderedEquals(classElement.typeParameters));
2208 }
2209
2086 void test_withTypeArguments() { 2210 void test_withTypeArguments() {
2087 ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]); 2211 ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
2088 MethodElementImpl methodElement = 2212 MethodElementImpl methodElement =
2089 new MethodElementImpl.forNode(AstFactory.identifier3("m")); 2213 new MethodElementImpl.forNode(AstFactory.identifier3("m"));
2090 enclosingClass.methods = <MethodElement>[methodElement]; 2214 enclosingClass.methods = <MethodElement>[methodElement];
2091 FunctionTypeImpl type = new FunctionTypeImpl(methodElement); 2215 FunctionTypeImpl type = new FunctionTypeImpl(methodElement);
2092 DartType expectedType = enclosingClass.typeParameters[0].type; 2216 DartType expectedType = enclosingClass.typeParameters[0].type;
2093 List<DartType> arguments = type.typeArguments; 2217 List<DartType> arguments = type.typeArguments;
2094 expect(arguments, hasLength(1)); 2218 expect(arguments, hasLength(1));
2095 expect(arguments[0], expectedType); 2219 expect(arguments[0], expectedType);
2096 } 2220 }
2221
2222 Iterable<DartType> _toTypes(List<TypeParameterElement> typeParameters) {
2223 return typeParameters.map((TypeParameterElement element) => element.type);
2224 }
2097 } 2225 }
2098 2226
2099 @reflectiveTest 2227 @reflectiveTest
2100 class InterfaceTypeImplTest extends EngineTestCase { 2228 class InterfaceTypeImplTest extends EngineTestCase {
2101 /** 2229 /**
2102 * The type provider used to access the types. 2230 * The type provider used to access the types.
2103 */ 2231 */
2104 TestTypeProvider _typeProvider; 2232 TestTypeProvider _typeProvider;
2105 2233
2106 @override 2234 @override
(...skipping 2121 matching lines...) Expand 10 before | Expand all | Expand 10 after
4228 } 4356 }
4229 4357
4230 class _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction 4358 class _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction
4231 extends InterfaceTypeImpl { 4359 extends InterfaceTypeImpl {
4232 _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction(ClassElement arg0) 4360 _FunctionTypeImplTest_isSubtypeOf_baseCase_classFunction(ClassElement arg0)
4233 : super(arg0); 4361 : super(arg0);
4234 4362
4235 @override 4363 @override
4236 bool get isDartCoreFunction => true; 4364 bool get isDartCoreFunction => true;
4237 } 4365 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698