| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 test.src.serialization.elements_test; | 5 library test.src.serialization.elements_test; |
| 6 | 6 |
| 7 import 'dart:convert'; | 7 import 'dart:convert'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/constant/value.dart'; | 10 import 'package:analyzer/dart/constant/value.dart'; |
| (...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 expect(resynthesized.element, new isInstanceOf<FunctionElement>()); | 1069 expect(resynthesized.element, new isInstanceOf<FunctionElement>()); |
| 1070 expect(resynthesized.element.enclosingElement, isNull, reason: desc); | 1070 expect(resynthesized.element.enclosingElement, isNull, reason: desc); |
| 1071 compareFunctionElements( | 1071 compareFunctionElements( |
| 1072 resynthesized.element, original.element, '$desc element', | 1072 resynthesized.element, original.element, '$desc element', |
| 1073 shallow: true); | 1073 shallow: true); |
| 1074 expect(resynthesized.element.type, same(resynthesized)); | 1074 expect(resynthesized.element.type, same(resynthesized)); |
| 1075 } | 1075 } |
| 1076 expect(resynthesized.typeArguments.length, original.typeArguments.length, | 1076 expect(resynthesized.typeArguments.length, original.typeArguments.length, |
| 1077 reason: desc); | 1077 reason: desc); |
| 1078 for (int i = 0; i < resynthesized.typeArguments.length; i++) { | 1078 for (int i = 0; i < resynthesized.typeArguments.length; i++) { |
| 1079 compareTypes(resynthesized.typeArguments[i], original.typeArguments[i], | 1079 if (resynthesized.typeArguments[i].isDynamic && |
| 1080 '$desc type argument ${original.typeArguments[i].name}'); | 1080 original.typeArguments[i] is TypeParameterType) { |
| 1081 // It's ok for type arguments to get converted to `dynamic` if they |
| 1082 // are not used. |
| 1083 expect( |
| 1084 isTypeParameterUsed( |
| 1085 original.typeArguments[i], original.element.type), |
| 1086 isFalse); |
| 1087 } else { |
| 1088 compareTypes( |
| 1089 resynthesized.typeArguments[i], |
| 1090 original.typeArguments[i], |
| 1091 '$desc type argument ${original.typeArguments[i].name}'); |
| 1092 } |
| 1081 } | 1093 } |
| 1082 if (original.typeParameters == null) { | 1094 if (original.typeParameters == null) { |
| 1083 expect(resynthesized.typeParameters, isNull, reason: desc); | 1095 expect(resynthesized.typeParameters, isNull, reason: desc); |
| 1084 } else { | 1096 } else { |
| 1085 expect(resynthesized.typeParameters, isNotNull, reason: desc); | 1097 expect(resynthesized.typeParameters, isNotNull, reason: desc); |
| 1086 expect( | 1098 expect( |
| 1087 resynthesized.typeParameters.length, original.typeParameters.length, | 1099 resynthesized.typeParameters.length, original.typeParameters.length, |
| 1088 reason: desc); | 1100 reason: desc); |
| 1089 for (int i = 0; i < resynthesized.typeParameters.length; i++) { | 1101 for (int i = 0; i < resynthesized.typeParameters.length; i++) { |
| 1090 compareTypeParameterElements(resynthesized.typeParameters[i], | 1102 compareTypeParameterElements(resynthesized.typeParameters[i], |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 return getActualElement(actualElement, desc); | 1250 return getActualElement(actualElement, desc); |
| 1239 } else if (element is Member) { | 1251 } else if (element is Member) { |
| 1240 return getActualElement(element.baseElement, desc); | 1252 return getActualElement(element.baseElement, desc); |
| 1241 } else { | 1253 } else { |
| 1242 fail('Unexpected type for resynthesized ($desc):' | 1254 fail('Unexpected type for resynthesized ($desc):' |
| 1243 ' ${element.runtimeType}'); | 1255 ' ${element.runtimeType}'); |
| 1244 return null; | 1256 return null; |
| 1245 } | 1257 } |
| 1246 } | 1258 } |
| 1247 | 1259 |
| 1260 /** |
| 1261 * Determine if [type] makes use of the given [typeParameter]. |
| 1262 */ |
| 1263 bool isTypeParameterUsed(TypeParameterType typeParameter, DartType type) { |
| 1264 if (type is FunctionType) { |
| 1265 return isTypeParameterUsed(typeParameter, type.returnType) || |
| 1266 type.parameters.any((ParameterElement e) => |
| 1267 isTypeParameterUsed(typeParameter, e.type)); |
| 1268 } else if (type is InterfaceType) { |
| 1269 return type.typeArguments |
| 1270 .any((DartType t) => isTypeParameterUsed(typeParameter, t)); |
| 1271 } else if (type is TypeParameterType) { |
| 1272 return type == typeParameter; |
| 1273 } else { |
| 1274 expect(type.isDynamic || type.isVoid, isTrue); |
| 1275 return false; |
| 1276 } |
| 1277 } |
| 1278 |
| 1248 @override | 1279 @override |
| 1249 void setUp() { | 1280 void setUp() { |
| 1250 super.setUp(); | 1281 super.setUp(); |
| 1251 prepareAnalysisContext(createOptions()); | 1282 prepareAnalysisContext(createOptions()); |
| 1252 } | 1283 } |
| 1253 | 1284 |
| 1254 test_class_abstract() { | 1285 test_class_abstract() { |
| 1255 checkLibrary('abstract class C {}'); | 1286 checkLibrary('abstract class C {}'); |
| 1256 } | 1287 } |
| 1257 | 1288 |
| (...skipping 2823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4081 } | 4112 } |
| 4082 | 4113 |
| 4083 test_typedef_type_parameters_f_bound_simple() { | 4114 test_typedef_type_parameters_f_bound_simple() { |
| 4084 checkLibrary('typedef U F<T extends U, U>(T t);'); | 4115 checkLibrary('typedef U F<T extends U, U>(T t);'); |
| 4085 } | 4116 } |
| 4086 | 4117 |
| 4087 test_typedefs() { | 4118 test_typedefs() { |
| 4088 checkLibrary('f() {} g() {}'); | 4119 checkLibrary('f() {} g() {}'); |
| 4089 } | 4120 } |
| 4090 | 4121 |
| 4122 test_unused_type_parameter() { |
| 4123 checkLibrary(''' |
| 4124 class C<T> { |
| 4125 void f() {} |
| 4126 } |
| 4127 C<int> c; |
| 4128 var v = c.f; |
| 4129 '''); |
| 4130 } |
| 4131 |
| 4091 test_variable_const() { | 4132 test_variable_const() { |
| 4092 checkLibrary('const int i = 0;'); | 4133 checkLibrary('const int i = 0;'); |
| 4093 } | 4134 } |
| 4094 | 4135 |
| 4095 test_variable_documented() { | 4136 test_variable_documented() { |
| 4096 checkLibrary(''' | 4137 checkLibrary(''' |
| 4097 // Extra comment so doc comment offset != 0 | 4138 // Extra comment so doc comment offset != 0 |
| 4098 /** | 4139 /** |
| 4099 * Docs | 4140 * Docs |
| 4100 */ | 4141 */ |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4228 fail('Unexpectedly tried to get unlinked summary for $uri'); | 4269 fail('Unexpectedly tried to get unlinked summary for $uri'); |
| 4229 } | 4270 } |
| 4230 return serializedUnit; | 4271 return serializedUnit; |
| 4231 } | 4272 } |
| 4232 | 4273 |
| 4233 @override | 4274 @override |
| 4234 bool hasLibrarySummary(String uri) { | 4275 bool hasLibrarySummary(String uri) { |
| 4235 return true; | 4276 return true; |
| 4236 } | 4277 } |
| 4237 } | 4278 } |
| OLD | NEW |