| 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 'type_test_helper.dart'; | 8 import 'type_test_helper.dart'; |
| 9 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart'; | 9 import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart'; |
| 10 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar
t" | 10 import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dar
t" |
| 11 show Element, ClassElement; | 11 show Element, ClassElement; |
| 12 | 12 |
| 13 void main() { | 13 void main() { |
| 14 testInterfaceSubtype(); | 14 testInterfaceSubtype(); |
| 15 testCallableSubtype(); | 15 testCallableSubtype(); |
| 16 testFunctionSubtyping(); | 16 testFunctionSubtyping(); |
| 17 testTypedefSubtyping(); | 17 testTypedefSubtyping(); |
| 18 testFunctionSubtypingOptional(); | 18 testFunctionSubtypingOptional(); |
| 19 testTypedefSubtypingOptional(); | 19 testTypedefSubtypingOptional(); |
| 20 testFunctionSubtypingNamed(); | 20 testFunctionSubtypingNamed(); |
| 21 testTypedefSubtypingNamed(); | 21 testTypedefSubtypingNamed(); |
| 22 testTypeVariableSubtype(); | 22 testTypeVariableSubtype(); |
| 23 } | 23 } |
| 24 | 24 |
| 25 void testInterfaceSubtype() { | 25 void testInterfaceSubtype() { |
| 26 var env = new TypeEnvironment(r""" | 26 TypeEnvironment.create(r""" |
| 27 class A<T> {} | 27 class A<T> {} |
| 28 class B<T1, T2> extends A<T1> {} | 28 class B<T1, T2> extends A<T1> {} |
| 29 // TODO(johnniwinther): Inheritance with different type arguments is | 29 // TODO(johnniwinther): Inheritance with different type arguments is |
| 30 // currently not supported by the implementation. | 30 // currently not supported by the implementation. |
| 31 class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {} | 31 class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {} |
| 32 """); | 32 """).then((env) { |
| 33 | 33 |
| 34 void expect(bool value, DartType T, DartType S) { | 34 void expect(bool value, DartType T, DartType S) { |
| 35 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); | 35 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
| 36 } | 36 } |
| 37 | 37 |
| 38 ClassElement A = env.getElement('A'); | 38 ClassElement A = env.getElement('A'); |
| 39 ClassElement B = env.getElement('B'); | 39 ClassElement B = env.getElement('B'); |
| 40 ClassElement C = env.getElement('C'); | 40 ClassElement C = env.getElement('C'); |
| 41 DartType Object_ = env['Object']; | 41 DartType Object_ = env['Object']; |
| 42 DartType num_ = env['num']; | 42 DartType num_ = env['num']; |
| 43 DartType int_ = env['int']; | 43 DartType int_ = env['int']; |
| 44 DartType String_ = env['String']; | 44 DartType String_ = env['String']; |
| 45 DartType dynamic_ = env['dynamic']; | 45 DartType dynamic_ = env['dynamic']; |
| 46 | 46 |
| 47 expect(true, Object_, Object_); | 47 expect(true, Object_, Object_); |
| 48 expect(true, num_, Object_); | 48 expect(true, num_, Object_); |
| 49 expect(true, int_, Object_); | 49 expect(true, int_, Object_); |
| 50 expect(true, String_, Object_); | 50 expect(true, String_, Object_); |
| 51 expect(true, dynamic_, Object_); | 51 expect(true, dynamic_, Object_); |
| 52 | 52 |
| 53 expect(false, Object_, num_); | 53 expect(false, Object_, num_); |
| 54 expect(true, num_, num_); | 54 expect(true, num_, num_); |
| 55 expect(true, int_, num_); | 55 expect(true, int_, num_); |
| 56 expect(false, String_, num_); | 56 expect(false, String_, num_); |
| 57 expect(true, dynamic_, num_); | 57 expect(true, dynamic_, num_); |
| 58 | 58 |
| 59 expect(false, Object_, int_); | 59 expect(false, Object_, int_); |
| 60 expect(false, num_, int_); | 60 expect(false, num_, int_); |
| 61 expect(true, int_, int_); | 61 expect(true, int_, int_); |
| 62 expect(false, String_, int_); | 62 expect(false, String_, int_); |
| 63 expect(true, dynamic_, int_); | 63 expect(true, dynamic_, int_); |
| 64 | 64 |
| 65 expect(false, Object_, String_); | 65 expect(false, Object_, String_); |
| 66 expect(false, num_, String_); | 66 expect(false, num_, String_); |
| 67 expect(false, int_, String_); | 67 expect(false, int_, String_); |
| 68 expect(true, String_, String_); | 68 expect(true, String_, String_); |
| 69 expect(true, dynamic_, String_); | 69 expect(true, dynamic_, String_); |
| 70 | 70 |
| 71 expect(true, Object_, dynamic_); | 71 expect(true, Object_, dynamic_); |
| 72 expect(true, num_, dynamic_); | 72 expect(true, num_, dynamic_); |
| 73 expect(true, int_, dynamic_); | 73 expect(true, int_, dynamic_); |
| 74 expect(true, String_, dynamic_); | 74 expect(true, String_, dynamic_); |
| 75 expect(true, dynamic_, dynamic_); | 75 expect(true, dynamic_, dynamic_); |
| 76 | 76 |
| 77 DartType A_Object = instantiate(A, [Object_]); | 77 DartType A_Object = instantiate(A, [Object_]); |
| 78 DartType A_num = instantiate(A, [num_]); | 78 DartType A_num = instantiate(A, [num_]); |
| 79 DartType A_int = instantiate(A, [int_]); | 79 DartType A_int = instantiate(A, [int_]); |
| 80 DartType A_String = instantiate(A, [String_]); | 80 DartType A_String = instantiate(A, [String_]); |
| 81 DartType A_dynamic = instantiate(A, [dynamic_]); | 81 DartType A_dynamic = instantiate(A, [dynamic_]); |
| 82 | 82 |
| 83 expect(true, A_Object, Object_); | 83 expect(true, A_Object, Object_); |
| 84 expect(false, A_Object, num_); | 84 expect(false, A_Object, num_); |
| 85 expect(false, A_Object, int_); | 85 expect(false, A_Object, int_); |
| 86 expect(false, A_Object, String_); | 86 expect(false, A_Object, String_); |
| 87 expect(true, A_Object, dynamic_); | 87 expect(true, A_Object, dynamic_); |
| 88 | 88 |
| 89 expect(true, A_Object, A_Object); | 89 expect(true, A_Object, A_Object); |
| 90 expect(true, A_num, A_Object); | 90 expect(true, A_num, A_Object); |
| 91 expect(true, A_int, A_Object); | 91 expect(true, A_int, A_Object); |
| 92 expect(true, A_String, A_Object); | 92 expect(true, A_String, A_Object); |
| 93 expect(true, A_dynamic, A_Object); | 93 expect(true, A_dynamic, A_Object); |
| 94 | 94 |
| 95 expect(false, A_Object, A_num); | 95 expect(false, A_Object, A_num); |
| 96 expect(true, A_num, A_num); | 96 expect(true, A_num, A_num); |
| 97 expect(true, A_int, A_num); | 97 expect(true, A_int, A_num); |
| 98 expect(false, A_String, A_num); | 98 expect(false, A_String, A_num); |
| 99 expect(true, A_dynamic, A_num); | 99 expect(true, A_dynamic, A_num); |
| 100 | 100 |
| 101 expect(false, A_Object, A_int); | 101 expect(false, A_Object, A_int); |
| 102 expect(false, A_num, A_int); | 102 expect(false, A_num, A_int); |
| 103 expect(true, A_int, A_int); | 103 expect(true, A_int, A_int); |
| 104 expect(false, A_String, A_int); | 104 expect(false, A_String, A_int); |
| 105 expect(true, A_dynamic, A_int); | 105 expect(true, A_dynamic, A_int); |
| 106 | 106 |
| 107 expect(false, A_Object, A_String); | 107 expect(false, A_Object, A_String); |
| 108 expect(false, A_num, A_String); | 108 expect(false, A_num, A_String); |
| 109 expect(false, A_int, A_String); | 109 expect(false, A_int, A_String); |
| 110 expect(true, A_String, A_String); | 110 expect(true, A_String, A_String); |
| 111 expect(true, A_dynamic, A_String); | 111 expect(true, A_dynamic, A_String); |
| 112 | 112 |
| 113 expect(true, A_Object, A_dynamic); | 113 expect(true, A_Object, A_dynamic); |
| 114 expect(true, A_num, A_dynamic); | 114 expect(true, A_num, A_dynamic); |
| 115 expect(true, A_int, A_dynamic); | 115 expect(true, A_int, A_dynamic); |
| 116 expect(true, A_String, A_dynamic); | 116 expect(true, A_String, A_dynamic); |
| 117 expect(true, A_dynamic, A_dynamic); | 117 expect(true, A_dynamic, A_dynamic); |
| 118 | 118 |
| 119 DartType B_Object_Object = instantiate(B, [Object_, Object_]); | 119 DartType B_Object_Object = instantiate(B, [Object_, Object_]); |
| 120 DartType B_num_num = instantiate(B, [num_, num_]); | 120 DartType B_num_num = instantiate(B, [num_, num_]); |
| 121 DartType B_int_num = instantiate(B, [int_, num_]); | 121 DartType B_int_num = instantiate(B, [int_, num_]); |
| 122 DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); | 122 DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]); |
| 123 DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); | 123 DartType B_String_dynamic = instantiate(B, [String_, dynamic_]); |
| 124 | 124 |
| 125 expect(true, B_Object_Object, Object_); | 125 expect(true, B_Object_Object, Object_); |
| 126 expect(true, B_Object_Object, A_Object); | 126 expect(true, B_Object_Object, A_Object); |
| 127 expect(false, B_Object_Object, A_num); | 127 expect(false, B_Object_Object, A_num); |
| 128 expect(false, B_Object_Object, A_int); | 128 expect(false, B_Object_Object, A_int); |
| 129 expect(false, B_Object_Object, A_String); | 129 expect(false, B_Object_Object, A_String); |
| 130 expect(true, B_Object_Object, A_dynamic); | 130 expect(true, B_Object_Object, A_dynamic); |
| 131 | 131 |
| 132 expect(true, B_num_num, Object_); | 132 expect(true, B_num_num, Object_); |
| 133 expect(true, B_num_num, A_Object); | 133 expect(true, B_num_num, A_Object); |
| 134 expect(true, B_num_num, A_num); | 134 expect(true, B_num_num, A_num); |
| 135 expect(false, B_num_num, A_int); | 135 expect(false, B_num_num, A_int); |
| 136 expect(false, B_num_num, A_String); | 136 expect(false, B_num_num, A_String); |
| 137 expect(true, B_num_num, A_dynamic); | 137 expect(true, B_num_num, A_dynamic); |
| 138 | 138 |
| 139 expect(true, B_int_num, Object_); | 139 expect(true, B_int_num, Object_); |
| 140 expect(true, B_int_num, A_Object); | 140 expect(true, B_int_num, A_Object); |
| 141 expect(true, B_int_num, A_num); | 141 expect(true, B_int_num, A_num); |
| 142 expect(true, B_int_num, A_int); | 142 expect(true, B_int_num, A_int); |
| 143 expect(false, B_int_num, A_String); | 143 expect(false, B_int_num, A_String); |
| 144 expect(true, B_int_num, A_dynamic); | 144 expect(true, B_int_num, A_dynamic); |
| 145 | 145 |
| 146 expect(true, B_dynamic_dynamic, Object_); | 146 expect(true, B_dynamic_dynamic, Object_); |
| 147 expect(true, B_dynamic_dynamic, A_Object); | 147 expect(true, B_dynamic_dynamic, A_Object); |
| 148 expect(true, B_dynamic_dynamic, A_num); | 148 expect(true, B_dynamic_dynamic, A_num); |
| 149 expect(true, B_dynamic_dynamic, A_int); | 149 expect(true, B_dynamic_dynamic, A_int); |
| 150 expect(true, B_dynamic_dynamic, A_String); | 150 expect(true, B_dynamic_dynamic, A_String); |
| 151 expect(true, B_dynamic_dynamic, A_dynamic); | 151 expect(true, B_dynamic_dynamic, A_dynamic); |
| 152 | 152 |
| 153 expect(true, B_String_dynamic, Object_); | 153 expect(true, B_String_dynamic, Object_); |
| 154 expect(true, B_String_dynamic, A_Object); | 154 expect(true, B_String_dynamic, A_Object); |
| 155 expect(false, B_String_dynamic, A_num); | 155 expect(false, B_String_dynamic, A_num); |
| 156 expect(false, B_String_dynamic, A_int); | 156 expect(false, B_String_dynamic, A_int); |
| 157 expect(true, B_String_dynamic, A_String); | 157 expect(true, B_String_dynamic, A_String); |
| 158 expect(true, B_String_dynamic, A_dynamic); | 158 expect(true, B_String_dynamic, A_dynamic); |
| 159 | 159 |
| 160 expect(true, B_Object_Object, B_Object_Object); | 160 expect(true, B_Object_Object, B_Object_Object); |
| 161 expect(true, B_num_num, B_Object_Object); | 161 expect(true, B_num_num, B_Object_Object); |
| 162 expect(true, B_int_num, B_Object_Object); | 162 expect(true, B_int_num, B_Object_Object); |
| 163 expect(true, B_dynamic_dynamic, B_Object_Object); | 163 expect(true, B_dynamic_dynamic, B_Object_Object); |
| 164 expect(true, B_String_dynamic, B_Object_Object); | 164 expect(true, B_String_dynamic, B_Object_Object); |
| 165 | 165 |
| 166 expect(false, B_Object_Object, B_num_num); | 166 expect(false, B_Object_Object, B_num_num); |
| 167 expect(true, B_num_num, B_num_num); | 167 expect(true, B_num_num, B_num_num); |
| 168 expect(true, B_int_num, B_num_num); | 168 expect(true, B_int_num, B_num_num); |
| 169 expect(true, B_dynamic_dynamic, B_num_num); | 169 expect(true, B_dynamic_dynamic, B_num_num); |
| 170 expect(false, B_String_dynamic, B_num_num); | 170 expect(false, B_String_dynamic, B_num_num); |
| 171 | 171 |
| 172 expect(false, B_Object_Object, B_int_num); | 172 expect(false, B_Object_Object, B_int_num); |
| 173 expect(false, B_num_num, B_int_num); | 173 expect(false, B_num_num, B_int_num); |
| 174 expect(true, B_int_num, B_int_num); | 174 expect(true, B_int_num, B_int_num); |
| 175 expect(true, B_dynamic_dynamic, B_int_num); | 175 expect(true, B_dynamic_dynamic, B_int_num); |
| 176 expect(false, B_String_dynamic, B_int_num); | 176 expect(false, B_String_dynamic, B_int_num); |
| 177 | 177 |
| 178 expect(true, B_Object_Object, B_dynamic_dynamic); | 178 expect(true, B_Object_Object, B_dynamic_dynamic); |
| 179 expect(true, B_num_num, B_dynamic_dynamic); | 179 expect(true, B_num_num, B_dynamic_dynamic); |
| 180 expect(true, B_int_num, B_dynamic_dynamic); | 180 expect(true, B_int_num, B_dynamic_dynamic); |
| 181 expect(true, B_dynamic_dynamic, B_dynamic_dynamic); | 181 expect(true, B_dynamic_dynamic, B_dynamic_dynamic); |
| 182 expect(true, B_String_dynamic, B_dynamic_dynamic); | 182 expect(true, B_String_dynamic, B_dynamic_dynamic); |
| 183 | 183 |
| 184 expect(false, B_Object_Object, B_String_dynamic); | 184 expect(false, B_Object_Object, B_String_dynamic); |
| 185 expect(false, B_num_num, B_String_dynamic); | 185 expect(false, B_num_num, B_String_dynamic); |
| 186 expect(false, B_int_num, B_String_dynamic); | 186 expect(false, B_int_num, B_String_dynamic); |
| 187 expect(true, B_dynamic_dynamic, B_String_dynamic); | 187 expect(true, B_dynamic_dynamic, B_String_dynamic); |
| 188 expect(true, B_String_dynamic, B_String_dynamic); | 188 expect(true, B_String_dynamic, B_String_dynamic); |
| 189 | 189 |
| 190 DartType C_Object_Object = instantiate(C, [Object_, Object_]); | 190 DartType C_Object_Object = instantiate(C, [Object_, Object_]); |
| 191 DartType C_num_num = instantiate(C, [num_, num_]); | 191 DartType C_num_num = instantiate(C, [num_, num_]); |
| 192 DartType C_int_String = instantiate(C, [int_, String_]); | 192 DartType C_int_String = instantiate(C, [int_, String_]); |
| 193 DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); | 193 DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]); |
| 194 | 194 |
| 195 expect(true, C_Object_Object, B_Object_Object); | 195 expect(true, C_Object_Object, B_Object_Object); |
| 196 expect(false, C_Object_Object, B_num_num); | 196 expect(false, C_Object_Object, B_num_num); |
| 197 expect(false, C_Object_Object, B_int_num); | 197 expect(false, C_Object_Object, B_int_num); |
| 198 expect(true, C_Object_Object, B_dynamic_dynamic); | 198 expect(true, C_Object_Object, B_dynamic_dynamic); |
| 199 expect(false, C_Object_Object, B_String_dynamic); | 199 expect(false, C_Object_Object, B_String_dynamic); |
| 200 | 200 |
| 201 expect(true, C_num_num, B_Object_Object); | 201 expect(true, C_num_num, B_Object_Object); |
| 202 expect(true, C_num_num, B_num_num); | 202 expect(true, C_num_num, B_num_num); |
| 203 expect(false, C_num_num, B_int_num); | 203 expect(false, C_num_num, B_int_num); |
| 204 expect(true, C_num_num, B_dynamic_dynamic); | 204 expect(true, C_num_num, B_dynamic_dynamic); |
| 205 expect(false, C_num_num, B_String_dynamic); | 205 expect(false, C_num_num, B_String_dynamic); |
| 206 | 206 |
| 207 expect(true, C_int_String, B_Object_Object); | 207 expect(true, C_int_String, B_Object_Object); |
| 208 expect(false, C_int_String, B_num_num); | 208 expect(false, C_int_String, B_num_num); |
| 209 expect(false, C_int_String, B_int_num); | 209 expect(false, C_int_String, B_int_num); |
| 210 expect(true, C_int_String, B_dynamic_dynamic); | 210 expect(true, C_int_String, B_dynamic_dynamic); |
| 211 expect(true, C_int_String, B_String_dynamic); | 211 expect(true, C_int_String, B_String_dynamic); |
| 212 | 212 |
| 213 expect(true, C_dynamic_dynamic, B_Object_Object); | 213 expect(true, C_dynamic_dynamic, B_Object_Object); |
| 214 expect(true, C_dynamic_dynamic, B_num_num); | 214 expect(true, C_dynamic_dynamic, B_num_num); |
| 215 expect(true, C_dynamic_dynamic, B_int_num); | 215 expect(true, C_dynamic_dynamic, B_int_num); |
| 216 expect(true, C_dynamic_dynamic, B_dynamic_dynamic); | 216 expect(true, C_dynamic_dynamic, B_dynamic_dynamic); |
| 217 expect(true, C_dynamic_dynamic, B_String_dynamic); | 217 expect(true, C_dynamic_dynamic, B_String_dynamic); |
| 218 | 218 |
| 219 expect(false, C_int_String, A_int); | 219 expect(false, C_int_String, A_int); |
| 220 expect(true, C_int_String, A_String); | 220 expect(true, C_int_String, A_String); |
| 221 // TODO(johnniwinther): Inheritance with different type arguments is | 221 // TODO(johnniwinther): Inheritance with different type arguments is |
| 222 // currently not supported by the implementation. | 222 // currently not supported by the implementation. |
| 223 //expect(true, C_int_String, instantiate(A, [A_int])); | 223 //expect(true, C_int_String, instantiate(A, [A_int])); |
| 224 expect(false, C_int_String, instantiate(A, [A_String])); | 224 expect(false, C_int_String, instantiate(A, [A_String])); |
| 225 }); |
| 225 } | 226 } |
| 226 | 227 |
| 227 void testCallableSubtype() { | 228 void testCallableSubtype() { |
| 228 | 229 TypeEnvironment.create(r""" |
| 229 var env = new TypeEnvironment(r""" | |
| 230 class U {} | 230 class U {} |
| 231 class V extends U {} | 231 class V extends U {} |
| 232 class W extends V {} | 232 class W extends V {} |
| 233 class A { | 233 class A { |
| 234 int call(V v, int i); | 234 int call(V v, int i); |
| 235 | 235 |
| 236 int m1(U u, int i); | 236 int m1(U u, int i); |
| 237 int m2(W w, num n); | 237 int m2(W w, num n); |
| 238 U m3(V v, int i); | 238 U m3(V v, int i); |
| 239 int m4(V v, U u); | 239 int m4(V v, U u); |
| 240 void m5(V v, int i); | 240 void m5(V v, int i); |
| 241 } | 241 } |
| 242 """); | 242 """).then((env) { |
| 243 void expect(bool value, DartType T, DartType S) { |
| 244 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
| 245 } |
| 243 | 246 |
| 244 void expect(bool value, DartType T, DartType S) { | 247 ClassElement classA = env.getElement('A'); |
| 245 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); | 248 DartType A = classA.rawType; |
| 246 } | 249 DartType function = env['Function']; |
| 250 DartType m1 = env.getMemberType(classA, 'm1'); |
| 251 DartType m2 = env.getMemberType(classA, 'm2'); |
| 252 DartType m3 = env.getMemberType(classA, 'm3'); |
| 253 DartType m4 = env.getMemberType(classA, 'm4'); |
| 254 DartType m5 = env.getMemberType(classA, 'm5'); |
| 247 | 255 |
| 248 ClassElement classA = env.getElement('A'); | 256 expect(true, A, function); |
| 249 DartType A = classA.rawType; | 257 expect(true, A, m1); |
| 250 DartType function = env['Function']; | 258 expect(true, A, m2); |
| 251 DartType m1 = env.getMemberType(classA, 'm1'); | 259 expect(false, A, m3); |
| 252 DartType m2 = env.getMemberType(classA, 'm2'); | 260 expect(false, A, m4); |
| 253 DartType m3 = env.getMemberType(classA, 'm3'); | 261 expect(true, A, m5); |
| 254 DartType m4 = env.getMemberType(classA, 'm4'); | 262 }); |
| 255 DartType m5 = env.getMemberType(classA, 'm5'); | |
| 256 | |
| 257 expect(true, A, function); | |
| 258 expect(true, A, m1); | |
| 259 expect(true, A, m2); | |
| 260 expect(false, A, m3); | |
| 261 expect(false, A, m4); | |
| 262 expect(true, A, m5); | |
| 263 } | 263 } |
| 264 | 264 |
| 265 testFunctionSubtyping() { | 265 testFunctionSubtyping() { |
| 266 var env = new TypeEnvironment(r""" | 266 TypeEnvironment.create(r""" |
| 267 _() => null; | 267 _() => null; |
| 268 void void_() {} | 268 void void_() {} |
| 269 void void_2() {} | 269 void void_2() {} |
| 270 int int_() => 0; | 270 int int_() => 0; |
| 271 int int_2() => 0; | 271 int int_2() => 0; |
| 272 Object Object_() => null; | 272 Object Object_() => null; |
| 273 double double_() => 0.0; | 273 double double_() => 0.0; |
| 274 void void__int(int i) {} | 274 void void__int(int i) {} |
| 275 int int__int(int i) => 0; | 275 int int__int(int i) => 0; |
| 276 int int__int2(int i) => 0; | 276 int int__int2(int i) => 0; |
| 277 int int__Object(Object o) => 0; | 277 int int__Object(Object o) => 0; |
| 278 Object Object__int(int i) => null; | 278 Object Object__int(int i) => null; |
| 279 int int__double(double d) => 0; | 279 int int__double(double d) => 0; |
| 280 int int__int_int(int i1, int i2) => 0; | 280 int int__int_int(int i1, int i2) => 0; |
| 281 void inline_void_(void f()) {} | 281 void inline_void_(void f()) {} |
| 282 void inline_void__int(void f(int i)) {} | 282 void inline_void__int(void f(int i)) {} |
| 283 """); | 283 """).then(functionSubtypingHelper); |
| 284 functionSubtypingHelper(env); | |
| 285 } | 284 } |
| 286 | 285 |
| 287 testTypedefSubtyping() { | 286 testTypedefSubtyping() { |
| 288 var env = new TypeEnvironment(r""" | 287 TypeEnvironment.create(r""" |
| 289 typedef _(); | 288 typedef _(); |
| 290 typedef void void_(); | 289 typedef void void_(); |
| 291 typedef void void_2(); | 290 typedef void void_2(); |
| 292 typedef int int_(); | 291 typedef int int_(); |
| 293 typedef int int_2(); | 292 typedef int int_2(); |
| 294 typedef Object Object_(); | 293 typedef Object Object_(); |
| 295 typedef double double_(); | 294 typedef double double_(); |
| 296 typedef void void__int(int i); | 295 typedef void void__int(int i); |
| 297 typedef int int__int(int i); | 296 typedef int int__int(int i); |
| 298 typedef int int__int2(int i); | 297 typedef int int__int2(int i); |
| 299 typedef int int__Object(Object o); | 298 typedef int int__Object(Object o); |
| 300 typedef Object Object__int(int i); | 299 typedef Object Object__int(int i); |
| 301 typedef int int__double(double d); | 300 typedef int int__double(double d); |
| 302 typedef int int__int_int(int i1, int i2); | 301 typedef int int__int_int(int i1, int i2); |
| 303 typedef void inline_void_(void f()); | 302 typedef void inline_void_(void f()); |
| 304 typedef void inline_void__int(void f(int i)); | 303 typedef void inline_void__int(void f(int i)); |
| 305 """); | 304 """).then(functionSubtypingHelper); |
| 306 functionSubtypingHelper(env); | |
| 307 } | 305 } |
| 308 | 306 |
| 309 functionSubtypingHelper(TypeEnvironment env) { | 307 functionSubtypingHelper(TypeEnvironment env) { |
| 310 void expect(bool expectedResult, String sub, String sup) { | 308 void expect(bool expectedResult, String sub, String sup) { |
| 311 DartType subtype = env.getElementType(sub); | 309 DartType subtype = env.getElementType(sub); |
| 312 DartType supertype = env.getElementType(sup); | 310 DartType supertype = env.getElementType(sup); |
| 313 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), | 311 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), |
| 314 '$subtype <: $supertype'); | 312 '$subtype <: $supertype'); |
| 315 } | 313 } |
| 316 | 314 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 expect(false, 'int__int', 'int__int_int'); | 354 expect(false, 'int__int', 'int__int_int'); |
| 357 // (int,int) -> int <: (int) -> int | 355 // (int,int) -> int <: (int) -> int |
| 358 expect(false, 'int__int_int', 'int__int'); | 356 expect(false, 'int__int_int', 'int__int'); |
| 359 // (()->void) -> void <: ((int)->void) -> void | 357 // (()->void) -> void <: ((int)->void) -> void |
| 360 expect(false, 'inline_void_', 'inline_void__int'); | 358 expect(false, 'inline_void_', 'inline_void__int'); |
| 361 // ((int)->void) -> void <: (()->void) -> void | 359 // ((int)->void) -> void <: (()->void) -> void |
| 362 expect(false, 'inline_void__int', 'inline_void_'); | 360 expect(false, 'inline_void__int', 'inline_void_'); |
| 363 } | 361 } |
| 364 | 362 |
| 365 testFunctionSubtypingOptional() { | 363 testFunctionSubtypingOptional() { |
| 366 var env = new TypeEnvironment(r""" | 364 TypeEnvironment.create(r""" |
| 367 void void_() {} | 365 void void_() {} |
| 368 void void__int(int i) {} | 366 void void__int(int i) {} |
| 369 void void___int([int i]) {} | 367 void void___int([int i]) {} |
| 370 void void___int2([int i]) {} | 368 void void___int2([int i]) {} |
| 371 void void___Object([Object o]) {} | 369 void void___Object([Object o]) {} |
| 372 void void__int__int(int i1, [int i2]) {} | 370 void void__int__int(int i1, [int i2]) {} |
| 373 void void__int__int2(int i1, [int i2]) {} | 371 void void__int__int2(int i1, [int i2]) {} |
| 374 void void__int__int_int(int i1, [int i2, int i3]); | 372 void void__int__int_int(int i1, [int i2, int i3]); |
| 375 void void___double(double d) {} | 373 void void___double(double d) {} |
| 376 void void___int_int([int i1, int i2]) {} | 374 void void___int_int([int i1, int i2]) {} |
| 377 void void___int_int_int([int i1, int i2, int i3]); | 375 void void___int_int_int([int i1, int i2, int i3]); |
| 378 void void___Object_int([Object o, int i]) {} | 376 void void___Object_int([Object o, int i]) {} |
| 379 """); | 377 """).then(functionSubtypingOptionalHelper); |
| 380 functionSubtypingOptionalHelper(env); | |
| 381 } | 378 } |
| 382 | 379 |
| 383 testTypedefSubtypingOptional() { | 380 testTypedefSubtypingOptional() { |
| 384 var env = new TypeEnvironment(r""" | 381 TypeEnvironment.create(r""" |
| 385 typedef void void_(); | 382 typedef void void_(); |
| 386 typedef void void__int(int i); | 383 typedef void void__int(int i); |
| 387 typedef void void___int([int i]); | 384 typedef void void___int([int i]); |
| 388 typedef void void___int2([int i]); | 385 typedef void void___int2([int i]); |
| 389 typedef void void___Object([Object o]); | 386 typedef void void___Object([Object o]); |
| 390 typedef void void__int__int(int i1, [int i2]); | 387 typedef void void__int__int(int i1, [int i2]); |
| 391 typedef void void__int__int2(int i1, [int i2]); | 388 typedef void void__int__int2(int i1, [int i2]); |
| 392 typedef void void__int__int_int(int i1, [int i2, int i3]); | 389 typedef void void__int__int_int(int i1, [int i2, int i3]); |
| 393 typedef void void___double(double d); | 390 typedef void void___double(double d); |
| 394 typedef void void___int_int([int i1, int i2]); | 391 typedef void void___int_int([int i1, int i2]); |
| 395 typedef void void___int_int_int([int i1, int i2, int i3]); | 392 typedef void void___int_int_int([int i1, int i2, int i3]); |
| 396 typedef void void___Object_int([Object o, int i]); | 393 typedef void void___Object_int([Object o, int i]); |
| 397 """); | 394 """).then(functionSubtypingOptionalHelper); |
| 398 functionSubtypingOptionalHelper(env); | |
| 399 } | 395 } |
| 400 | 396 |
| 401 functionSubtypingOptionalHelper(TypeEnvironment env) { | 397 functionSubtypingOptionalHelper(TypeEnvironment env) { |
| 402 expect(bool expectedResult, String sub, String sup) { | 398 expect(bool expectedResult, String sub, String sup) { |
| 403 DartType subtype = env.getElementType(sub); | 399 DartType subtype = env.getElementType(sub); |
| 404 DartType supertype = env.getElementType(sup); | 400 DartType supertype = env.getElementType(sup); |
| 405 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), | 401 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), |
| 406 '$subtype <: $supertype'); | 402 '$subtype <: $supertype'); |
| 407 } | 403 } |
| 408 | 404 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 436 expect(false, 'void___int', 'void___double'); | 432 expect(false, 'void___int', 'void___double'); |
| 437 // Test ([int])->void <: ([int,int])->void. | 433 // Test ([int])->void <: ([int,int])->void. |
| 438 expect(false, 'void___int', 'void___int_int'); | 434 expect(false, 'void___int', 'void___int_int'); |
| 439 // Test ([int,int])->void <: ([int])->void. | 435 // Test ([int,int])->void <: ([int])->void. |
| 440 expect(true, 'void___int_int', 'void___int'); | 436 expect(true, 'void___int_int', 'void___int'); |
| 441 // Test ([Object,int])->void <: ([int])->void. | 437 // Test ([Object,int])->void <: ([int])->void. |
| 442 expect(true, 'void___Object_int', 'void___int'); | 438 expect(true, 'void___Object_int', 'void___int'); |
| 443 } | 439 } |
| 444 | 440 |
| 445 testFunctionSubtypingNamed() { | 441 testFunctionSubtypingNamed() { |
| 446 var env = new TypeEnvironment(r""" | 442 TypeEnvironment.create(r""" |
| 447 void void_() {} | 443 void void_() {} |
| 448 void void__int(int i) {} | 444 void void__int(int i) {} |
| 449 void void___a_int({int a}) {} | 445 void void___a_int({int a}) {} |
| 450 void void___a_int2({int a}) {} | 446 void void___a_int2({int a}) {} |
| 451 void void___b_int({int b}) {} | 447 void void___b_int({int b}) {} |
| 452 void void___a_Object({Object a}) {} | 448 void void___a_Object({Object a}) {} |
| 453 void void__int__a_int(int i1, {int a}) {} | 449 void void__int__a_int(int i1, {int a}) {} |
| 454 void void__int__a_int2(int i1, {int a}) {} | 450 void void__int__a_int2(int i1, {int a}) {} |
| 455 void void___a_double({double a}) {} | 451 void void___a_double({double a}) {} |
| 456 void void___a_int_b_int({int a, int b}) {} | 452 void void___a_int_b_int({int a, int b}) {} |
| 457 void void___a_int_b_int_c_int({int a, int b, int c}) {} | 453 void void___a_int_b_int_c_int({int a, int b, int c}) {} |
| 458 void void___a_int_c_int({int a, int c}) {} | 454 void void___a_int_c_int({int a, int c}) {} |
| 459 void void___b_int_c_int({int b, int c}) {} | 455 void void___b_int_c_int({int b, int c}) {} |
| 460 void void___c_int({int c}) {} | 456 void void___c_int({int c}) {} |
| 461 """); | 457 """).then(functionSubtypingNamedHelper); |
| 462 functionSubtypingNamedHelper(env); | |
| 463 } | 458 } |
| 464 | 459 |
| 465 testTypedefSubtypingNamed() { | 460 testTypedefSubtypingNamed() { |
| 466 var env = new TypeEnvironment(r""" | 461 TypeEnvironment.create(r""" |
| 467 typedef void void_(); | 462 typedef void void_(); |
| 468 typedef void void__int(int i); | 463 typedef void void__int(int i); |
| 469 typedef void void___a_int({int a}); | 464 typedef void void___a_int({int a}); |
| 470 typedef void void___a_int2({int a}); | 465 typedef void void___a_int2({int a}); |
| 471 typedef void void___b_int({int b}); | 466 typedef void void___b_int({int b}); |
| 472 typedef void void___a_Object({Object a}); | 467 typedef void void___a_Object({Object a}); |
| 473 typedef void void__int__a_int(int i1, {int a}); | 468 typedef void void__int__a_int(int i1, {int a}); |
| 474 typedef void void__int__a_int2(int i1, {int a}); | 469 typedef void void__int__a_int2(int i1, {int a}); |
| 475 typedef void void___a_double({double a}); | 470 typedef void void___a_double({double a}); |
| 476 typedef void void___a_int_b_int({int a, int b}); | 471 typedef void void___a_int_b_int({int a, int b}); |
| 477 typedef void void___a_int_b_int_c_int({int a, int b, int c}); | 472 typedef void void___a_int_b_int_c_int({int a, int b, int c}); |
| 478 typedef void void___a_int_c_int({int a, int c}); | 473 typedef void void___a_int_c_int({int a, int c}); |
| 479 typedef void void___b_int_c_int({int b, int c}); | 474 typedef void void___b_int_c_int({int b, int c}); |
| 480 typedef void void___c_int({int c}); | 475 typedef void void___c_int({int c}); |
| 481 """); | 476 """).then(functionSubtypingNamedHelper); |
| 482 functionSubtypingNamedHelper(env); | |
| 483 } | 477 } |
| 484 | 478 |
| 485 functionSubtypingNamedHelper(TypeEnvironment env) { | 479 functionSubtypingNamedHelper(TypeEnvironment env) { |
| 486 expect(bool expectedResult, String sub, String sup) { | 480 expect(bool expectedResult, String sub, String sup) { |
| 487 DartType subtype = env.getElementType(sub); | 481 DartType subtype = env.getElementType(sub); |
| 488 DartType supertype = env.getElementType(sup); | 482 DartType supertype = env.getElementType(sup); |
| 489 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), | 483 Expect.equals(expectedResult, env.isSubtype(subtype, supertype), |
| 490 '$subtype <: $supertype'); | 484 '$subtype <: $supertype'); |
| 491 } | 485 } |
| 492 | 486 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 514 expect(true, 'void___a_int_b_int', 'void___a_int'); | 508 expect(true, 'void___a_int_b_int', 'void___a_int'); |
| 515 // Test ({int a,int b,int c})->void <: ({int a,int c})->void. | 509 // Test ({int a,int b,int c})->void <: ({int a,int c})->void. |
| 516 expect(true, 'void___a_int_b_int_c_int', 'void___a_int_c_int'); | 510 expect(true, 'void___a_int_b_int_c_int', 'void___a_int_c_int'); |
| 517 // Test ({int a,int b,int c})->void <: ({int b,int c})->void. | 511 // Test ({int a,int b,int c})->void <: ({int b,int c})->void. |
| 518 expect(true, 'void___a_int_b_int_c_int', 'void___b_int_c_int'); | 512 expect(true, 'void___a_int_b_int_c_int', 'void___b_int_c_int'); |
| 519 // Test ({int a,int b,int c})->void <: ({int c})->void. | 513 // Test ({int a,int b,int c})->void <: ({int c})->void. |
| 520 expect(true, 'void___a_int_b_int_c_int', 'void___c_int'); | 514 expect(true, 'void___a_int_b_int_c_int', 'void___c_int'); |
| 521 } | 515 } |
| 522 | 516 |
| 523 void testTypeVariableSubtype() { | 517 void testTypeVariableSubtype() { |
| 524 var env = new TypeEnvironment(r""" | 518 TypeEnvironment.create(r""" |
| 525 class A<T> {} | 519 class A<T> {} |
| 526 class B<T extends Object> {} | 520 class B<T extends Object> {} |
| 527 class C<T extends num> {} | 521 class C<T extends num> {} |
| 528 class D<T extends int> {} | 522 class D<T extends int> {} |
| 529 class E<T extends S, S extends num> {} | 523 class E<T extends S, S extends num> {} |
| 530 class F<T extends num, S extends T> {} | 524 class F<T extends num, S extends T> {} |
| 531 class G<T extends T> {} | 525 class G<T extends T> {} |
| 532 class H<T extends S, S extends T> {} | 526 class H<T extends S, S extends T> {} |
| 533 class I<T extends S, S extends U, U extends T> {} | 527 class I<T extends S, S extends U, U extends T> {} |
| 534 class J<T extends S, S extends U, U extends S> {} | 528 class J<T extends S, S extends U, U extends S> {} |
| 535 """); | 529 """).then((env) { |
| 536 | 530 void expect(bool value, DartType T, DartType S) { |
| 537 void expect(bool value, DartType T, DartType S) { | 531 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); |
| 538 Expect.equals(value, env.isSubtype(T, S), '$T <: $S'); | 532 } |
| 539 } | 533 |
| 540 | 534 ClassElement A = env.getElement('A'); |
| 541 ClassElement A = env.getElement('A'); | 535 TypeVariableType A_T = A.thisType.typeArguments.head; |
| 542 TypeVariableType A_T = A.thisType.typeArguments.head; | 536 ClassElement B = env.getElement('B'); |
| 543 ClassElement B = env.getElement('B'); | 537 TypeVariableType B_T = B.thisType.typeArguments.head; |
| 544 TypeVariableType B_T = B.thisType.typeArguments.head; | 538 ClassElement C = env.getElement('C'); |
| 545 ClassElement C = env.getElement('C'); | 539 TypeVariableType C_T = C.thisType.typeArguments.head; |
| 546 TypeVariableType C_T = C.thisType.typeArguments.head; | 540 ClassElement D = env.getElement('D'); |
| 547 ClassElement D = env.getElement('D'); | 541 TypeVariableType D_T = D.thisType.typeArguments.head; |
| 548 TypeVariableType D_T = D.thisType.typeArguments.head; | 542 ClassElement E = env.getElement('E'); |
| 549 ClassElement E = env.getElement('E'); | 543 TypeVariableType E_T = E.thisType.typeArguments.head; |
| 550 TypeVariableType E_T = E.thisType.typeArguments.head; | 544 TypeVariableType E_S = E.thisType.typeArguments.tail.head; |
| 551 TypeVariableType E_S = E.thisType.typeArguments.tail.head; | 545 ClassElement F = env.getElement('F'); |
| 552 ClassElement F = env.getElement('F'); | 546 TypeVariableType F_T = F.thisType.typeArguments.head; |
| 553 TypeVariableType F_T = F.thisType.typeArguments.head; | 547 TypeVariableType F_S = F.thisType.typeArguments.tail.head; |
| 554 TypeVariableType F_S = F.thisType.typeArguments.tail.head; | 548 ClassElement G = env.getElement('G'); |
| 555 ClassElement G = env.getElement('G'); | 549 TypeVariableType G_T = G.thisType.typeArguments.head; |
| 556 TypeVariableType G_T = G.thisType.typeArguments.head; | 550 ClassElement H = env.getElement('H'); |
| 557 ClassElement H = env.getElement('H'); | 551 TypeVariableType H_T = H.thisType.typeArguments.head; |
| 558 TypeVariableType H_T = H.thisType.typeArguments.head; | 552 TypeVariableType H_S = H.thisType.typeArguments.tail.head; |
| 559 TypeVariableType H_S = H.thisType.typeArguments.tail.head; | 553 ClassElement I = env.getElement('I'); |
| 560 ClassElement I = env.getElement('I'); | 554 TypeVariableType I_T = I.thisType.typeArguments.head; |
| 561 TypeVariableType I_T = I.thisType.typeArguments.head; | 555 TypeVariableType I_S = I.thisType.typeArguments.tail.head; |
| 562 TypeVariableType I_S = I.thisType.typeArguments.tail.head; | 556 TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head; |
| 563 TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head; | 557 ClassElement J = env.getElement('J'); |
| 564 ClassElement J = env.getElement('J'); | 558 TypeVariableType J_T = J.thisType.typeArguments.head; |
| 565 TypeVariableType J_T = J.thisType.typeArguments.head; | 559 TypeVariableType J_S = J.thisType.typeArguments.tail.head; |
| 566 TypeVariableType J_S = J.thisType.typeArguments.tail.head; | 560 TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head; |
| 567 TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head; | 561 |
| 568 | 562 DartType Object_ = env['Object']; |
| 569 DartType Object_ = env['Object']; | 563 DartType num_ = env['num']; |
| 570 DartType num_ = env['num']; | 564 DartType int_ = env['int']; |
| 571 DartType int_ = env['int']; | 565 DartType String_ = env['String']; |
| 572 DartType String_ = env['String']; | 566 DartType dynamic_ = env['dynamic']; |
| 573 DartType dynamic_ = env['dynamic']; | 567 |
| 574 | 568 // class A<T> {} |
| 575 // class A<T> {} | 569 expect(true, A_T, Object_); |
| 576 expect(true, A_T, Object_); | 570 expect(false, A_T, num_); |
| 577 expect(false, A_T, num_); | 571 expect(false, A_T, int_); |
| 578 expect(false, A_T, int_); | 572 expect(false, A_T, String_); |
| 579 expect(false, A_T, String_); | 573 expect(true, A_T, dynamic_); |
| 580 expect(true, A_T, dynamic_); | 574 expect(true, A_T, A_T); |
| 581 expect(true, A_T, A_T); | 575 expect(false, A_T, B_T); |
| 582 expect(false, A_T, B_T); | 576 |
| 583 | 577 // class B<T extends Object> {} |
| 584 // class B<T extends Object> {} | 578 expect(true, B_T, Object_); |
| 585 expect(true, B_T, Object_); | 579 expect(false, B_T, num_); |
| 586 expect(false, B_T, num_); | 580 expect(false, B_T, int_); |
| 587 expect(false, B_T, int_); | 581 expect(false, B_T, String_); |
| 588 expect(false, B_T, String_); | 582 expect(true, B_T, dynamic_); |
| 589 expect(true, B_T, dynamic_); | 583 expect(true, B_T, B_T); |
| 590 expect(true, B_T, B_T); | 584 expect(false, B_T, A_T); |
| 591 expect(false, B_T, A_T); | 585 |
| 592 | 586 // class C<T extends num> {} |
| 593 // class C<T extends num> {} | 587 expect(true, C_T, Object_); |
| 594 expect(true, C_T, Object_); | 588 expect(true, C_T, num_); |
| 595 expect(true, C_T, num_); | 589 expect(false, C_T, int_); |
| 596 expect(false, C_T, int_); | 590 expect(false, C_T, String_); |
| 597 expect(false, C_T, String_); | 591 expect(true, C_T, dynamic_); |
| 598 expect(true, C_T, dynamic_); | 592 expect(true, C_T, C_T); |
| 599 expect(true, C_T, C_T); | 593 expect(false, C_T, A_T); |
| 600 expect(false, C_T, A_T); | 594 |
| 601 | 595 // class D<T extends int> {} |
| 602 // class D<T extends int> {} | 596 expect(true, D_T, Object_); |
| 603 expect(true, D_T, Object_); | 597 expect(true, D_T, num_); |
| 604 expect(true, D_T, num_); | 598 expect(true, D_T, int_); |
| 605 expect(true, D_T, int_); | 599 expect(false, D_T, String_); |
| 606 expect(false, D_T, String_); | 600 expect(true, D_T, dynamic_); |
| 607 expect(true, D_T, dynamic_); | 601 expect(true, D_T, D_T); |
| 608 expect(true, D_T, D_T); | 602 expect(false, D_T, A_T); |
| 609 expect(false, D_T, A_T); | 603 |
| 610 | 604 // class E<T extends S, S extends num> {} |
| 611 // class E<T extends S, S extends num> {} | 605 expect(true, E_T, Object_); |
| 612 expect(true, E_T, Object_); | 606 expect(true, E_T, num_); |
| 613 expect(true, E_T, num_); | 607 expect(false, E_T, int_); |
| 614 expect(false, E_T, int_); | 608 expect(false, E_T, String_); |
| 615 expect(false, E_T, String_); | 609 expect(true, E_T, dynamic_); |
| 616 expect(true, E_T, dynamic_); | 610 expect(true, E_T, E_T); |
| 617 expect(true, E_T, E_T); | 611 expect(true, E_T, E_S); |
| 618 expect(true, E_T, E_S); | 612 expect(false, E_T, A_T); |
| 619 expect(false, E_T, A_T); | 613 |
| 620 | 614 expect(true, E_S, Object_); |
| 621 expect(true, E_S, Object_); | 615 expect(true, E_S, num_); |
| 622 expect(true, E_S, num_); | 616 expect(false, E_S, int_); |
| 623 expect(false, E_S, int_); | 617 expect(false, E_S, String_); |
| 624 expect(false, E_S, String_); | 618 expect(true, E_S, dynamic_); |
| 625 expect(true, E_S, dynamic_); | 619 expect(false, E_S, E_T); |
| 626 expect(false, E_S, E_T); | 620 expect(true, E_S, E_S); |
| 627 expect(true, E_S, E_S); | 621 expect(false, E_S, A_T); |
| 628 expect(false, E_S, A_T); | 622 |
| 629 | 623 // class F<T extends num, S extends T> {} |
| 630 // class F<T extends num, S extends T> {} | 624 expect(true, F_T, Object_); |
| 631 expect(true, F_T, Object_); | 625 expect(true, F_T, num_); |
| 632 expect(true, F_T, num_); | 626 expect(false, F_T, int_); |
| 633 expect(false, F_T, int_); | 627 expect(false, F_T, String_); |
| 634 expect(false, F_T, String_); | 628 expect(true, F_T, dynamic_); |
| 635 expect(true, F_T, dynamic_); | 629 expect(false, F_T, F_S); |
| 636 expect(false, F_T, F_S); | 630 expect(true, F_T, F_T); |
| 637 expect(true, F_T, F_T); | 631 expect(false, F_T, A_T); |
| 638 expect(false, F_T, A_T); | 632 |
| 639 | 633 expect(true, F_S, Object_); |
| 640 expect(true, F_S, Object_); | 634 expect(true, F_S, num_); |
| 641 expect(true, F_S, num_); | 635 expect(false, F_S, int_); |
| 642 expect(false, F_S, int_); | 636 expect(false, F_S, String_); |
| 643 expect(false, F_S, String_); | 637 expect(true, F_S, dynamic_); |
| 644 expect(true, F_S, dynamic_); | 638 expect(true, F_S, F_S); |
| 645 expect(true, F_S, F_S); | 639 expect(true, F_S, F_T); |
| 646 expect(true, F_S, F_T); | 640 expect(false, F_S, A_T); |
| 647 expect(false, F_S, A_T); | 641 |
| 648 | 642 // class G<T extends T> {} |
| 649 // class G<T extends T> {} | 643 expect(true, G_T, Object_); |
| 650 expect(true, G_T, Object_); | 644 expect(false, G_T, num_); |
| 651 expect(false, G_T, num_); | 645 expect(false, G_T, int_); |
| 652 expect(false, G_T, int_); | 646 expect(false, G_T, String_); |
| 653 expect(false, G_T, String_); | 647 expect(true, G_T, dynamic_); |
| 654 expect(true, G_T, dynamic_); | 648 expect(true, G_T, G_T); |
| 655 expect(true, G_T, G_T); | 649 expect(false, G_T, A_T); |
| 656 expect(false, G_T, A_T); | 650 |
| 657 | 651 // class H<T extends S, S extends T> {} |
| 658 // class H<T extends S, S extends T> {} | 652 expect(true, H_T, Object_); |
| 659 expect(true, H_T, Object_); | 653 expect(false, H_T, num_); |
| 660 expect(false, H_T, num_); | 654 expect(false, H_T, int_); |
| 661 expect(false, H_T, int_); | 655 expect(false, H_T, String_); |
| 662 expect(false, H_T, String_); | 656 expect(true, H_T, dynamic_); |
| 663 expect(true, H_T, dynamic_); | 657 expect(true, H_T, H_T); |
| 664 expect(true, H_T, H_T); | 658 expect(true, H_T, H_S); |
| 665 expect(true, H_T, H_S); | 659 expect(false, H_T, A_T); |
| 666 expect(false, H_T, A_T); | 660 |
| 667 | 661 expect(true, H_S, Object_); |
| 668 expect(true, H_S, Object_); | 662 expect(false, H_S, num_); |
| 669 expect(false, H_S, num_); | 663 expect(false, H_S, int_); |
| 670 expect(false, H_S, int_); | 664 expect(false, H_S, String_); |
| 671 expect(false, H_S, String_); | 665 expect(true, H_S, dynamic_); |
| 672 expect(true, H_S, dynamic_); | 666 expect(true, H_S, H_T); |
| 673 expect(true, H_S, H_T); | 667 expect(true, H_S, H_S); |
| 674 expect(true, H_S, H_S); | 668 expect(false, H_S, A_T); |
| 675 expect(false, H_S, A_T); | 669 |
| 676 | 670 // class I<T extends S, S extends U, U extends T> {} |
| 677 // class I<T extends S, S extends U, U extends T> {} | 671 expect(true, I_T, Object_); |
| 678 expect(true, I_T, Object_); | 672 expect(false, I_T, num_); |
| 679 expect(false, I_T, num_); | 673 expect(false, I_T, int_); |
| 680 expect(false, I_T, int_); | 674 expect(false, I_T, String_); |
| 681 expect(false, I_T, String_); | 675 expect(true, I_T, dynamic_); |
| 682 expect(true, I_T, dynamic_); | 676 expect(true, I_T, I_T); |
| 683 expect(true, I_T, I_T); | 677 expect(true, I_T, I_S); |
| 684 expect(true, I_T, I_S); | 678 expect(true, I_T, I_U); |
| 685 expect(true, I_T, I_U); | 679 expect(false, I_T, A_T); |
| 686 expect(false, I_T, A_T); | 680 |
| 687 | 681 expect(true, I_S, Object_); |
| 688 expect(true, I_S, Object_); | 682 expect(false, I_S, num_); |
| 689 expect(false, I_S, num_); | 683 expect(false, I_S, int_); |
| 690 expect(false, I_S, int_); | 684 expect(false, I_S, String_); |
| 691 expect(false, I_S, String_); | 685 expect(true, I_S, dynamic_); |
| 692 expect(true, I_S, dynamic_); | 686 expect(true, I_S, I_T); |
| 693 expect(true, I_S, I_T); | 687 expect(true, I_S, I_S); |
| 694 expect(true, I_S, I_S); | 688 expect(true, I_S, I_U); |
| 695 expect(true, I_S, I_U); | 689 expect(false, I_S, A_T); |
| 696 expect(false, I_S, A_T); | 690 |
| 697 | 691 expect(true, I_U, Object_); |
| 698 expect(true, I_U, Object_); | 692 expect(false, I_U, num_); |
| 699 expect(false, I_U, num_); | 693 expect(false, I_U, int_); |
| 700 expect(false, I_U, int_); | 694 expect(false, I_U, String_); |
| 701 expect(false, I_U, String_); | 695 expect(true, I_U, dynamic_); |
| 702 expect(true, I_U, dynamic_); | 696 expect(true, I_U, I_T); |
| 703 expect(true, I_U, I_T); | 697 expect(true, I_U, I_S); |
| 704 expect(true, I_U, I_S); | 698 expect(true, I_U, I_U); |
| 705 expect(true, I_U, I_U); | 699 expect(false, I_U, A_T); |
| 706 expect(false, I_U, A_T); | 700 |
| 707 | 701 // class J<T extends S, S extends U, U extends S> {} |
| 708 // class J<T extends S, S extends U, U extends S> {} | 702 expect(true, J_T, Object_); |
| 709 expect(true, J_T, Object_); | 703 expect(false, J_T, num_); |
| 710 expect(false, J_T, num_); | 704 expect(false, J_T, int_); |
| 711 expect(false, J_T, int_); | 705 expect(false, J_T, String_); |
| 712 expect(false, J_T, String_); | 706 expect(true, J_T, dynamic_); |
| 713 expect(true, J_T, dynamic_); | 707 expect(true, J_T, J_T); |
| 714 expect(true, J_T, J_T); | 708 expect(true, J_T, J_S); |
| 715 expect(true, J_T, J_S); | 709 expect(true, J_T, J_U); |
| 716 expect(true, J_T, J_U); | 710 expect(false, J_T, A_T); |
| 717 expect(false, J_T, A_T); | 711 |
| 718 | 712 expect(true, J_S, Object_); |
| 719 expect(true, J_S, Object_); | 713 expect(false, J_S, num_); |
| 720 expect(false, J_S, num_); | 714 expect(false, J_S, int_); |
| 721 expect(false, J_S, int_); | 715 expect(false, J_S, String_); |
| 722 expect(false, J_S, String_); | 716 expect(true, J_S, dynamic_); |
| 723 expect(true, J_S, dynamic_); | 717 expect(false, J_S, J_T); |
| 724 expect(false, J_S, J_T); | 718 expect(true, J_S, J_S); |
| 725 expect(true, J_S, J_S); | 719 expect(true, J_S, J_U); |
| 726 expect(true, J_S, J_U); | 720 expect(false, J_S, A_T); |
| 727 expect(false, J_S, A_T); | 721 |
| 728 | 722 expect(true, J_U, Object_); |
| 729 expect(true, J_U, Object_); | 723 expect(false, J_U, num_); |
| 730 expect(false, J_U, num_); | 724 expect(false, J_U, int_); |
| 731 expect(false, J_U, int_); | 725 expect(false, J_U, String_); |
| 732 expect(false, J_U, String_); | 726 expect(true, J_U, dynamic_); |
| 733 expect(true, J_U, dynamic_); | 727 expect(false, J_U, J_T); |
| 734 expect(false, J_U, J_T); | 728 expect(true, J_U, J_S); |
| 735 expect(true, J_U, J_S); | 729 expect(true, J_U, J_U); |
| 736 expect(true, J_U, J_U); | 730 expect(false, J_U, A_T); |
| 737 expect(false, J_U, A_T); | 731 }); |
| 738 } | 732 } |
| OLD | NEW |