OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 members_test; | 5 library members_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" |
12 show Element, ClassElement, MemberSignature, Name, PublicName, | 12 show Element, ClassElement, MemberSignature, Name, PublicName, |
13 DeclaredMember, Member; | 13 DeclaredMember, Member; |
14 import "package:compiler/src/resolution/class_members.dart" | 14 import "package:compiler/src/resolution/class_members.dart" |
15 show MembersCreator, DeclaredMember, ErroneousMember, SyntheticMember; | 15 show DeclaredMember, ErroneousMember, SyntheticMember; |
16 | 16 |
17 void main() { | 17 void main() { |
18 testClassMembers(); | 18 testClassMembers(); |
19 testInterfaceMembers(); | 19 testInterfaceMembers(); |
20 testClassVsInterfaceMembers(); | 20 testClassVsInterfaceMembers(); |
21 testMixinMembers(); | 21 testMixinMembers(); |
22 testMixinMembersWithoutImplements(); | 22 testMixinMembersWithoutImplements(); |
23 } | 23 } |
24 | 24 |
25 MemberSignature getMember(InterfaceType cls, String name, | 25 MemberSignature getMember(InterfaceType cls, String name, |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 type: int_, functionType: env.functionType(int_, [])); | 205 type: int_, functionType: env.functionType(int_, [])); |
206 checkMember(Object_, 'noSuchMethod', | 206 checkMember(Object_, 'noSuchMethod', |
207 functionType: env.functionType(dynamic_, [Invocation_])); | 207 functionType: env.functionType(dynamic_, [Invocation_])); |
208 checkMember(Object_, 'runtimeType', | 208 checkMember(Object_, 'runtimeType', |
209 isGetter: true, | 209 isGetter: true, |
210 type: Type_, functionType: env.functionType(Type_, [])); | 210 type: Type_, functionType: env.functionType(Type_, [])); |
211 checkMember(Object_, 'toString', | 211 checkMember(Object_, 'toString', |
212 functionType: env.functionType(String_, [])); | 212 functionType: env.functionType(String_, [])); |
213 | 213 |
214 InterfaceType A = env['A']; | 214 InterfaceType A = env['A']; |
215 MembersCreator.computeAllClassMembers(env.compiler, A.element); | |
216 | |
217 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/, | 215 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/, |
218 interfaceMembers: true); | 216 interfaceMembers: true); |
219 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-abstract declared*/ + | 217 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-abstract declared*/ + |
220 3 /* abstract declared */, | 218 3 /* abstract declared */, |
221 interfaceMembers: false); | 219 interfaceMembers: false); |
222 | 220 |
223 checkMember(A, '==', inheritedFrom: Object_); | 221 checkMember(A, '==', inheritedFrom: Object_); |
224 checkMember(A, 'hashCode', inheritedFrom: Object_); | 222 checkMember(A, 'hashCode', inheritedFrom: Object_); |
225 checkMember(A, 'noSuchMethod', inheritedFrom: Object_); | 223 checkMember(A, 'noSuchMethod', inheritedFrom: Object_); |
226 checkMember(A, 'runtimeType', inheritedFrom: Object_); | 224 checkMember(A, 'runtimeType', inheritedFrom: Object_); |
(...skipping 23 matching lines...) Expand all Loading... |
250 functionType: env.functionType(dynamic_, [dynamic_])); | 248 functionType: env.functionType(dynamic_, [dynamic_])); |
251 | 249 |
252 checkMember(A, 'method', functionType: env.functionType(dynamic_, [])); | 250 checkMember(A, 'method', functionType: env.functionType(dynamic_, [])); |
253 checkMember(A, 'abstractMethod', | 251 checkMember(A, 'abstractMethod', |
254 functionType: env.functionType(dynamic_, [])); | 252 functionType: env.functionType(dynamic_, [])); |
255 checkMember(A, 'staticMethod', | 253 checkMember(A, 'staticMethod', |
256 checkType: CHECK_CLASS, | 254 checkType: CHECK_CLASS, |
257 isStatic: true, functionType: env.functionType(dynamic_, [])); | 255 isStatic: true, functionType: env.functionType(dynamic_, [])); |
258 | 256 |
259 ClassElement B = env.getElement('B'); | 257 ClassElement B = env.getElement('B'); |
260 MembersCreator.computeAllClassMembers(env.compiler, B); | |
261 InterfaceType B_this = B.thisType; | 258 InterfaceType B_this = B.thisType; |
262 TypeVariableType B_T = B_this.typeArguments.first; | 259 TypeVariableType B_T = B_this.typeArguments.first; |
263 checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/, | 260 checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/, |
264 interfaceMembers: true); | 261 interfaceMembers: true); |
265 checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/, | 262 checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/, |
266 interfaceMembers: false); | 263 interfaceMembers: false); |
267 | 264 |
268 checkMember(B_this, '==', inheritedFrom: Object_); | 265 checkMember(B_this, '==', inheritedFrom: Object_); |
269 checkMember(B_this, 'hashCode', inheritedFrom: Object_); | 266 checkMember(B_this, 'hashCode', inheritedFrom: Object_); |
270 checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_); | 267 checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_); |
271 checkMember(B_this, 'runtimeType', inheritedFrom: Object_); | 268 checkMember(B_this, 'runtimeType', inheritedFrom: Object_); |
272 | 269 |
273 checkMember(B_this, 'field', isGetter: true, | 270 checkMember(B_this, 'field', isGetter: true, |
274 type: B_T, functionType: env.functionType(B_T, [])); | 271 type: B_T, functionType: env.functionType(B_T, [])); |
275 checkMember(B_this, 'field', isSetter: true, | 272 checkMember(B_this, 'field', isSetter: true, |
276 type: B_T, functionType: env.functionType(void_, [B_T])); | 273 type: B_T, functionType: env.functionType(void_, [B_T])); |
277 checkMember(B_this, 'method', functionType: env.functionType(void_, [B_T])); | 274 checkMember(B_this, 'method', functionType: env.functionType(void_, [B_T])); |
278 checkMember(B_this, 'staticMethod', | 275 checkMember(B_this, 'staticMethod', |
279 checkType: CHECK_CLASS, | 276 checkType: CHECK_CLASS, |
280 isStatic: true, functionType: env.functionType(dynamic_, [])); | 277 isStatic: true, functionType: env.functionType(dynamic_, [])); |
281 checkMember(B_this, 'toString', | 278 checkMember(B_this, 'toString', |
282 functionType: env.functionType(dynamic_, [], | 279 functionType: env.functionType(dynamic_, [], |
283 optionalParameters: [B_T])); | 280 optionalParameters: [B_T])); |
284 | 281 |
285 ClassElement C = env.getElement('C'); | 282 ClassElement C = env.getElement('C'); |
286 MembersCreator.computeAllClassMembers(env.compiler, C); | |
287 InterfaceType C_this = C.thisType; | 283 InterfaceType C_this = C.thisType; |
288 TypeVariableType C_S = C_this.typeArguments.first; | 284 TypeVariableType C_S = C_this.typeArguments.first; |
289 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true); | 285 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true); |
290 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false); | 286 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false); |
291 InterfaceType B_S = instantiate(B, [C_S]); | 287 InterfaceType B_S = instantiate(B, [C_S]); |
292 | 288 |
293 checkMember(C_this, '==', inheritedFrom: Object_); | 289 checkMember(C_this, '==', inheritedFrom: Object_); |
294 checkMember(C_this, 'hashCode', inheritedFrom: Object_); | 290 checkMember(C_this, 'hashCode', inheritedFrom: Object_); |
295 checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_); | 291 checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_); |
296 checkMember(C_this, 'runtimeType', inheritedFrom: Object_); | 292 checkMember(C_this, 'runtimeType', inheritedFrom: Object_); |
297 | 293 |
298 checkMember(C_this, 'field', isGetter: true, | 294 checkMember(C_this, 'field', isGetter: true, |
299 declarer: B_S, | 295 declarer: B_S, |
300 type: C_S, functionType: env.functionType(C_S, [])); | 296 type: C_S, functionType: env.functionType(C_S, [])); |
301 checkMember(C_this, 'field', isSetter: true, | 297 checkMember(C_this, 'field', isSetter: true, |
302 declarer: B_S, | 298 declarer: B_S, |
303 type: C_S, functionType: env.functionType(void_, [C_S])); | 299 type: C_S, functionType: env.functionType(void_, [C_S])); |
304 checkMember(C_this, 'method', | 300 checkMember(C_this, 'method', |
305 declarer: B_S, | 301 declarer: B_S, |
306 functionType: env.functionType(void_, [C_S])); | 302 functionType: env.functionType(void_, [C_S])); |
307 checkMember(C_this, 'toString', | 303 checkMember(C_this, 'toString', |
308 declarer: B_S, | 304 declarer: B_S, |
309 functionType: env.functionType(dynamic_, [], | 305 functionType: env.functionType(dynamic_, [], |
310 optionalParameters: [C_S])); | 306 optionalParameters: [C_S])); |
311 | 307 |
312 InterfaceType D = env['D']; | 308 InterfaceType D = env['D']; |
313 MembersCreator.computeAllClassMembers(env.compiler, D.element); | |
314 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true); | 309 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true); |
315 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false); | 310 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false); |
316 InterfaceType B_int = instantiate(B, [int_]); | 311 InterfaceType B_int = instantiate(B, [int_]); |
317 | 312 |
318 checkMember(D, '==', inheritedFrom: Object_); | 313 checkMember(D, '==', inheritedFrom: Object_); |
319 checkMember(D, 'hashCode', inheritedFrom: Object_); | 314 checkMember(D, 'hashCode', inheritedFrom: Object_); |
320 checkMember(D, 'noSuchMethod', inheritedFrom: Object_); | 315 checkMember(D, 'noSuchMethod', inheritedFrom: Object_); |
321 checkMember(D, 'runtimeType', inheritedFrom: Object_); | 316 checkMember(D, 'runtimeType', inheritedFrom: Object_); |
322 | 317 |
323 checkMember(D, 'field', isGetter: true, | 318 checkMember(D, 'field', isGetter: true, |
324 declarer: B_int, | 319 declarer: B_int, |
325 type: int_, functionType: env.functionType(int_, [])); | 320 type: int_, functionType: env.functionType(int_, [])); |
326 checkMember(D, 'field', isSetter: true, | 321 checkMember(D, 'field', isSetter: true, |
327 declarer: B_int, | 322 declarer: B_int, |
328 type: int_, functionType: env.functionType(void_, [int_])); | 323 type: int_, functionType: env.functionType(void_, [int_])); |
329 checkMember(D, 'method', | 324 checkMember(D, 'method', |
330 declarer: B_int, | 325 declarer: B_int, |
331 functionType: env.functionType(void_, [int_])); | 326 functionType: env.functionType(void_, [int_])); |
332 checkMember(D, 'toString', | 327 checkMember(D, 'toString', |
333 declarer: B_int, | 328 declarer: B_int, |
334 functionType: env.functionType(dynamic_, [], | 329 functionType: env.functionType(dynamic_, [], |
335 optionalParameters: [int_])); | 330 optionalParameters: [int_])); |
336 | 331 |
337 InterfaceType E = env['E']; | 332 InterfaceType E = env['E']; |
338 MembersCreator.computeAllClassMembers(env.compiler, E.element); | |
339 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true); | 333 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true); |
340 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false); | 334 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false); |
341 | 335 |
342 checkMember(E, '==', inheritedFrom: Object_); | 336 checkMember(E, '==', inheritedFrom: Object_); |
343 checkMember(E, 'hashCode', inheritedFrom: Object_); | 337 checkMember(E, 'hashCode', inheritedFrom: Object_); |
344 checkMember(E, 'noSuchMethod', inheritedFrom: Object_); | 338 checkMember(E, 'noSuchMethod', inheritedFrom: Object_); |
345 checkMember(E, 'runtimeType', inheritedFrom: Object_); | 339 checkMember(E, 'runtimeType', inheritedFrom: Object_); |
346 | 340 |
347 checkMember(E, 'field', isGetter: true, | 341 checkMember(E, 'field', isGetter: true, |
348 declarer: B_int, | 342 declarer: B_int, |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 DynamicType dynamic_ = env['dynamic']; | 404 DynamicType dynamic_ = env['dynamic']; |
411 VoidType void_ = env['void']; | 405 VoidType void_ = env['void']; |
412 InterfaceType num_ = env['num']; | 406 InterfaceType num_ = env['num']; |
413 InterfaceType int_ = env['int']; | 407 InterfaceType int_ = env['int']; |
414 | 408 |
415 InterfaceType A = env['A']; | 409 InterfaceType A = env['A']; |
416 InterfaceType B = env['B']; | 410 InterfaceType B = env['B']; |
417 InterfaceType C = env['C']; | 411 InterfaceType C = env['C']; |
418 InterfaceType D = env['D']; | 412 InterfaceType D = env['D']; |
419 | 413 |
420 // Ensure that members have been computed on all classes. | |
421 MembersCreator.computeAllClassMembers(env.compiler, D.element); | |
422 | |
423 // A: num method1() | 414 // A: num method1() |
424 // B: int method1() | 415 // B: int method1() |
425 // D: dynamic method1() -- synthesized from A and B. | 416 // D: dynamic method1() -- synthesized from A and B. |
426 checkMember(D, 'method1', | 417 checkMember(D, 'method1', |
427 synthesizedFrom: [A, B], | 418 synthesizedFrom: [A, B], |
428 functionType: env.functionType(dynamic_ , []), | 419 functionType: env.functionType(dynamic_ , []), |
429 checkType: NO_CLASS_MEMBER); | 420 checkType: NO_CLASS_MEMBER); |
430 | 421 |
431 // A: void method2() | 422 // A: void method2() |
432 // B: int method2() | 423 // B: int method2() |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 | 569 |
579 DynamicType dynamic_ = env['dynamic']; | 570 DynamicType dynamic_ = env['dynamic']; |
580 VoidType void_ = env['void']; | 571 VoidType void_ = env['void']; |
581 InterfaceType num_ = env['num']; | 572 InterfaceType num_ = env['num']; |
582 InterfaceType int_ = env['int']; | 573 InterfaceType int_ = env['int']; |
583 | 574 |
584 InterfaceType A = env['A']; | 575 InterfaceType A = env['A']; |
585 InterfaceType B = env['B']; | 576 InterfaceType B = env['B']; |
586 InterfaceType C = env['C']; | 577 InterfaceType C = env['C']; |
587 | 578 |
588 // Ensure that members have been computed on all classes. | |
589 MembersCreator.computeAllClassMembers(env.compiler, C.element); | |
590 | |
591 // A: method1() | 579 // A: method1() |
592 // B: method1() | 580 // B: method1() |
593 // C class: method1() -- inherited from A. | 581 // C class: method1() -- inherited from A. |
594 // C interface: dynamic method1() -- synthesized from A and B. | 582 // C interface: dynamic method1() -- synthesized from A and B. |
595 MemberSignature interfaceMember = | 583 MemberSignature interfaceMember = |
596 checkMember(C, 'method1', checkType: CHECK_INTERFACE, | 584 checkMember(C, 'method1', checkType: CHECK_INTERFACE, |
597 synthesizedFrom: [A, B], | 585 synthesizedFrom: [A, B], |
598 functionType: env.functionType(dynamic_ , [])); | 586 functionType: env.functionType(dynamic_ , [])); |
599 MemberSignature classMember = | 587 MemberSignature classMember = |
600 checkMember(C, 'method1', checkType: CHECK_CLASS, inheritedFrom: A); | 588 checkMember(C, 'method1', checkType: CHECK_CLASS, inheritedFrom: A); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 | 627 |
640 ClassElement A = env.getElement('A'); | 628 ClassElement A = env.getElement('A'); |
641 ClassElement B = env.getElement('B'); | 629 ClassElement B = env.getElement('B'); |
642 ClassElement C = env.getElement('C'); | 630 ClassElement C = env.getElement('C'); |
643 InterfaceType C_this = C.thisType; | 631 InterfaceType C_this = C.thisType; |
644 TypeVariableType C_U = C_this.typeArguments[0]; | 632 TypeVariableType C_U = C_this.typeArguments[0]; |
645 TypeVariableType C_V = C_this.typeArguments[1]; | 633 TypeVariableType C_V = C_this.typeArguments[1]; |
646 InterfaceType A_U = instantiate(A, [C_U]); | 634 InterfaceType A_U = instantiate(A, [C_U]); |
647 InterfaceType B_V = instantiate(B, [C_V]); | 635 InterfaceType B_V = instantiate(B, [C_V]); |
648 | 636 |
649 // Ensure that members have been computed on all classes. | |
650 MembersCreator.computeAllClassMembers(env.compiler, C); | |
651 | |
652 // A: method1() | 637 // A: method1() |
653 // B: method1() | 638 // B: method1() |
654 // C class: method1() -- inherited from A. | 639 // C class: method1() -- inherited from A. |
655 // C interface: dynamic method1() -- synthesized from A and B. | 640 // C interface: dynamic method1() -- synthesized from A and B. |
656 MemberSignature interfaceMember = | 641 MemberSignature interfaceMember = |
657 checkMember(C_this, 'method1', checkType: CHECK_INTERFACE, | 642 checkMember(C_this, 'method1', checkType: CHECK_INTERFACE, |
658 synthesizedFrom: [A_U, B_V], | 643 synthesizedFrom: [A_U, B_V], |
659 functionType: env.functionType(dynamic_ , [])); | 644 functionType: env.functionType(dynamic_ , [])); |
660 MemberSignature classMember = | 645 MemberSignature classMember = |
661 checkMember(C_this, 'method1', checkType: CHECK_CLASS, | 646 checkMember(C_this, 'method1', checkType: CHECK_CLASS, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 | 695 |
711 DynamicType dynamic_ = env['dynamic']; | 696 DynamicType dynamic_ = env['dynamic']; |
712 VoidType void_ = env['void']; | 697 VoidType void_ = env['void']; |
713 InterfaceType num_ = env['num']; | 698 InterfaceType num_ = env['num']; |
714 InterfaceType int_ = env['int']; | 699 InterfaceType int_ = env['int']; |
715 | 700 |
716 InterfaceType A = env['A']; | 701 InterfaceType A = env['A']; |
717 InterfaceType B = env['B']; | 702 InterfaceType B = env['B']; |
718 InterfaceType C = env['C']; | 703 InterfaceType C = env['C']; |
719 | 704 |
720 // Ensure that members have been computed on all classes. | |
721 MembersCreator.computeAllClassMembers(env.compiler, C.element); | |
722 | |
723 checkMember(C, 'm', checkType: NO_CLASS_MEMBER, | 705 checkMember(C, 'm', checkType: NO_CLASS_MEMBER, |
724 inheritedFrom: A, | 706 inheritedFrom: A, |
725 functionType: env.functionType(dynamic_ , [])); | 707 functionType: env.functionType(dynamic_ , [])); |
726 })); | 708 })); |
727 } | 709 } |
OLD | NEW |