| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 subtype_test; | 5 library subtype_test; |
| 6 | 6 |
| 7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
| 8 import "package:async_helper/async_helper.dart"; | 8 import "package:async_helper/async_helper.dart"; |
| 9 import 'type_test_helper.dart'; | 9 import 'type_test_helper.dart'; |
| 10 import 'package:compiler/src/dart_types.dart'; | 10 import 'package:compiler/src/dart_types.dart'; |
| 11 import "package:compiler/src/elements/elements.dart" | 11 import "package:compiler/src/elements/elements.dart" show Element, ClassElement; |
| 12 show Element, ClassElement; | |
| 13 | 12 |
| 14 void main() { | 13 void main() { |
| 15 testInterfaceSubtype(); | 14 testInterfaceSubtype(); |
| 16 testCallableSubtype(); | 15 testCallableSubtype(); |
| 17 testFunctionSubtyping(); | 16 testFunctionSubtyping(); |
| 18 testTypedefSubtyping(); | 17 testTypedefSubtyping(); |
| 19 testFunctionSubtypingOptional(); | 18 testFunctionSubtypingOptional(); |
| 20 testTypedefSubtypingOptional(); | 19 testTypedefSubtypingOptional(); |
| 21 testFunctionSubtypingNamed(); | 20 testFunctionSubtypingNamed(); |
| 22 testTypedefSubtypingNamed(); | 21 testTypedefSubtypingNamed(); |
| 23 testTypeVariableSubtype(); | 22 testTypeVariableSubtype(); |
| 24 } | 23 } |
| 25 | 24 |
| 26 void testTypes(TypeEnvironment env, DartType subtype, DartType supertype, | 25 void testTypes(TypeEnvironment env, DartType subtype, DartType supertype, |
| 27 bool expectSubtype, bool expectMoreSpecific) { | 26 bool expectSubtype, bool expectMoreSpecific) { |
| 28 if (expectMoreSpecific == null) expectMoreSpecific = expectSubtype; | 27 if (expectMoreSpecific == null) expectMoreSpecific = expectSubtype; |
| 29 Expect.equals(expectSubtype, env.isSubtype(subtype, supertype), | 28 Expect.equals(expectSubtype, env.isSubtype(subtype, supertype), |
| 30 '$subtype <: $supertype'); | 29 '$subtype <: $supertype'); |
| 31 Expect.equals(expectMoreSpecific, env.isMoreSpecific(subtype, supertype), | 30 Expect.equals(expectMoreSpecific, env.isMoreSpecific(subtype, supertype), |
| 32 '$subtype << $supertype'); | 31 '$subtype << $supertype'); |
| 33 } | 32 } |
| 34 | 33 |
| 35 void testElementTypes(TypeEnvironment env, String subname, String supername, | 34 void testElementTypes(TypeEnvironment env, String subname, String supername, |
| 36 bool expectSubtype, bool expectMoreSpecific) { | 35 bool expectSubtype, bool expectMoreSpecific) { |
| 37 DartType subtype = env.getElementType(subname); | 36 DartType subtype = env.getElementType(subname); |
| 38 DartType supertype = env.getElementType(supername); | 37 DartType supertype = env.getElementType(supername); |
| 39 testTypes(env, subtype, supertype, expectSubtype, expectMoreSpecific); | 38 testTypes(env, subtype, supertype, expectSubtype, expectMoreSpecific); |
| 40 } | 39 } |
| 41 | 40 |
| 42 | |
| 43 void testInterfaceSubtype() { | 41 void testInterfaceSubtype() { |
| 44 asyncTest(() => TypeEnvironment.create(r""" | 42 asyncTest(() => TypeEnvironment.create(r""" |
| 45 class A<T> {} | 43 class A<T> {} |
| 46 class B<T1, T2> extends A<T1> {} | 44 class B<T1, T2> extends A<T1> {} |
| 47 // TODO(johnniwinther): Inheritance with different type arguments is | 45 // TODO(johnniwinther): Inheritance with different type arguments is |
| 48 // currently not supported by the implementation. | 46 // currently not supported by the implementation. |
| 49 class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {} | 47 class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {} |
| 50 """).then((env) { | 48 """).then((env) { |
| 51 | 49 void expect(bool expectSubtype, DartType T, DartType S, |
| 52 void expect(bool expectSubtype, DartType T, DartType S, | 50 {bool expectMoreSpecific}) { |
| 53 {bool expectMoreSpecific}) { | 51 testTypes(env, T, S, expectSubtype, expectMoreSpecific); |
| 54 testTypes(env, T, S, expectSubtype, expectMoreSpecific); | 52 } |
| 55 } | 53 |
| 56 | 54 ClassElement A = env.getElement('A'); |
| 57 ClassElement A = env.getElement('A'); | 55 ClassElement B = env.getElement('B'); |
| 58 ClassElement B = env.getElement('B'); | 56 ClassElement C = env.getElement('C'); |
| 59 ClassElement C = env.getElement('C'); | 57 DartType Object_ = env['Object']; |
| 60 DartType Object_ = env['Object']; | 58 DartType num_ = env['num']; |
| 61 DartType num_ = env['num']; | 59 DartType int_ = env['int']; |
| 62 DartType int_ = env['int']; | 60 DartType String_ = env['String']; |
| 63 DartType String_ = env['String']; | 61 DartType dynamic_ = env['dynamic']; |
| 64 DartType dynamic_ = env['dynamic']; | 62 DartType void_ = env['void']; |
| 65 DartType void_ = env['void']; | 63 |
| 66 | 64 expect(true, void_, void_); |
| 67 expect(true, void_, void_); | 65 expect(true, void_, dynamic_); |
| 68 expect(true, void_, dynamic_); | 66 // Unsure about the next one, see dartbug.com/14933. |
| 69 // Unsure about the next one, see dartbug.com/14933. | 67 expect(true, dynamic_, void_, expectMoreSpecific: false); |
| 70 expect(true, dynamic_, void_, expectMoreSpecific: false); | 68 expect(false, void_, Object_); |
| 71 expect(false, void_, Object_); | 69 expect(false, Object_, void_); |
| 72 expect(false, Object_, void_); | 70 |
| 73 | 71 expect(true, Object_, Object_); |
| 74 expect(true, Object_, Object_); | 72 expect(true, num_, Object_); |
| 75 expect(true, num_, Object_); | 73 expect(true, int_, Object_); |
| 76 expect(true, int_, Object_); | 74 expect(true, String_, Object_); |
| 77 expect(true, String_, Object_); | 75 expect(true, dynamic_, Object_, expectMoreSpecific: false); |
| 78 expect(true, dynamic_, Object_, expectMoreSpecific: false); | 76 |
| 79 | 77 expect(false, Object_, num_); |
| 80 expect(false, Object_, num_); | 78 expect(true, num_, num_); |
| 81 expect(true, num_, num_); | 79 expect(true, int_, num_); |
| 82 expect(true, int_, num_); | 80 expect(false, String_, num_); |
| 83 expect(false, String_, num_); | 81 expect(true, dynamic_, num_, expectMoreSpecific: false); |
| 84 expect(true, dynamic_, num_, expectMoreSpecific: false); | 82 |
| 85 | 83 expect(false, Object_, int_); |
| 86 expect(false, Object_, int_); | 84 expect(false, num_, int_); |
| 87 expect(false, num_, int_); | 85 expect(true, int_, int_); |
| 88 expect(true, int_, int_); | 86 expect(false, String_, int_); |
| 89 expect(false, String_, int_); | 87 expect(true, dynamic_, int_, expectMoreSpecific: false); |
| 90 expect(true, dynamic_, int_, expectMoreSpecific: false); | 88 |
| 91 | 89 expect(false, Object_, String_); |
| 92 expect(false, Object_, String_); | 90 expect(false, num_, String_); |
| 93 expect(false, num_, String_); | 91 expect(false, int_, String_); |
| 94 expect(false, int_, String_); | 92 expect(true, String_, String_); |
| 95 expect(true, String_, String_); | 93 expect(true, dynamic_, String_, expectMoreSpecific: false); |
| 96 expect(true, dynamic_, String_, expectMoreSpecific: false); | 94 |
| 97 | 95 expect(true, Object_, dynamic_); |
| 98 expect(true, Object_, dynamic_); | 96 expect(true, num_, dynamic_); |
| 99 expect(true, num_, dynamic_); | 97 expect(true, int_, dynamic_); |
| 100 expect(true, int_, dynamic_); | 98 expect(true, String_, dynamic_); |
| 101 expect(true, String_, dynamic_); | 99 expect(true, dynamic_, dynamic_); |
| 102 expect(true, dynamic_, dynamic_); | 100 |
| 103 | 101 DartType A_Object = instantiate(A, [Object_]); |
| 104 DartType A_Object = instantiate(A, [Object_]); | 102 DartType A_num = instantiate(A, [num_]); |
| 105 DartType A_num = instantiate(A, [num_]); | 103 DartType A_int = instantiate(A, [int_]); |
| 106 DartType A_int = instantiate(A, [int_]); | 104 DartType A_String = instantiate(A, [String_]); |
| 107 DartType A_String = instantiate(A, [String_]); | 105 DartType A_dynamic = instantiate(A, [dynamic_]); |
| 108 DartType A_dynamic = instantiate(A, [dynamic_]); | 106 |
| 109 | 107 expect(true, A_Object, Object_); |
| 110 expect(true, A_Object, Object_); | 108 expect(false, A_Object, num_); |
| 111 expect(false, A_Object, num_); | 109 expect(false, A_Object, int_); |
| 112 expect(false, A_Object, int_); | 110 expect(false, A_Object, String_); |
| 113 expect(false, A_Object, String_); | 111 expect(true, A_Object, dynamic_); |
| 114 expect(true, A_Object, dynamic_); | 112 |
| 115 | 113 expect(true, A_Object, A_Object); |
| 116 expect(true, A_Object, A_Object); | 114 expect(true, A_num, A_Object); |
| 117 expect(true, A_num, A_Object); | 115 expect(true, A_int, A_Object); |
| 118 expect(true, A_int, A_Object); | 116 expect(true, A_String, A_Object); |
| 119 expect(true, A_String, A_Object); | 117 expect(true, A_dynamic, A_Object, expectMoreSpecific: false); |
| 120 expect(true, A_dynamic, A_Object, expectMoreSpecific: false); | 118 |
| 121 | 119 expect(false, A_Object, A_num); |
| 122 expect(false, A_Object, A_num); | 120 expect(true, A_num, A_num); |
| 123 expect(true, A_num, A_num); | 121 expect(true, A_int, A_num); |
| 124 expect(true, A_int, A_num); | 122 expect(false, A_String, A_num); |
| 125 expect(false, A_String, A_num); | 123 expect(true, A_dynamic, A_num, expectMoreSpecific: false); |
| 126 expect(true, A_dynamic, A_num, expectMoreSpecific: false); | 124 |
| 127 | 125 expect(false, A_Object, A_int); |
| 128 expect(false, A_Object, A_int); | 126 expect(false, A_num, A_int); |
| 129 expect(false, A_num, A_int); | 127 expect(true, A_int, A_int); |
| 130 expect(true, A_int, A_int); | 128 expect(false, A_String, A_int); |
| 131 expect(false, A_String, A_int); | 129 expect(true, A_dynamic, A_int, expectMoreSpecific: false); |
| 132 expect(true, A_dynamic, A_int, expectMoreSpecific: false); | 130 |
| 133 | 131 expect(false, A_Object, A_String); |
| 134 expect(false, A_Object, A_String); | 132 expect(false, A_num, A_String); |
| 135 expect(false, A_num, A_String); | 133 expect(false, A_int, A_String); |
| 136 expect(false, A_int, A_String); | 134 expect(true, A_String, A_String); |
| 137 expect(true, A_String, A_String); | 135 expect(true, A_dynamic, A_String, expectMoreSpecific: false); |
| 138 expect(true, A_dynamic, A_String, expectMoreSpecific: false); | 136 |
| 139 | 137 expect(true, A_Object, A_dynamic); |
| 140 expect(true, A_Object, A_dynamic); | 138 expect(true, A_num, A_dynamic); |
| 141 expect(true, A_num, A_dynamic); | 139 expect(true, A_int, A_dynamic); |
| 142 expect(true, A_int, A_dynamic); | 140 expect(true, A_String, A_dynamic); |
| 143 expect(true, A_String, A_dynamic); | 141 expect(true, A_dynamic, A_dynamic); |
| 144 expect(true, A_dynamic, A_dynamic); | 142 |
| 145 | 143 DartType B_Object_Object = instantiate(B, [Object_, Object_]); |
| 146 DartType B_Object_Object = instantiate(B, [Object_, Object_]); | 144 DartType B_num_num = instantiate(B, [num_, num_]); |
| 147 DartType B_num_num = instantiate(B, [num_, num_]); | 145 DartType B_int_num = instantiate(B, [int_, num_]); |
| 148 DartType B_int_num = instantiate(B, [int_, num_]); | 146 DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); |
| 149 DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); | 147 DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); |
| 150 DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); | 148 |
| 151 | 149 expect(true, B_Object_Object, Object_); |
| 152 expect(true, B_Object_Object, Object_); | 150 expect(true, B_Object_Object, A_Object); |
| 153 expect(true, B_Object_Object, A_Object); | 151 expect(false, B_Object_Object, A_num); |
| 154 expect(false, B_Object_Object, A_num); | 152 expect(false, B_Object_Object, A_int); |
| 155 expect(false, B_Object_Object, A_int); | 153 expect(false, B_Object_Object, A_String); |
| 156 expect(false, B_Object_Object, A_String); | 154 expect(true, B_Object_Object, A_dynamic); |
| 157 expect(true, B_Object_Object, A_dynamic); | 155 |
| 158 | 156 expect(true, B_num_num, Object_); |
| 159 expect(true, B_num_num, Object_); | 157 expect(true, B_num_num, A_Object); |
| 160 expect(true, B_num_num, A_Object); | 158 expect(true, B_num_num, A_num); |
| 161 expect(true, B_num_num, A_num); | 159 expect(false, B_num_num, A_int); |
| 162 expect(false, B_num_num, A_int); | 160 expect(false, B_num_num, A_String); |
| 163 expect(false, B_num_num, A_String); | 161 expect(true, B_num_num, A_dynamic); |
| 164 expect(true, B_num_num, A_dynamic); | 162 |
| 165 | 163 expect(true, B_int_num, Object_); |
| 166 expect(true, B_int_num, Object_); | 164 expect(true, B_int_num, A_Object); |
| 167 expect(true, B_int_num, A_Object); | 165 expect(true, B_int_num, A_num); |
| 168 expect(true, B_int_num, A_num); | 166 expect(true, B_int_num, A_int); |
| 169 expect(true, B_int_num, A_int); | 167 expect(false, B_int_num, A_String); |
| 170 expect(false, B_int_num, A_String); | 168 expect(true, B_int_num, A_dynamic); |
| 171 expect(true, B_int_num, A_dynamic); | 169 |
| 172 | 170 expect(true, B_dynamic_dynamic, Object_); |
| 173 expect(true, B_dynamic_dynamic, Object_); | 171 expect(true, B_dynamic_dynamic, A_Object, expectMoreSpecific: false); |
| 174 expect(true, B_dynamic_dynamic, A_Object, expectMoreSpecific: false); | 172 expect(true, B_dynamic_dynamic, A_num, expectMoreSpecific: false); |
| 175 expect(true, B_dynamic_dynamic, A_num, expectMoreSpecific: false); | 173 expect(true, B_dynamic_dynamic, A_int, expectMoreSpecific: false); |
| 176 expect(true, B_dynamic_dynamic, A_int, expectMoreSpecific: false); | 174 expect(true, B_dynamic_dynamic, A_String, expectMoreSpecific: false); |
| 177 expect(true, B_dynamic_dynamic, A_String, expectMoreSpecific: false); | 175 expect(true, B_dynamic_dynamic, A_dynamic); |
| 178 expect(true, B_dynamic_dynamic, A_dynamic); | 176 |
| 179 | 177 expect(true, B_String_dynamic, Object_); |
| 180 expect(true, B_String_dynamic, Object_); | 178 expect(true, B_String_dynamic, A_Object); |
| 181 expect(true, B_String_dynamic, A_Object); | 179 expect(false, B_String_dynamic, A_num); |
| 182 expect(false, B_String_dynamic, A_num); | 180 expect(false, B_String_dynamic, A_int); |
| 183 expect(false, B_String_dynamic, A_int); | 181 expect(true, B_String_dynamic, A_String); |
| 184 expect(true, B_String_dynamic, A_String); | 182 expect(true, B_String_dynamic, A_dynamic); |
| 185 expect(true, B_String_dynamic, A_dynamic); | 183 |
| 186 | 184 expect(true, B_Object_Object, B_Object_Object); |
| 187 expect(true, B_Object_Object, B_Object_Object); | 185 expect(true, B_num_num, B_Object_Object); |
| 188 expect(true, B_num_num, B_Object_Object); | 186 expect(true, B_int_num, B_Object_Object); |
| 189 expect(true, B_int_num, B_Object_Object); | 187 expect(true, B_dynamic_dynamic, B_Object_Object, |
| 190 expect(true, B_dynamic_dynamic, B_Object_Object, expectMoreSpecific: false); | 188 expectMoreSpecific: false); |
| 191 expect(true, B_String_dynamic, B_Object_Object, expectMoreSpecific: false); | 189 expect(true, B_String_dynamic, B_Object_Object, |
| 192 | 190 expectMoreSpecific: false); |
| 193 expect(false, B_Object_Object, B_num_num); | 191 |
| 194 expect(true, B_num_num, B_num_num); | 192 expect(false, B_Object_Object, B_num_num); |
| 195 expect(true, B_int_num, B_num_num); | 193 expect(true, B_num_num, B_num_num); |
| 196 expect(true, B_dynamic_dynamic, B_num_num, expectMoreSpecific: false); | 194 expect(true, B_int_num, B_num_num); |
| 197 expect(false, B_String_dynamic, B_num_num); | 195 expect(true, B_dynamic_dynamic, B_num_num, expectMoreSpecific: false); |
| 198 | 196 expect(false, B_String_dynamic, B_num_num); |
| 199 expect(false, B_Object_Object, B_int_num); | 197 |
| 200 expect(false, B_num_num, B_int_num); | 198 expect(false, B_Object_Object, B_int_num); |
| 201 expect(true, B_int_num, B_int_num); | 199 expect(false, B_num_num, B_int_num); |
| 202 expect(true, B_dynamic_dynamic, B_int_num, expectMoreSpecific: false); | 200 expect(true, B_int_num, B_int_num); |
| 203 expect(false, B_String_dynamic, B_int_num); | 201 expect(true, B_dynamic_dynamic, B_int_num, expectMoreSpecific: false); |
| 204 | 202 expect(false, B_String_dynamic, B_int_num); |
| 205 expect(true, B_Object_Object, B_dynamic_dynamic); | 203 |
| 206 expect(true, B_num_num, B_dynamic_dynamic); | 204 expect(true, B_Object_Object, B_dynamic_dynamic); |
| 207 expect(true, B_int_num, B_dynamic_dynamic); | 205 expect(true, B_num_num, B_dynamic_dynamic); |
| 208 expect(true, B_dynamic_dynamic, B_dynamic_dynamic); | 206 expect(true, B_int_num, B_dynamic_dynamic); |
| 209 expect(true, B_String_dynamic, B_dynamic_dynamic); | 207 expect(true, B_dynamic_dynamic, B_dynamic_dynamic); |
| 210 | 208 expect(true, B_String_dynamic, B_dynamic_dynamic); |
| 211 expect(false, B_Object_Object, B_String_dynamic); | 209 |
| 212 expect(false, B_num_num, B_String_dynamic); | 210 expect(false, B_Object_Object, B_String_dynamic); |
| 213 expect(false, B_int_num, B_String_dynamic); | 211 expect(false, B_num_num, B_String_dynamic); |
| 214 expect(true, B_dynamic_dynamic, B_String_dynamic, | 212 expect(false, B_int_num, B_String_dynamic); |
| 215 expectMoreSpecific: false); | 213 expect(true, B_dynamic_dynamic, B_String_dynamic, |
| 216 expect(true, B_String_dynamic, B_String_dynamic); | 214 expectMoreSpecific: false); |
| 217 | 215 expect(true, B_String_dynamic, B_String_dynamic); |
| 218 DartType C_Object_Object = instantiate(C, [Object_, Object_]); | 216 |
| 219 DartType C_num_num = instantiate(C, [num_, num_]); | 217 DartType C_Object_Object = instantiate(C, [Object_, Object_]); |
| 220 DartType C_int_String = instantiate(C, [int_, String_]); | 218 DartType C_num_num = instantiate(C, [num_, num_]); |
| 221 DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); | 219 DartType C_int_String = instantiate(C, [int_, String_]); |
| 222 | 220 DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); |
| 223 expect(true, C_Object_Object, B_Object_Object); | 221 |
| 224 expect(false, C_Object_Object, B_num_num); | 222 expect(true, C_Object_Object, B_Object_Object); |
| 225 expect(false, C_Object_Object, B_int_num); | 223 expect(false, C_Object_Object, B_num_num); |
| 226 expect(true, C_Object_Object, B_dynamic_dynamic); | 224 expect(false, C_Object_Object, B_int_num); |
| 227 expect(false, C_Object_Object, B_String_dynamic); | 225 expect(true, C_Object_Object, B_dynamic_dynamic); |
| 228 | 226 expect(false, C_Object_Object, B_String_dynamic); |
| 229 expect(true, C_num_num, B_Object_Object); | 227 |
| 230 expect(true, C_num_num, B_num_num); | 228 expect(true, C_num_num, B_Object_Object); |
| 231 expect(false, C_num_num, B_int_num); | 229 expect(true, C_num_num, B_num_num); |
| 232 expect(true, C_num_num, B_dynamic_dynamic); | 230 expect(false, C_num_num, B_int_num); |
| 233 expect(false, C_num_num, B_String_dynamic); | 231 expect(true, C_num_num, B_dynamic_dynamic); |
| 234 | 232 expect(false, C_num_num, B_String_dynamic); |
| 235 expect(true, C_int_String, B_Object_Object); | 233 |
| 236 expect(false, C_int_String, B_num_num); | 234 expect(true, C_int_String, B_Object_Object); |
| 237 expect(false, C_int_String, B_int_num); | 235 expect(false, C_int_String, B_num_num); |
| 238 expect(true, C_int_String, B_dynamic_dynamic); | 236 expect(false, C_int_String, B_int_num); |
| 239 expect(true, C_int_String, B_String_dynamic); | 237 expect(true, C_int_String, B_dynamic_dynamic); |
| 240 | 238 expect(true, C_int_String, B_String_dynamic); |
| 241 expect(true, C_dynamic_dynamic, B_Object_Object, expectMoreSpecific: false); | 239 |
| 242 expect(true, C_dynamic_dynamic, B_num_num, expectMoreSpecific: false); | 240 expect(true, C_dynamic_dynamic, B_Object_Object, |
| 243 expect(true, C_dynamic_dynamic, B_int_num, expectMoreSpecific: false); | 241 expectMoreSpecific: false); |
| 244 expect(true, C_dynamic_dynamic, B_dynamic_dynamic); | 242 expect(true, C_dynamic_dynamic, B_num_num, expectMoreSpecific: false); |
| 245 expect(true, C_dynamic_dynamic, B_String_dynamic, | 243 expect(true, C_dynamic_dynamic, B_int_num, expectMoreSpecific: false); |
| 246 expectMoreSpecific: false); | 244 expect(true, C_dynamic_dynamic, B_dynamic_dynamic); |
| 247 | 245 expect(true, C_dynamic_dynamic, B_String_dynamic, |
| 248 expect(false, C_int_String, A_int); | 246 expectMoreSpecific: false); |
| 249 expect(true, C_int_String, A_String); | 247 |
| 250 // TODO(johnniwinther): Inheritance with different type arguments is | 248 expect(false, C_int_String, A_int); |
| 251 // currently not supported by the implementation. | 249 expect(true, C_int_String, A_String); |
| 252 //expect(true, C_int_String, instantiate(A, [A_int])); | 250 // TODO(johnniwinther): Inheritance with different type arguments is |
| 253 expect(false, C_int_String, instantiate(A, [A_String])); | 251 // currently not supported by the implementation. |
| 254 })); | 252 //expect(true, C_int_String, instantiate(A, [A_int])); |
| 253 expect(false, C_int_String, instantiate(A, [A_String])); |
| 254 })); |
| 255 } | 255 } |
| 256 | 256 |
| 257 void testCallableSubtype() { | 257 void testCallableSubtype() { |
| 258 asyncTest(() => TypeEnvironment.create(r""" | 258 asyncTest(() => TypeEnvironment.create(r""" |
| 259 class U {} | 259 class U {} |
| 260 class V extends U {} | 260 class V extends U {} |
| 261 class W extends V {} | 261 class W extends V {} |
| 262 class A { | 262 class A { |
| 263 int call(V v, int i); | 263 int call(V v, int i); |
| 264 | 264 |
| 265 int m1(U u, int i); | 265 int m1(U u, int i); |
| 266 int m2(W w, num n); | 266 int m2(W w, num n); |
| 267 U m3(V v, int i); | 267 U m3(V v, int i); |
| 268 int m4(V v, U u); | 268 int m4(V v, U u); |
| 269 void m5(V v, int i); | 269 void m5(V v, int i); |
| 270 } | 270 } |
| 271 """).then((env) { | 271 """).then((env) { |
| 272 void expect(bool expectSubtype, DartType T, DartType S, | 272 void expect(bool expectSubtype, DartType T, DartType S, |
| 273 {bool expectMoreSpecific}) { | 273 {bool expectMoreSpecific}) { |
| 274 testTypes(env, T, S, expectSubtype, expectMoreSpecific); | 274 testTypes(env, T, S, expectSubtype, expectMoreSpecific); |
| 275 } | 275 } |
| 276 | 276 |
| 277 ClassElement classA = env.getElement('A'); | 277 ClassElement classA = env.getElement('A'); |
| 278 DartType A = classA.rawType; | 278 DartType A = classA.rawType; |
| 279 DartType function = env['Function']; | 279 DartType function = env['Function']; |
| 280 DartType call = env.getMemberType(classA, 'call'); | 280 DartType call = env.getMemberType(classA, 'call'); |
| 281 DartType m1 = env.getMemberType(classA, 'm1'); | 281 DartType m1 = env.getMemberType(classA, 'm1'); |
| 282 DartType m2 = env.getMemberType(classA, 'm2'); | 282 DartType m2 = env.getMemberType(classA, 'm2'); |
| 283 DartType m3 = env.getMemberType(classA, 'm3'); | 283 DartType m3 = env.getMemberType(classA, 'm3'); |
| 284 DartType m4 = env.getMemberType(classA, 'm4'); | 284 DartType m4 = env.getMemberType(classA, 'm4'); |
| 285 DartType m5 = env.getMemberType(classA, 'm5'); | 285 DartType m5 = env.getMemberType(classA, 'm5'); |
| 286 | 286 |
| 287 expect(true, A, function); | 287 expect(true, A, function); |
| 288 expect(true, A, call); | 288 expect(true, A, call); |
| 289 expect(true, call, m1); | 289 expect(true, call, m1); |
| 290 expect(true, A, m1); | 290 expect(true, A, m1); |
| 291 expect(true, A, m2, expectMoreSpecific: false); | 291 expect(true, A, m2, expectMoreSpecific: false); |
| 292 expect(false, A, m3); | 292 expect(false, A, m3); |
| 293 expect(false, A, m4); | 293 expect(false, A, m4); |
| 294 expect(true, A, m5); | 294 expect(true, A, m5); |
| 295 })); | 295 })); |
| 296 } | 296 } |
| 297 | 297 |
| 298 testFunctionSubtyping() { | 298 testFunctionSubtyping() { |
| 299 asyncTest(() => TypeEnvironment.create(r""" | 299 asyncTest(() => TypeEnvironment.create(r""" |
| 300 _() => null; | 300 _() => null; |
| 301 void void_() {} | 301 void void_() {} |
| 302 void void_2() {} | 302 void void_2() {} |
| 303 int int_() => 0; | 303 int int_() => 0; |
| 304 int int_2() => 0; | 304 int int_2() => 0; |
| 305 Object Object_() => null; | 305 Object Object_() => null; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 332 typedef Object Object__int(int i); | 332 typedef Object Object__int(int i); |
| 333 typedef int int__double(double d); | 333 typedef int int__double(double d); |
| 334 typedef int int__int_int(int i1, int i2); | 334 typedef int int__int_int(int i1, int i2); |
| 335 typedef void inline_void_(void f()); | 335 typedef void inline_void_(void f()); |
| 336 typedef void inline_void__int(void f(int i)); | 336 typedef void inline_void__int(void f(int i)); |
| 337 """).then(functionSubtypingHelper)); | 337 """).then(functionSubtypingHelper)); |
| 338 } | 338 } |
| 339 | 339 |
| 340 functionSubtypingHelper(TypeEnvironment env) { | 340 functionSubtypingHelper(TypeEnvironment env) { |
| 341 void expect(bool expectSubtype, String sub, String sup, | 341 void expect(bool expectSubtype, String sub, String sup, |
| 342 {bool expectMoreSpecific}) { | 342 {bool expectMoreSpecific}) { |
| 343 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); | 343 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); |
| 344 } | 344 } |
| 345 | 345 |
| 346 // () -> int <: Function | 346 // () -> int <: Function |
| 347 expect(true, 'int_', 'Function'); | 347 expect(true, 'int_', 'Function'); |
| 348 // Function <: () -> int | 348 // Function <: () -> int |
| 349 expect(false, 'Function', 'int_'); | 349 expect(false, 'Function', 'int_'); |
| 350 | 350 |
| 351 // () -> dynamic <: () -> dynamic | 351 // () -> dynamic <: () -> dynamic |
| 352 expect(true, '_', '_'); | 352 expect(true, '_', '_'); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 typedef void void__int__int_int(int i1, [int i2, int i3]); | 420 typedef void void__int__int_int(int i1, [int i2, int i3]); |
| 421 typedef void void___double(double d); | 421 typedef void void___double(double d); |
| 422 typedef void void___int_int([int i1, int i2]); | 422 typedef void void___int_int([int i1, int i2]); |
| 423 typedef void void___int_int_int([int i1, int i2, int i3]); | 423 typedef void void___int_int_int([int i1, int i2, int i3]); |
| 424 typedef void void___Object_int([Object o, int i]); | 424 typedef void void___Object_int([Object o, int i]); |
| 425 """).then(functionSubtypingOptionalHelper)); | 425 """).then(functionSubtypingOptionalHelper)); |
| 426 } | 426 } |
| 427 | 427 |
| 428 functionSubtypingOptionalHelper(TypeEnvironment env) { | 428 functionSubtypingOptionalHelper(TypeEnvironment env) { |
| 429 void expect(bool expectSubtype, String sub, String sup, | 429 void expect(bool expectSubtype, String sub, String sup, |
| 430 {bool expectMoreSpecific}) { | 430 {bool expectMoreSpecific}) { |
| 431 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); | 431 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); |
| 432 } | 432 } |
| 433 | 433 |
| 434 // Test ([int])->void <: ()->void. | 434 // Test ([int])->void <: ()->void. |
| 435 expect(true, 'void___int', 'void_'); | 435 expect(true, 'void___int', 'void_'); |
| 436 // Test ([int])->void <: (int)->void. | 436 // Test ([int])->void <: (int)->void. |
| 437 expect(true, 'void___int', 'void__int'); | 437 expect(true, 'void___int', 'void__int'); |
| 438 // Test (int)->void <: ([int])->void. | 438 // Test (int)->void <: ([int])->void. |
| 439 expect(false, 'void__int', 'void___int'); | 439 expect(false, 'void__int', 'void___int'); |
| 440 // Test ([int])->void <: ([int])->void. | 440 // Test ([int])->void <: ([int])->void. |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 typedef void void___a_int_b_int({int a, int b}); | 500 typedef void void___a_int_b_int({int a, int b}); |
| 501 typedef void void___a_int_b_int_c_int({int a, int b, int c}); | 501 typedef void void___a_int_b_int_c_int({int a, int b, int c}); |
| 502 typedef void void___a_int_c_int({int a, int c}); | 502 typedef void void___a_int_c_int({int a, int c}); |
| 503 typedef void void___b_int_c_int({int b, int c}); | 503 typedef void void___b_int_c_int({int b, int c}); |
| 504 typedef void void___c_int({int c}); | 504 typedef void void___c_int({int c}); |
| 505 """).then(functionSubtypingNamedHelper)); | 505 """).then(functionSubtypingNamedHelper)); |
| 506 } | 506 } |
| 507 | 507 |
| 508 functionSubtypingNamedHelper(TypeEnvironment env) { | 508 functionSubtypingNamedHelper(TypeEnvironment env) { |
| 509 expect(bool expectSubtype, String sub, String sup, | 509 expect(bool expectSubtype, String sub, String sup, |
| 510 {bool expectMoreSpecific}) { | 510 {bool expectMoreSpecific}) { |
| 511 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); | 511 testElementTypes(env, sub, sup, expectSubtype, expectMoreSpecific); |
| 512 } | 512 } |
| 513 | 513 |
| 514 // Test ({int a})->void <: ()->void. | 514 // Test ({int a})->void <: ()->void. |
| 515 expect(true, 'void___a_int', 'void_'); | 515 expect(true, 'void___a_int', 'void_'); |
| 516 // Test ({int a})->void <: (int)->void. | 516 // Test ({int a})->void <: (int)->void. |
| 517 expect(false, 'void___a_int', 'void__int'); | 517 expect(false, 'void___a_int', 'void__int'); |
| 518 // Test (int)->void <: ({int a})->void. | 518 // Test (int)->void <: ({int a})->void. |
| 519 expect(false, 'void__int', 'void___a_int'); | 519 expect(false, 'void__int', 'void___a_int'); |
| 520 // Test ({int a})->void <: ({int a})->void. | 520 // Test ({int a})->void <: ({int a})->void. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 547 class B<T extends Object> {} | 547 class B<T extends Object> {} |
| 548 class C<T extends num> {} | 548 class C<T extends num> {} |
| 549 class D<T extends int> {} | 549 class D<T extends int> {} |
| 550 class E<T extends S, S extends num> {} | 550 class E<T extends S, S extends num> {} |
| 551 class F<T extends num, S extends T> {} | 551 class F<T extends num, S extends T> {} |
| 552 class G<T extends T> {} | 552 class G<T extends T> {} |
| 553 class H<T extends S, S extends T> {} | 553 class H<T extends S, S extends T> {} |
| 554 class I<T extends S, S extends U, U extends T> {} | 554 class I<T extends S, S extends U, U extends T> {} |
| 555 class J<T extends S, S extends U, U extends S> {} | 555 class J<T extends S, S extends U, U extends S> {} |
| 556 """).then((env) { | 556 """).then((env) { |
| 557 void expect(bool expectSubtype, DartType T, DartType S, | 557 void expect(bool expectSubtype, DartType T, DartType S, |
| 558 {bool expectMoreSpecific}) { | 558 {bool expectMoreSpecific}) { |
| 559 testTypes(env, T, S, expectSubtype, expectMoreSpecific); | 559 testTypes(env, T, S, expectSubtype, expectMoreSpecific); |
| 560 } | 560 } |
| 561 | 561 |
| 562 ClassElement A = env.getElement('A'); | 562 ClassElement A = env.getElement('A'); |
| 563 TypeVariableType A_T = A.thisType.typeArguments[0]; | 563 TypeVariableType A_T = A.thisType.typeArguments[0]; |
| 564 ClassElement B = env.getElement('B'); | 564 ClassElement B = env.getElement('B'); |
| 565 TypeVariableType B_T = B.thisType.typeArguments[0]; | 565 TypeVariableType B_T = B.thisType.typeArguments[0]; |
| 566 ClassElement C = env.getElement('C'); | 566 ClassElement C = env.getElement('C'); |
| 567 TypeVariableType C_T = C.thisType.typeArguments[0]; | 567 TypeVariableType C_T = C.thisType.typeArguments[0]; |
| 568 ClassElement D = env.getElement('D'); | 568 ClassElement D = env.getElement('D'); |
| 569 TypeVariableType D_T = D.thisType.typeArguments[0]; | 569 TypeVariableType D_T = D.thisType.typeArguments[0]; |
| 570 ClassElement E = env.getElement('E'); | 570 ClassElement E = env.getElement('E'); |
| 571 TypeVariableType E_T = E.thisType.typeArguments[0]; | 571 TypeVariableType E_T = E.thisType.typeArguments[0]; |
| 572 TypeVariableType E_S = E.thisType.typeArguments[1]; | 572 TypeVariableType E_S = E.thisType.typeArguments[1]; |
| 573 ClassElement F = env.getElement('F'); | 573 ClassElement F = env.getElement('F'); |
| 574 TypeVariableType F_T = F.thisType.typeArguments[0]; | 574 TypeVariableType F_T = F.thisType.typeArguments[0]; |
| 575 TypeVariableType F_S = F.thisType.typeArguments[1]; | 575 TypeVariableType F_S = F.thisType.typeArguments[1]; |
| 576 ClassElement G = env.getElement('G'); | 576 ClassElement G = env.getElement('G'); |
| 577 TypeVariableType G_T = G.thisType.typeArguments[0]; | 577 TypeVariableType G_T = G.thisType.typeArguments[0]; |
| 578 ClassElement H = env.getElement('H'); | 578 ClassElement H = env.getElement('H'); |
| 579 TypeVariableType H_T = H.thisType.typeArguments[0]; | 579 TypeVariableType H_T = H.thisType.typeArguments[0]; |
| 580 TypeVariableType H_S = H.thisType.typeArguments[1]; | 580 TypeVariableType H_S = H.thisType.typeArguments[1]; |
| 581 ClassElement I = env.getElement('I'); | 581 ClassElement I = env.getElement('I'); |
| 582 TypeVariableType I_T = I.thisType.typeArguments[0]; | 582 TypeVariableType I_T = I.thisType.typeArguments[0]; |
| 583 TypeVariableType I_S = I.thisType.typeArguments[1]; | 583 TypeVariableType I_S = I.thisType.typeArguments[1]; |
| 584 TypeVariableType I_U = I.thisType.typeArguments[2]; | 584 TypeVariableType I_U = I.thisType.typeArguments[2]; |
| 585 ClassElement J = env.getElement('J'); | 585 ClassElement J = env.getElement('J'); |
| 586 TypeVariableType J_T = J.thisType.typeArguments[0]; | 586 TypeVariableType J_T = J.thisType.typeArguments[0]; |
| 587 TypeVariableType J_S = J.thisType.typeArguments[1]; | 587 TypeVariableType J_S = J.thisType.typeArguments[1]; |
| 588 TypeVariableType J_U = J.thisType.typeArguments[2]; | 588 TypeVariableType J_U = J.thisType.typeArguments[2]; |
| 589 | 589 |
| 590 DartType Object_ = env['Object']; | 590 DartType Object_ = env['Object']; |
| 591 DartType num_ = env['num']; | 591 DartType num_ = env['num']; |
| 592 DartType int_ = env['int']; | 592 DartType int_ = env['int']; |
| 593 DartType String_ = env['String']; | 593 DartType String_ = env['String']; |
| 594 DartType dynamic_ = env['dynamic']; | 594 DartType dynamic_ = env['dynamic']; |
| 595 | 595 |
| 596 // class A<T> {} | 596 // class A<T> {} |
| 597 expect(true, A_T, Object_); | 597 expect(true, A_T, Object_); |
| 598 expect(false, A_T, num_); | 598 expect(false, A_T, num_); |
| 599 expect(false, A_T, int_); | 599 expect(false, A_T, int_); |
| 600 expect(false, A_T, String_); | 600 expect(false, A_T, String_); |
| 601 expect(true, A_T, dynamic_); | 601 expect(true, A_T, dynamic_); |
| 602 expect(true, A_T, A_T); | 602 expect(true, A_T, A_T); |
| 603 expect(false, A_T, B_T); | 603 expect(false, A_T, B_T); |
| 604 | 604 |
| 605 // class B<T extends Object> {} | 605 // class B<T extends Object> {} |
| 606 expect(true, B_T, Object_); | 606 expect(true, B_T, Object_); |
| 607 expect(false, B_T, num_); | 607 expect(false, B_T, num_); |
| 608 expect(false, B_T, int_); | 608 expect(false, B_T, int_); |
| 609 expect(false, B_T, String_); | 609 expect(false, B_T, String_); |
| 610 expect(true, B_T, dynamic_); | 610 expect(true, B_T, dynamic_); |
| 611 expect(true, B_T, B_T); | 611 expect(true, B_T, B_T); |
| 612 expect(false, B_T, A_T); | 612 expect(false, B_T, A_T); |
| 613 | 613 |
| 614 // class C<T extends num> {} | 614 // class C<T extends num> {} |
| 615 expect(true, C_T, Object_); | 615 expect(true, C_T, Object_); |
| 616 expect(true, C_T, num_); | 616 expect(true, C_T, num_); |
| 617 expect(false, C_T, int_); | 617 expect(false, C_T, int_); |
| 618 expect(false, C_T, String_); | 618 expect(false, C_T, String_); |
| 619 expect(true, C_T, dynamic_); | 619 expect(true, C_T, dynamic_); |
| 620 expect(true, C_T, C_T); | 620 expect(true, C_T, C_T); |
| 621 expect(false, C_T, A_T); | 621 expect(false, C_T, A_T); |
| 622 | 622 |
| 623 // class D<T extends int> {} | 623 // class D<T extends int> {} |
| 624 expect(true, D_T, Object_); | 624 expect(true, D_T, Object_); |
| 625 expect(true, D_T, num_); | 625 expect(true, D_T, num_); |
| 626 expect(true, D_T, int_); | 626 expect(true, D_T, int_); |
| 627 expect(false, D_T, String_); | 627 expect(false, D_T, String_); |
| 628 expect(true, D_T, dynamic_); | 628 expect(true, D_T, dynamic_); |
| 629 expect(true, D_T, D_T); | 629 expect(true, D_T, D_T); |
| 630 expect(false, D_T, A_T); | 630 expect(false, D_T, A_T); |
| 631 | 631 |
| 632 // class E<T extends S, S extends num> {} | 632 // class E<T extends S, S extends num> {} |
| 633 expect(true, E_T, Object_); | 633 expect(true, E_T, Object_); |
| 634 expect(true, E_T, num_); | 634 expect(true, E_T, num_); |
| 635 expect(false, E_T, int_); | 635 expect(false, E_T, int_); |
| 636 expect(false, E_T, String_); | 636 expect(false, E_T, String_); |
| 637 expect(true, E_T, dynamic_); | 637 expect(true, E_T, dynamic_); |
| 638 expect(true, E_T, E_T); | 638 expect(true, E_T, E_T); |
| 639 expect(true, E_T, E_S); | 639 expect(true, E_T, E_S); |
| 640 expect(false, E_T, A_T); | 640 expect(false, E_T, A_T); |
| 641 | 641 |
| 642 expect(true, E_S, Object_); | 642 expect(true, E_S, Object_); |
| 643 expect(true, E_S, num_); | 643 expect(true, E_S, num_); |
| 644 expect(false, E_S, int_); | 644 expect(false, E_S, int_); |
| 645 expect(false, E_S, String_); | 645 expect(false, E_S, String_); |
| 646 expect(true, E_S, dynamic_); | 646 expect(true, E_S, dynamic_); |
| 647 expect(false, E_S, E_T); | 647 expect(false, E_S, E_T); |
| 648 expect(true, E_S, E_S); | 648 expect(true, E_S, E_S); |
| 649 expect(false, E_S, A_T); | 649 expect(false, E_S, A_T); |
| 650 | 650 |
| 651 // class F<T extends num, S extends T> {} | 651 // class F<T extends num, S extends T> {} |
| 652 expect(true, F_T, Object_); | 652 expect(true, F_T, Object_); |
| 653 expect(true, F_T, num_); | 653 expect(true, F_T, num_); |
| 654 expect(false, F_T, int_); | 654 expect(false, F_T, int_); |
| 655 expect(false, F_T, String_); | 655 expect(false, F_T, String_); |
| 656 expect(true, F_T, dynamic_); | 656 expect(true, F_T, dynamic_); |
| 657 expect(false, F_T, F_S); | 657 expect(false, F_T, F_S); |
| 658 expect(true, F_T, F_T); | 658 expect(true, F_T, F_T); |
| 659 expect(false, F_T, A_T); | 659 expect(false, F_T, A_T); |
| 660 | 660 |
| 661 expect(true, F_S, Object_); | 661 expect(true, F_S, Object_); |
| 662 expect(true, F_S, num_); | 662 expect(true, F_S, num_); |
| 663 expect(false, F_S, int_); | 663 expect(false, F_S, int_); |
| 664 expect(false, F_S, String_); | 664 expect(false, F_S, String_); |
| 665 expect(true, F_S, dynamic_); | 665 expect(true, F_S, dynamic_); |
| 666 expect(true, F_S, F_S); | 666 expect(true, F_S, F_S); |
| 667 expect(true, F_S, F_T); | 667 expect(true, F_S, F_T); |
| 668 expect(false, F_S, A_T); | 668 expect(false, F_S, A_T); |
| 669 | 669 |
| 670 // class G<T extends T> {} | 670 // class G<T extends T> {} |
| 671 expect(true, G_T, Object_); | 671 expect(true, G_T, Object_); |
| 672 expect(false, G_T, num_); | 672 expect(false, G_T, num_); |
| 673 expect(false, G_T, int_); | 673 expect(false, G_T, int_); |
| 674 expect(false, G_T, String_); | 674 expect(false, G_T, String_); |
| 675 expect(true, G_T, dynamic_); | 675 expect(true, G_T, dynamic_); |
| 676 expect(true, G_T, G_T); | 676 expect(true, G_T, G_T); |
| 677 expect(false, G_T, A_T); | 677 expect(false, G_T, A_T); |
| 678 | 678 |
| 679 // class H<T extends S, S extends T> {} | 679 // class H<T extends S, S extends T> {} |
| 680 expect(true, H_T, Object_); | 680 expect(true, H_T, Object_); |
| 681 expect(false, H_T, num_); | 681 expect(false, H_T, num_); |
| 682 expect(false, H_T, int_); | 682 expect(false, H_T, int_); |
| 683 expect(false, H_T, String_); | 683 expect(false, H_T, String_); |
| 684 expect(true, H_T, dynamic_); | 684 expect(true, H_T, dynamic_); |
| 685 expect(true, H_T, H_T); | 685 expect(true, H_T, H_T); |
| 686 expect(true, H_T, H_S); | 686 expect(true, H_T, H_S); |
| 687 expect(false, H_T, A_T); | 687 expect(false, H_T, A_T); |
| 688 | 688 |
| 689 expect(true, H_S, Object_); | 689 expect(true, H_S, Object_); |
| 690 expect(false, H_S, num_); | 690 expect(false, H_S, num_); |
| 691 expect(false, H_S, int_); | 691 expect(false, H_S, int_); |
| 692 expect(false, H_S, String_); | 692 expect(false, H_S, String_); |
| 693 expect(true, H_S, dynamic_); | 693 expect(true, H_S, dynamic_); |
| 694 expect(true, H_S, H_T); | 694 expect(true, H_S, H_T); |
| 695 expect(true, H_S, H_S); | 695 expect(true, H_S, H_S); |
| 696 expect(false, H_S, A_T); | 696 expect(false, H_S, A_T); |
| 697 | 697 |
| 698 // class I<T extends S, S extends U, U extends T> {} | 698 // class I<T extends S, S extends U, U extends T> {} |
| 699 expect(true, I_T, Object_); | 699 expect(true, I_T, Object_); |
| 700 expect(false, I_T, num_); | 700 expect(false, I_T, num_); |
| 701 expect(false, I_T, int_); | 701 expect(false, I_T, int_); |
| 702 expect(false, I_T, String_); | 702 expect(false, I_T, String_); |
| 703 expect(true, I_T, dynamic_); | 703 expect(true, I_T, dynamic_); |
| 704 expect(true, I_T, I_T); | 704 expect(true, I_T, I_T); |
| 705 expect(true, I_T, I_S); | 705 expect(true, I_T, I_S); |
| 706 expect(true, I_T, I_U); | 706 expect(true, I_T, I_U); |
| 707 expect(false, I_T, A_T); | 707 expect(false, I_T, A_T); |
| 708 | 708 |
| 709 expect(true, I_S, Object_); | 709 expect(true, I_S, Object_); |
| 710 expect(false, I_S, num_); | 710 expect(false, I_S, num_); |
| 711 expect(false, I_S, int_); | 711 expect(false, I_S, int_); |
| 712 expect(false, I_S, String_); | 712 expect(false, I_S, String_); |
| 713 expect(true, I_S, dynamic_); | 713 expect(true, I_S, dynamic_); |
| 714 expect(true, I_S, I_T); | 714 expect(true, I_S, I_T); |
| 715 expect(true, I_S, I_S); | 715 expect(true, I_S, I_S); |
| 716 expect(true, I_S, I_U); | 716 expect(true, I_S, I_U); |
| 717 expect(false, I_S, A_T); | 717 expect(false, I_S, A_T); |
| 718 | 718 |
| 719 expect(true, I_U, Object_); | 719 expect(true, I_U, Object_); |
| 720 expect(false, I_U, num_); | 720 expect(false, I_U, num_); |
| 721 expect(false, I_U, int_); | 721 expect(false, I_U, int_); |
| 722 expect(false, I_U, String_); | 722 expect(false, I_U, String_); |
| 723 expect(true, I_U, dynamic_); | 723 expect(true, I_U, dynamic_); |
| 724 expect(true, I_U, I_T); | 724 expect(true, I_U, I_T); |
| 725 expect(true, I_U, I_S); | 725 expect(true, I_U, I_S); |
| 726 expect(true, I_U, I_U); | 726 expect(true, I_U, I_U); |
| 727 expect(false, I_U, A_T); | 727 expect(false, I_U, A_T); |
| 728 | 728 |
| 729 // class J<T extends S, S extends U, U extends S> {} | 729 // class J<T extends S, S extends U, U extends S> {} |
| 730 expect(true, J_T, Object_); | 730 expect(true, J_T, Object_); |
| 731 expect(false, J_T, num_); | 731 expect(false, J_T, num_); |
| 732 expect(false, J_T, int_); | 732 expect(false, J_T, int_); |
| 733 expect(false, J_T, String_); | 733 expect(false, J_T, String_); |
| 734 expect(true, J_T, dynamic_); | 734 expect(true, J_T, dynamic_); |
| 735 expect(true, J_T, J_T); | 735 expect(true, J_T, J_T); |
| 736 expect(true, J_T, J_S); | 736 expect(true, J_T, J_S); |
| 737 expect(true, J_T, J_U); | 737 expect(true, J_T, J_U); |
| 738 expect(false, J_T, A_T); | 738 expect(false, J_T, A_T); |
| 739 | 739 |
| 740 expect(true, J_S, Object_); | 740 expect(true, J_S, Object_); |
| 741 expect(false, J_S, num_); | 741 expect(false, J_S, num_); |
| 742 expect(false, J_S, int_); | 742 expect(false, J_S, int_); |
| 743 expect(false, J_S, String_); | 743 expect(false, J_S, String_); |
| 744 expect(true, J_S, dynamic_); | 744 expect(true, J_S, dynamic_); |
| 745 expect(false, J_S, J_T); | 745 expect(false, J_S, J_T); |
| 746 expect(true, J_S, J_S); | 746 expect(true, J_S, J_S); |
| 747 expect(true, J_S, J_U); | 747 expect(true, J_S, J_U); |
| 748 expect(false, J_S, A_T); | 748 expect(false, J_S, A_T); |
| 749 | 749 |
| 750 expect(true, J_U, Object_); | 750 expect(true, J_U, Object_); |
| 751 expect(false, J_U, num_); | 751 expect(false, J_U, num_); |
| 752 expect(false, J_U, int_); | 752 expect(false, J_U, int_); |
| 753 expect(false, J_U, String_); | 753 expect(false, J_U, String_); |
| 754 expect(true, J_U, dynamic_); | 754 expect(true, J_U, dynamic_); |
| 755 expect(false, J_U, J_T); | 755 expect(false, J_U, J_T); |
| 756 expect(true, J_U, J_S); | 756 expect(true, J_U, J_S); |
| 757 expect(true, J_U, J_U); | 757 expect(true, J_U, J_U); |
| 758 expect(false, J_U, A_T); | 758 expect(false, J_U, A_T); |
| 759 })); | 759 })); |
| 760 } | 760 } |
| OLD | NEW |