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

Side by Side Diff: pkg/kernel/lib/type_environment.dart

Issue 2618393002: Insert covariance checks in strong mode. (Closed)
Patch Set: Merge Created 3 years, 11 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
« no previous file with comments | « pkg/kernel/lib/type_algebra.dart ('k') | pkg/kernel/test/baseline_strong_mode_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 library kernel.type_environment; 4 library kernel.type_environment;
5 5
6 import 'ast.dart'; 6 import 'ast.dart';
7 import 'class_hierarchy.dart'; 7 import 'class_hierarchy.dart';
8 import 'core_types.dart'; 8 import 'core_types.dart';
9 import 'type_algebra.dart'; 9 import 'type_algebra.dart';
10 10
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 /// If both types are `int`, the returned type is `int`. 111 /// If both types are `int`, the returned type is `int`.
112 /// If either type is `double`, the returned type is `double`. 112 /// If either type is `double`, the returned type is `double`.
113 /// If both types refer to the same type variable (typically with `num` as 113 /// If both types refer to the same type variable (typically with `num` as
114 /// the upper bound), then that type variable is returned. 114 /// the upper bound), then that type variable is returned.
115 /// Otherwise `num` is returned. 115 /// Otherwise `num` is returned.
116 DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) { 116 DartType getTypeOfOverloadedArithmetic(DartType type1, DartType type2) {
117 if (type1 == type2) return type1; 117 if (type1 == type2) return type1;
118 if (type1 == doubleType || type2 == doubleType) return doubleType; 118 if (type1 == doubleType || type2 == doubleType) return doubleType;
119 return numType; 119 return numType;
120 } 120 }
121
122 /// Returns true if [class_] has no proper subtypes that are usable as type
123 /// argument.
124 bool isSealedClass(Class class_) {
125 // The sealed core classes have subtypes in the patched SDK, but those
126 // classes cannot occur as type argument.
127 if (class_ == coreTypes.intClass ||
128 class_ == coreTypes.doubleClass ||
129 class_ == coreTypes.stringClass ||
130 class_ == coreTypes.boolClass ||
131 class_ == coreTypes.nullClass) {
132 return true;
133 }
134 return !hierarchy.hasProperSubtypes(class_);
135 }
121 } 136 }
122 137
123 /// The part of [TypeEnvironment] that deals with subtype tests. 138 /// The part of [TypeEnvironment] that deals with subtype tests.
124 /// 139 ///
125 /// This lives in a separate class so it can be tested independently of the SDK. 140 /// This lives in a separate class so it can be tested independently of the SDK.
126 abstract class SubtypeTester { 141 abstract class SubtypeTester {
127 InterfaceType get objectType; 142 InterfaceType get objectType;
128 InterfaceType get rawFunctionType; 143 InterfaceType get rawFunctionType;
129 ClassHierarchy get hierarchy; 144 ClassHierarchy get hierarchy;
130 145
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 if (subtypeNameIndex == subtype.namedParameters.length) return false; 236 if (subtypeNameIndex == subtype.namedParameters.length) return false;
222 NamedType subtypeParameter = subtype.namedParameters[subtypeNameIndex]; 237 NamedType subtypeParameter = subtype.namedParameters[subtypeNameIndex];
223 // Termination: Both types shrink in size. 238 // Termination: Both types shrink in size.
224 if (!isSubtypeOf(supertypeParameter.type, subtypeParameter.type)) { 239 if (!isSubtypeOf(supertypeParameter.type, subtypeParameter.type)) {
225 return false; 240 return false;
226 } 241 }
227 } 242 }
228 return true; 243 return true;
229 } 244 }
230 } 245 }
OLDNEW
« no previous file with comments | « pkg/kernel/lib/type_algebra.dart ('k') | pkg/kernel/test/baseline_strong_mode_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698