| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 test.src.task.strong_mode_test; | 5 library test.src.task.strong_mode_test; |
| 6 | 6 |
| 7 import 'package:analyzer/src/generated/ast.dart'; | 7 import 'package:analyzer/src/generated/ast.dart'; |
| 8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/src/generated/element.dart'; |
| 9 import 'package:analyzer/src/generated/source.dart'; | 9 import 'package:analyzer/src/generated/source.dart'; |
| 10 import 'package:analyzer/src/task/strong_mode.dart'; | 10 import 'package:analyzer/src/task/strong_mode.dart'; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 PropertyAccessorElement getterC = classC.getGetter(fieldName); | 99 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 100 expect(fieldC.type.isDynamic, isTrue); | 100 expect(fieldC.type.isDynamic, isTrue); |
| 101 expect(getterC.returnType.isDynamic, isTrue); | 101 expect(getterC.returnType.isDynamic, isTrue); |
| 102 | 102 |
| 103 inferrer.inferCompilationUnit(unit); | 103 inferrer.inferCompilationUnit(unit); |
| 104 | 104 |
| 105 expect(fieldC.type.isDynamic, isTrue); | 105 expect(fieldC.type.isDynamic, isTrue); |
| 106 expect(getterC.returnType.isDynamic, isTrue); | 106 expect(getterC.returnType.isDynamic, isTrue); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void test_inferCompilationUnit_field_multiple_different_generic() { |
| 110 InstanceMemberInferrer inferrer = createInferrer; |
| 111 String fieldName = 'f'; |
| 112 CompilationUnitElement unit = resolve(''' |
| 113 class A<E> { |
| 114 E $fieldName; |
| 115 } |
| 116 class B<E> { |
| 117 E $fieldName; |
| 118 } |
| 119 class C implements A<int>, B<double> { |
| 120 var $fieldName; |
| 121 } |
| 122 '''); |
| 123 ClassElement classC = unit.getType('C'); |
| 124 FieldElement fieldC = classC.getField(fieldName); |
| 125 PropertyAccessorElement getterC = classC.getGetter(fieldName); |
| 126 expect(fieldC.type.isDynamic, isTrue); |
| 127 expect(getterC.returnType.isDynamic, isTrue); |
| 128 |
| 129 inferrer.inferCompilationUnit(unit); |
| 130 |
| 131 expect(fieldC.type.isDynamic, isTrue); |
| 132 expect(getterC.returnType.isDynamic, isTrue); |
| 133 } |
| 134 |
| 109 void test_inferCompilationUnit_field_multiple_dynamic() { | 135 void test_inferCompilationUnit_field_multiple_dynamic() { |
| 110 InstanceMemberInferrer inferrer = createInferrer; | 136 InstanceMemberInferrer inferrer = createInferrer; |
| 111 String fieldName = 'f'; | 137 String fieldName = 'f'; |
| 112 CompilationUnitElement unit = resolve(''' | 138 CompilationUnitElement unit = resolve(''' |
| 113 class A { | 139 class A { |
| 114 int $fieldName; | 140 int $fieldName; |
| 115 } | 141 } |
| 116 class B { | 142 class B { |
| 117 var $fieldName; | 143 var $fieldName; |
| 118 } | 144 } |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 PropertyAccessorElement getterB = classB.getGetter(fieldName); | 273 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 248 expect(fieldB.type.isDynamic, isTrue); | 274 expect(fieldB.type.isDynamic, isTrue); |
| 249 expect(getterB.returnType.isDynamic, isTrue); | 275 expect(getterB.returnType.isDynamic, isTrue); |
| 250 | 276 |
| 251 inferrer.inferCompilationUnit(unit); | 277 inferrer.inferCompilationUnit(unit); |
| 252 | 278 |
| 253 expect(fieldB.type, fieldA.type); | 279 expect(fieldB.type, fieldA.type); |
| 254 expect(getterB.returnType, getterA.returnType); | 280 expect(getterB.returnType, getterA.returnType); |
| 255 } | 281 } |
| 256 | 282 |
| 283 void test_inferCompilationUnit_field_single_generic() { |
| 284 InstanceMemberInferrer inferrer = createInferrer; |
| 285 String fieldName = 'f'; |
| 286 CompilationUnitElement unit = resolve(''' |
| 287 class A<E> { |
| 288 E $fieldName; |
| 289 } |
| 290 class B<E> extends A<E> { |
| 291 var $fieldName; |
| 292 } |
| 293 '''); |
| 294 ClassElement classB = unit.getType('B'); |
| 295 DartType typeBE = classB.typeParameters[0].type; |
| 296 FieldElement fieldB = classB.getField(fieldName); |
| 297 PropertyAccessorElement getterB = classB.getGetter(fieldName); |
| 298 expect(fieldB.type.isDynamic, isTrue); |
| 299 expect(getterB.returnType.isDynamic, isTrue); |
| 300 |
| 301 inferrer.inferCompilationUnit(unit); |
| 302 |
| 303 expect(fieldB.type, typeBE); |
| 304 expect(getterB.returnType, typeBE); |
| 305 } |
| 306 |
| 257 void test_inferCompilationUnit_field_single_inconsistentAccessors() { | 307 void test_inferCompilationUnit_field_single_inconsistentAccessors() { |
| 258 InstanceMemberInferrer inferrer = createInferrer; | 308 InstanceMemberInferrer inferrer = createInferrer; |
| 259 String fieldName = 'f'; | 309 String fieldName = 'f'; |
| 260 CompilationUnitElement unit = resolve(''' | 310 CompilationUnitElement unit = resolve(''' |
| 261 class A { | 311 class A { |
| 262 int get $fieldName => 0; | 312 int get $fieldName => 0; |
| 263 set $fieldName(String value) {} | 313 set $fieldName(String value) {} |
| 264 } | 314 } |
| 265 class B extends A { | 315 class B extends A { |
| 266 var $fieldName; | 316 var $fieldName; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 PropertyAccessorElement getterB = classB.getGetter(getterName); | 454 PropertyAccessorElement getterB = classB.getGetter(getterName); |
| 405 expect(fieldB.type.isDynamic, isTrue); | 455 expect(fieldB.type.isDynamic, isTrue); |
| 406 expect(getterB.returnType.isDynamic, isTrue); | 456 expect(getterB.returnType.isDynamic, isTrue); |
| 407 | 457 |
| 408 inferrer.inferCompilationUnit(unit); | 458 inferrer.inferCompilationUnit(unit); |
| 409 | 459 |
| 410 expect(fieldB.type, fieldA.type); | 460 expect(fieldB.type, fieldA.type); |
| 411 expect(getterB.returnType, getterA.returnType); | 461 expect(getterB.returnType, getterA.returnType); |
| 412 } | 462 } |
| 413 | 463 |
| 464 void test_inferCompilationUnit_getter_single_generic() { |
| 465 InstanceMemberInferrer inferrer = createInferrer; |
| 466 String getterName = 'g'; |
| 467 CompilationUnitElement unit = resolve(''' |
| 468 class A<E> { |
| 469 E get $getterName => 0; |
| 470 } |
| 471 class B<E> extends A<E> { |
| 472 get $getterName => 0; |
| 473 } |
| 474 '''); |
| 475 ClassElement classB = unit.getType('B'); |
| 476 DartType typeBE = classB.typeParameters[0].type; |
| 477 FieldElement fieldB = classB.getField(getterName); |
| 478 PropertyAccessorElement getterB = classB.getGetter(getterName); |
| 479 expect(fieldB.type.isDynamic, isTrue); |
| 480 expect(getterB.returnType.isDynamic, isTrue); |
| 481 |
| 482 inferrer.inferCompilationUnit(unit); |
| 483 |
| 484 expect(fieldB.type, typeBE); |
| 485 expect(getterB.returnType, typeBE); |
| 486 } |
| 487 |
| 414 void test_inferCompilationUnit_getter_single_inconsistentAccessors() { | 488 void test_inferCompilationUnit_getter_single_inconsistentAccessors() { |
| 415 InstanceMemberInferrer inferrer = createInferrer; | 489 InstanceMemberInferrer inferrer = createInferrer; |
| 416 String getterName = 'g'; | 490 String getterName = 'g'; |
| 417 CompilationUnitElement unit = resolve(''' | 491 CompilationUnitElement unit = resolve(''' |
| 418 class A { | 492 class A { |
| 419 int get $getterName => 0; | 493 int get $getterName => 0; |
| 420 set $getterName(String value) {} | 494 set $getterName(String value) {} |
| 421 } | 495 } |
| 422 class B extends A { | 496 class B extends A { |
| 423 var get $getterName => 1; | 497 var get $getterName => 1; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 438 void test_inferCompilationUnit_invalid_inheritanceCycle() { | 512 void test_inferCompilationUnit_invalid_inheritanceCycle() { |
| 439 InstanceMemberInferrer inferrer = createInferrer; | 513 InstanceMemberInferrer inferrer = createInferrer; |
| 440 CompilationUnitElement unit = resolve(''' | 514 CompilationUnitElement unit = resolve(''' |
| 441 class A extends C {} | 515 class A extends C {} |
| 442 class B extends A {} | 516 class B extends A {} |
| 443 class C extends B {} | 517 class C extends B {} |
| 444 '''); | 518 '''); |
| 445 inferrer.inferCompilationUnit(unit); | 519 inferrer.inferCompilationUnit(unit); |
| 446 } | 520 } |
| 447 | 521 |
| 448 void test_inferCompilationUnit_method_multiple_different() { | 522 void test_inferCompilationUnit_method_parameter_multiple_different() { |
| 449 InstanceMemberInferrer inferrer = createInferrer; | 523 InstanceMemberInferrer inferrer = createInferrer; |
| 450 String methodName = 'm'; | 524 String methodName = 'm'; |
| 451 CompilationUnitElement unit = resolve(''' | 525 CompilationUnitElement unit = resolve(''' |
| 526 class A { |
| 527 $methodName(int p) => 0; |
| 528 } |
| 529 class B { |
| 530 $methodName(double p) => 0; |
| 531 } |
| 532 class C implements A, B { |
| 533 $methodName(p) => 0; |
| 534 } |
| 535 '''); |
| 536 ClassElement classC = unit.getType('C'); |
| 537 MethodElement methodC = classC.getMethod(methodName); |
| 538 ParameterElement parameterC = methodC.parameters[0]; |
| 539 expect(parameterC.type.isDynamic, isTrue); |
| 540 |
| 541 inferrer.inferCompilationUnit(unit); |
| 542 |
| 543 expect(parameterC.type.isDynamic, isTrue); |
| 544 } |
| 545 |
| 546 void test_inferCompilationUnit_method_parameter_multiple_named_different() { |
| 547 InstanceMemberInferrer inferrer = createInferrer; |
| 548 String methodName = 'm'; |
| 549 CompilationUnitElement unit = resolve(''' |
| 550 class A { |
| 551 $methodName({int p}) => 0; |
| 552 } |
| 553 class B { |
| 554 $methodName({int q}) => 0; |
| 555 } |
| 556 class C implements A, B { |
| 557 $methodName({p}) => 0; |
| 558 } |
| 559 '''); |
| 560 ClassElement classC = unit.getType('C'); |
| 561 MethodElement methodC = classC.getMethod(methodName); |
| 562 ParameterElement parameterC = methodC.parameters[0]; |
| 563 expect(parameterC.type.isDynamic, isTrue); |
| 564 |
| 565 inferrer.inferCompilationUnit(unit); |
| 566 |
| 567 expect(parameterC.type.isDynamic, isTrue); |
| 568 } |
| 569 |
| 570 void test_inferCompilationUnit_method_parameter_multiple_named_same() { |
| 571 InstanceMemberInferrer inferrer = createInferrer; |
| 572 String methodName = 'm'; |
| 573 CompilationUnitElement unit = resolve(''' |
| 574 class A { |
| 575 $methodName({int p}) => 0; |
| 576 } |
| 577 class B { |
| 578 $methodName({int p}) => 0; |
| 579 } |
| 580 class C implements A, B { |
| 581 $methodName({p}) => 0; |
| 582 } |
| 583 '''); |
| 584 ClassElement classA = unit.getType('A'); |
| 585 MethodElement methodA = classA.getMethod(methodName); |
| 586 ParameterElement parameterA = methodA.parameters[0]; |
| 587 DartType expectedType = parameterA.type; |
| 588 ClassElement classC = unit.getType('C'); |
| 589 MethodElement methodC = classC.getMethod(methodName); |
| 590 ParameterElement parameterC = methodC.parameters[0]; |
| 591 expect(parameterC.type.isDynamic, isTrue); |
| 592 |
| 593 inferrer.inferCompilationUnit(unit); |
| 594 |
| 595 expect(parameterC.type, expectedType); |
| 596 } |
| 597 |
| 598 void test_inferCompilationUnit_method_parameter_multiple_namedAndRequired() { |
| 599 InstanceMemberInferrer inferrer = createInferrer; |
| 600 String methodName = 'm'; |
| 601 CompilationUnitElement unit = resolve(''' |
| 602 class A { |
| 603 $methodName({int p}) => 0; |
| 604 } |
| 605 class B { |
| 606 $methodName(int p) => 0; |
| 607 } |
| 608 class C implements A, B { |
| 609 $methodName(p) => 0; |
| 610 } |
| 611 '''); |
| 612 ClassElement classC = unit.getType('C'); |
| 613 MethodElement methodC = classC.getMethod(methodName); |
| 614 ParameterElement parameterC = methodC.parameters[0]; |
| 615 expect(parameterC.type.isDynamic, isTrue); |
| 616 |
| 617 inferrer.inferCompilationUnit(unit); |
| 618 |
| 619 expect(parameterC.type.isDynamic, isTrue); |
| 620 } |
| 621 |
| 622 void test_inferCompilationUnit_method_parameter_multiple_optionalAndRequired()
{ |
| 623 InstanceMemberInferrer inferrer = createInferrer; |
| 624 String methodName = 'm'; |
| 625 CompilationUnitElement unit = resolve(''' |
| 626 class A { |
| 627 $methodName(int p) => 0; |
| 628 } |
| 629 class B { |
| 630 $methodName([int p]) => 0; |
| 631 } |
| 632 class C implements A, B { |
| 633 $methodName(p) => 0; |
| 634 } |
| 635 '''); |
| 636 ClassElement classA = unit.getType('A'); |
| 637 MethodElement methodA = classA.getMethod(methodName); |
| 638 ParameterElement parameterA = methodA.parameters[0]; |
| 639 DartType expectedType = parameterA.type; |
| 640 ClassElement classC = unit.getType('C'); |
| 641 MethodElement methodC = classC.getMethod(methodName); |
| 642 ParameterElement parameterC = methodC.parameters[0]; |
| 643 expect(parameterC.type.isDynamic, isTrue); |
| 644 |
| 645 inferrer.inferCompilationUnit(unit); |
| 646 |
| 647 expect(parameterC.type, expectedType); |
| 648 } |
| 649 |
| 650 void test_inferCompilationUnit_method_parameter_single_generic() { |
| 651 InstanceMemberInferrer inferrer = createInferrer; |
| 652 String methodName = 'm'; |
| 653 CompilationUnitElement unit = resolve(''' |
| 654 class A<E> { |
| 655 $methodName(E p) => 0; |
| 656 } |
| 657 class C<E> implements A<E> { |
| 658 $methodName(p) => 0; |
| 659 } |
| 660 '''); |
| 661 ClassElement classC = unit.getType('C'); |
| 662 MethodElement methodC = classC.getMethod(methodName); |
| 663 ParameterElement parameterC = methodC.parameters[0]; |
| 664 expect(parameterC.type.isDynamic, isTrue); |
| 665 |
| 666 inferrer.inferCompilationUnit(unit); |
| 667 |
| 668 expect(parameterC.type, classC.typeParameters[0].type); |
| 669 } |
| 670 |
| 671 void test_inferCompilationUnit_method_return_multiple_different() { |
| 672 InstanceMemberInferrer inferrer = createInferrer; |
| 673 String methodName = 'm'; |
| 674 CompilationUnitElement unit = resolve(''' |
| 452 class A { | 675 class A { |
| 453 int $methodName() => 0; | 676 int $methodName() => 0; |
| 454 } | 677 } |
| 455 class B { | 678 class B { |
| 456 double $methodName() => 0.0; | 679 double $methodName() => 0.0; |
| 457 } | 680 } |
| 458 class C implements A, B { | 681 class C implements A, B { |
| 459 $methodName() => 0; | 682 $methodName() => 0; |
| 460 } | 683 } |
| 461 '''); | 684 '''); |
| 462 ClassElement classC = unit.getType('C'); | 685 ClassElement classC = unit.getType('C'); |
| 463 MethodElement methodC = classC.getMethod(methodName); | 686 MethodElement methodC = classC.getMethod(methodName); |
| 464 expect(methodC.returnType.isDynamic, isTrue); | 687 expect(methodC.returnType.isDynamic, isTrue); |
| 465 | 688 |
| 466 inferrer.inferCompilationUnit(unit); | 689 inferrer.inferCompilationUnit(unit); |
| 467 | 690 |
| 468 expect(methodC.returnType.isDynamic, isTrue); | 691 expect(methodC.returnType.isDynamic, isTrue); |
| 469 } | 692 } |
| 470 | 693 |
| 471 void test_inferCompilationUnit_method_multiple_dynamic() { | 694 void test_inferCompilationUnit_method_return_multiple_different_generic() { |
| 472 InstanceMemberInferrer inferrer = createInferrer; | 695 InstanceMemberInferrer inferrer = createInferrer; |
| 473 String methodName = 'm'; | 696 String methodName = 'm'; |
| 474 CompilationUnitElement unit = resolve(''' | 697 CompilationUnitElement unit = resolve(''' |
| 698 class A<E> { |
| 699 E $methodName() => null; |
| 700 } |
| 701 class B<E> { |
| 702 E $methodName() => null; |
| 703 } |
| 704 class C implements A<int>, B<double> { |
| 705 $methodName() => null; |
| 706 } |
| 707 '''); |
| 708 ClassElement classC = unit.getType('C'); |
| 709 MethodElement methodC = classC.getMethod(methodName); |
| 710 expect(methodC.returnType.isDynamic, isTrue); |
| 711 |
| 712 inferrer.inferCompilationUnit(unit); |
| 713 |
| 714 expect(methodC.returnType.isDynamic, isTrue); |
| 715 } |
| 716 |
| 717 void test_inferCompilationUnit_method_return_multiple_dynamic() { |
| 718 InstanceMemberInferrer inferrer = createInferrer; |
| 719 String methodName = 'm'; |
| 720 CompilationUnitElement unit = resolve(''' |
| 475 class A { | 721 class A { |
| 476 int $methodName() => 0; | 722 int $methodName() => 0; |
| 477 } | 723 } |
| 478 class B { | 724 class B { |
| 479 $methodName() => 0; | 725 $methodName() => 0; |
| 480 } | 726 } |
| 481 class C implements A, B { | 727 class C implements A, B { |
| 482 $methodName() => 0; | 728 $methodName() => 0; |
| 483 } | 729 } |
| 484 '''); | 730 '''); |
| 485 ClassElement classC = unit.getType('C'); | 731 ClassElement classC = unit.getType('C'); |
| 486 MethodElement methodC = classC.getMethod(methodName); | 732 MethodElement methodC = classC.getMethod(methodName); |
| 487 expect(methodC.returnType.isDynamic, isTrue); | 733 expect(methodC.returnType.isDynamic, isTrue); |
| 488 | 734 |
| 489 inferrer.inferCompilationUnit(unit); | 735 inferrer.inferCompilationUnit(unit); |
| 490 | 736 |
| 491 expect(methodC.returnType.isDynamic, isTrue); | 737 expect(methodC.returnType.isDynamic, isTrue); |
| 492 } | 738 } |
| 493 | 739 |
| 494 void test_inferCompilationUnit_method_multiple_same_nonVoid() { | 740 void test_inferCompilationUnit_method_return_multiple_same_generic() { |
| 495 InstanceMemberInferrer inferrer = createInferrer; | 741 InstanceMemberInferrer inferrer = createInferrer; |
| 496 String methodName = 'm'; | 742 String methodName = 'm'; |
| 497 CompilationUnitElement unit = resolve(''' | 743 CompilationUnitElement unit = resolve(''' |
| 744 class A<E> { |
| 745 E $methodName() => 0; |
| 746 } |
| 747 class B<E> { |
| 748 E $methodName() => 0; |
| 749 } |
| 750 class C<E> implements A<E>, B<E> { |
| 751 $methodName() => 0; |
| 752 } |
| 753 '''); |
| 754 ClassElement classC = unit.getType('C'); |
| 755 MethodElement methodC = classC.getMethod(methodName); |
| 756 expect(methodC.returnType.isDynamic, isTrue); |
| 757 |
| 758 inferrer.inferCompilationUnit(unit); |
| 759 |
| 760 expect(methodC.returnType, classC.typeParameters[0].type); |
| 761 } |
| 762 |
| 763 void test_inferCompilationUnit_method_return_multiple_same_nonVoid() { |
| 764 InstanceMemberInferrer inferrer = createInferrer; |
| 765 String methodName = 'm'; |
| 766 CompilationUnitElement unit = resolve(''' |
| 498 class A { | 767 class A { |
| 499 int $methodName() => 0; | 768 int $methodName() => 0; |
| 500 } | 769 } |
| 501 class B { | 770 class B { |
| 502 int $methodName() => 0.0; | 771 int $methodName() => 0; |
| 503 } | 772 } |
| 504 class C implements A, B { | 773 class C implements A, B { |
| 505 $methodName() => 0; | 774 $methodName() => 0; |
| 506 } | 775 } |
| 507 '''); | 776 '''); |
| 508 ClassElement classA = unit.getType('A'); | 777 ClassElement classA = unit.getType('A'); |
| 509 MethodElement methodA = classA.getMethod(methodName); | 778 MethodElement methodA = classA.getMethod(methodName); |
| 510 DartType expectedType = methodA.returnType; | 779 DartType expectedType = methodA.returnType; |
| 511 ClassElement classC = unit.getType('C'); | 780 ClassElement classC = unit.getType('C'); |
| 512 MethodElement methodC = classC.getMethod(methodName); | 781 MethodElement methodC = classC.getMethod(methodName); |
| 513 expect(methodC.returnType.isDynamic, isTrue); | 782 expect(methodC.returnType.isDynamic, isTrue); |
| 514 | 783 |
| 515 inferrer.inferCompilationUnit(unit); | 784 inferrer.inferCompilationUnit(unit); |
| 516 | 785 |
| 517 expect(methodC.returnType, expectedType); | 786 expect(methodC.returnType, expectedType); |
| 518 } | 787 } |
| 519 | 788 |
| 520 void test_inferCompilationUnit_method_multiple_same_void() { | 789 void test_inferCompilationUnit_method_return_multiple_same_void() { |
| 521 InstanceMemberInferrer inferrer = createInferrer; | 790 InstanceMemberInferrer inferrer = createInferrer; |
| 522 String methodName = 'm'; | 791 String methodName = 'm'; |
| 523 CompilationUnitElement unit = resolve(''' | 792 CompilationUnitElement unit = resolve(''' |
| 524 class A { | 793 class A { |
| 525 void $methodName() {}; | 794 void $methodName() {}; |
| 526 } | 795 } |
| 527 class B { | 796 class B { |
| 528 void $methodName() {}; | 797 void $methodName() {}; |
| 529 } | 798 } |
| 530 class C implements A, B { | 799 class C implements A, B { |
| 531 $methodName() {}; | 800 $methodName() {}; |
| 532 } | 801 } |
| 533 '''); | 802 '''); |
| 534 ClassElement classA = unit.getType('A'); | 803 ClassElement classA = unit.getType('A'); |
| 535 MethodElement methodA = classA.getMethod(methodName); | 804 MethodElement methodA = classA.getMethod(methodName); |
| 536 DartType expectedType = methodA.returnType; | 805 DartType expectedType = methodA.returnType; |
| 537 ClassElement classC = unit.getType('C'); | 806 ClassElement classC = unit.getType('C'); |
| 538 MethodElement methodC = classC.getMethod(methodName); | 807 MethodElement methodC = classC.getMethod(methodName); |
| 539 expect(methodC.returnType.isDynamic, isTrue); | 808 expect(methodC.returnType.isDynamic, isTrue); |
| 540 | 809 |
| 541 inferrer.inferCompilationUnit(unit); | 810 inferrer.inferCompilationUnit(unit); |
| 542 | 811 |
| 543 expect(methodC.returnType, expectedType); | 812 expect(methodC.returnType, expectedType); |
| 544 } | 813 } |
| 545 | 814 |
| 546 void test_inferCompilationUnit_method_multiple_void() { | 815 void test_inferCompilationUnit_method_return_multiple_void() { |
| 547 InstanceMemberInferrer inferrer = createInferrer; | 816 InstanceMemberInferrer inferrer = createInferrer; |
| 548 String methodName = 'm'; | 817 String methodName = 'm'; |
| 549 CompilationUnitElement unit = resolve(''' | 818 CompilationUnitElement unit = resolve(''' |
| 550 class A { | 819 class A { |
| 551 int $methodName() => 0; | 820 int $methodName() => 0; |
| 552 } | 821 } |
| 553 class B { | 822 class B { |
| 554 void $methodName() => 0; | 823 void $methodName() => 0; |
| 555 } | 824 } |
| 556 class C implements A, B { | 825 class C implements A, B { |
| 557 $methodName() => 0; | 826 $methodName() => 0; |
| 558 } | 827 } |
| 559 '''); | 828 '''); |
| 560 ClassElement classC = unit.getType('C'); | 829 ClassElement classC = unit.getType('C'); |
| 561 MethodElement methodC = classC.getMethod(methodName); | 830 MethodElement methodC = classC.getMethod(methodName); |
| 562 expect(methodC.returnType.isDynamic, isTrue); | 831 expect(methodC.returnType.isDynamic, isTrue); |
| 563 | 832 |
| 564 inferrer.inferCompilationUnit(unit); | 833 inferrer.inferCompilationUnit(unit); |
| 565 | 834 |
| 566 expect(methodC.returnType.isDynamic, isTrue); | 835 expect(methodC.returnType.isDynamic, isTrue); |
| 567 } | 836 } |
| 568 | 837 |
| 569 void test_inferCompilationUnit_method_single() { | 838 void test_inferCompilationUnit_method_return_single() { |
| 570 InstanceMemberInferrer inferrer = createInferrer; | 839 InstanceMemberInferrer inferrer = createInferrer; |
| 571 String methodName = 'm'; | 840 String methodName = 'm'; |
| 572 CompilationUnitElement unit = resolve(''' | 841 CompilationUnitElement unit = resolve(''' |
| 573 class A { | 842 class A { |
| 574 int $methodName() => 0; | 843 int $methodName() => 0; |
| 575 } | 844 } |
| 576 class B extends A { | 845 class B extends A { |
| 577 $methodName() => 0; | 846 $methodName() => 0; |
| 578 } | 847 } |
| 579 '''); | 848 '''); |
| 580 ClassElement classA = unit.getType('A'); | 849 ClassElement classA = unit.getType('A'); |
| 581 MethodElement methodA = classA.getMethod(methodName); | 850 MethodElement methodA = classA.getMethod(methodName); |
| 582 ClassElement classB = unit.getType('B'); | 851 ClassElement classB = unit.getType('B'); |
| 583 MethodElement methodB = classB.getMethod(methodName); | 852 MethodElement methodB = classB.getMethod(methodName); |
| 584 expect(methodB.returnType.isDynamic, isTrue); | 853 expect(methodB.returnType.isDynamic, isTrue); |
| 585 | 854 |
| 586 inferrer.inferCompilationUnit(unit); | 855 inferrer.inferCompilationUnit(unit); |
| 587 | 856 |
| 588 expect(methodB.returnType, methodA.returnType); | 857 expect(methodB.returnType, methodA.returnType); |
| 589 } | 858 } |
| 859 |
| 860 void test_inferCompilationUnit_method_return_single_generic() { |
| 861 InstanceMemberInferrer inferrer = createInferrer; |
| 862 String methodName = 'm'; |
| 863 CompilationUnitElement unit = resolve(''' |
| 864 class A<E> { |
| 865 E $methodName() => 0; |
| 590 } | 866 } |
| 867 class B<E> extends A<E> { |
| 868 $methodName() => 0; |
| 869 } |
| 870 '''); |
| 871 ClassElement classB = unit.getType('B'); |
| 872 MethodElement methodB = classB.getMethod(methodName); |
| 873 expect(methodB.returnType.isDynamic, isTrue); |
| 874 |
| 875 inferrer.inferCompilationUnit(unit); |
| 876 |
| 877 expect(methodB.returnType, classB.typeParameters[0].type); |
| 878 } |
| 879 } |
| OLD | NEW |