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 |