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

Side by Side Diff: pkg/analyzer/test/src/summary/resynthesize_test.dart

Issue 1852883003: Fix summarizing of types with unused type parameters. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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) 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/summarize_elements.dart ('k') | pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698