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

Side by Side Diff: pkg/compiler/lib/src/dart_types.dart

Issue 2307873002: Fix more-specific for interface types with call functions. (Closed)
Patch Set: Created 4 years, 3 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 dart_types; 5 library dart_types;
6 6
7 import 'dart:math' show min; 7 import 'dart:math' show min;
8 8
9 import 'common/resolution.dart' show Resolution; 9 import 'common/resolution.dart' show Resolution;
10 import 'common.dart'; 10 import 'common.dart';
(...skipping 1009 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 } 1020 }
1021 1021
1022 bool invalidTypeArguments(DartType t, DartType s); 1022 bool invalidTypeArguments(DartType t, DartType s);
1023 1023
1024 bool invalidFunctionReturnTypes(DartType t, DartType s); 1024 bool invalidFunctionReturnTypes(DartType t, DartType s);
1025 1025
1026 bool invalidFunctionParameterTypes(DartType t, DartType s); 1026 bool invalidFunctionParameterTypes(DartType t, DartType s);
1027 1027
1028 bool invalidTypeVariableBounds(DartType bound, DartType s); 1028 bool invalidTypeVariableBounds(DartType bound, DartType s);
1029 1029
1030 bool invalidCallableType(DartType callType, DartType s);
1031
1030 /// Handle as dynamic for both subtype and more specific relation to avoid 1032 /// Handle as dynamic for both subtype and more specific relation to avoid
1031 /// spurious errors from malformed types. 1033 /// spurious errors from malformed types.
1032 bool visitMalformedType(MalformedType t, DartType s) => true; 1034 bool visitMalformedType(MalformedType t, DartType s) => true;
1033 1035
1034 bool visitInterfaceType(InterfaceType t, DartType s) { 1036 bool visitInterfaceType(InterfaceType t, DartType s) {
1035 // TODO(johnniwinther): Currently needed since literal types like int, 1037 // TODO(johnniwinther): Currently needed since literal types like int,
1036 // double, bool etc. might not have been resolved yet. 1038 // double, bool etc. might not have been resolved yet.
1037 t.element.ensureResolved(resolution); 1039 t.element.ensureResolved(resolution);
1038 1040
1039 bool checkTypeArguments(InterfaceType instance, InterfaceType other) { 1041 bool checkTypeArguments(InterfaceType instance, InterfaceType other) {
1040 List<DartType> tTypeArgs = instance.typeArguments; 1042 List<DartType> tTypeArgs = instance.typeArguments;
1041 List<DartType> sTypeArgs = other.typeArguments; 1043 List<DartType> sTypeArgs = other.typeArguments;
1042 assert(tTypeArgs.length == sTypeArgs.length); 1044 assert(tTypeArgs.length == sTypeArgs.length);
1043 for (int i = 0; i < tTypeArgs.length; i++) { 1045 for (int i = 0; i < tTypeArgs.length; i++) {
1044 if (invalidTypeArguments(tTypeArgs[i], sTypeArgs[i])) { 1046 if (invalidTypeArguments(tTypeArgs[i], sTypeArgs[i])) {
1045 return false; 1047 return false;
1046 } 1048 }
1047 } 1049 }
1048 return true; 1050 return true;
1049 } 1051 }
1050 1052
1051 if (s is InterfaceType) { 1053 if (s is InterfaceType) {
1052 InterfaceType instance = t.asInstanceOf(s.element); 1054 InterfaceType instance = t.asInstanceOf(s.element);
1053 return instance != null && checkTypeArguments(instance, s); 1055 if (instance != null && checkTypeArguments(instance, s)) {
1054 } else { 1056 return true;
1055 return false; 1057 }
1056 } 1058 }
1059
1060 if (s == coreTypes.functionType && t.element.callType != null) {
1061 return true;
1062 } else if (s is FunctionType) {
1063 FunctionType callType = t.callType;
1064 return callType != null && !invalidCallableType(callType, s);
1065 }
1066
1067 return false;
1057 } 1068 }
1058 1069
1059 bool visitFunctionType(FunctionType t, DartType s) { 1070 bool visitFunctionType(FunctionType t, DartType s) {
1060 if (s == coreTypes.functionType) { 1071 if (s == coreTypes.functionType) {
1061 return true; 1072 return true;
1062 } 1073 }
1063 if (s is! FunctionType) return false; 1074 if (s is! FunctionType) return false;
1064 FunctionType tf = t; 1075 FunctionType tf = t;
1065 FunctionType sf = s; 1076 FunctionType sf = s;
1066 if (invalidFunctionReturnTypes(tf.returnType, sf.returnType)) { 1077 if (invalidFunctionReturnTypes(tf.returnType, sf.returnType)) {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 return !s.isVoid && !isMoreSpecific(t, s); 1227 return !s.isVoid && !isMoreSpecific(t, s);
1217 } 1228 }
1218 1229
1219 bool invalidFunctionParameterTypes(DartType t, DartType s) { 1230 bool invalidFunctionParameterTypes(DartType t, DartType s) {
1220 return !isMoreSpecific(t, s); 1231 return !isMoreSpecific(t, s);
1221 } 1232 }
1222 1233
1223 bool invalidTypeVariableBounds(DartType bound, DartType s) { 1234 bool invalidTypeVariableBounds(DartType bound, DartType s) {
1224 return !isMoreSpecific(bound, s); 1235 return !isMoreSpecific(bound, s);
1225 } 1236 }
1237
1238 bool invalidCallableType(DartType callType, DartType s) {
1239 return !isMoreSpecific(callType, s);
1240 }
1226 } 1241 }
1227 1242
1228 /** 1243 /**
1229 * Type visitor that determines the subtype relation two types. 1244 * Type visitor that determines the subtype relation two types.
1230 */ 1245 */
1231 class SubtypeVisitor extends MoreSpecificVisitor { 1246 class SubtypeVisitor extends MoreSpecificVisitor {
1232 SubtypeVisitor(Resolution resolution) : super(resolution); 1247 SubtypeVisitor(Resolution resolution) : super(resolution);
1233 1248
1234 bool isSubtype(DartType t, DartType s) { 1249 bool isSubtype(DartType t, DartType s) {
1235 return t.treatAsDynamic || isMoreSpecific(t, s); 1250 return t.treatAsDynamic || isMoreSpecific(t, s);
(...skipping 12 matching lines...) Expand all
1248 } 1263 }
1249 1264
1250 bool invalidFunctionParameterTypes(DartType t, DartType s) { 1265 bool invalidFunctionParameterTypes(DartType t, DartType s) {
1251 return !isAssignable(t, s); 1266 return !isAssignable(t, s);
1252 } 1267 }
1253 1268
1254 bool invalidTypeVariableBounds(DartType bound, DartType s) { 1269 bool invalidTypeVariableBounds(DartType bound, DartType s) {
1255 return !isSubtype(bound, s); 1270 return !isSubtype(bound, s);
1256 } 1271 }
1257 1272
1258 bool visitInterfaceType(InterfaceType t, DartType s) { 1273 bool invalidCallableType(DartType callType, DartType s) {
1259 if (super.visitInterfaceType(t, s)) return true; 1274 return !isSubtype(callType, s);
1260
1261 if (s == coreTypes.functionType && t.element.callType != null) {
1262 return true;
1263 } else if (s is FunctionType) {
1264 FunctionType callType = t.callType;
1265 return callType != null && isSubtype(callType, s);
1266 }
1267 return false;
1268 } 1275 }
1269 } 1276 }
1270 1277
1271 /** 1278 /**
1272 * Callback used to check whether the [typeArgument] of [type] is a valid 1279 * Callback used to check whether the [typeArgument] of [type] is a valid
1273 * substitute for the bound of [typeVariable]. [bound] holds the bound against 1280 * substitute for the bound of [typeVariable]. [bound] holds the bound against
1274 * which [typeArgument] should be checked. 1281 * which [typeArgument] should be checked.
1275 */ 1282 */
1276 typedef void CheckTypeVariableBound(GenericType type, DartType typeArgument, 1283 typedef void CheckTypeVariableBound(GenericType type, DartType typeArgument,
1277 TypeVariableType typeVariable, DartType bound); 1284 TypeVariableType typeVariable, DartType bound);
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
2012 sb.write(', '); 2019 sb.write(', ');
2013 } 2020 }
2014 namedParameterTypes[index].accept(this, namedParameters[index]); 2021 namedParameterTypes[index].accept(this, namedParameters[index]);
2015 needsComma = true; 2022 needsComma = true;
2016 } 2023 }
2017 sb.write('}'); 2024 sb.write('}');
2018 } 2025 }
2019 sb.write(')'); 2026 sb.write(')');
2020 } 2027 }
2021 } 2028 }
OLDNEW
« no previous file with comments | « no previous file | tests/compiler/dart2js/subtype_test.dart » ('j') | tests/compiler/dart2js/subtype_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698