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