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 import 'package:expect/expect.dart'; | 5 import 'package:expect/expect.dart'; |
| 6 import "package:async_helper/async_helper.dart"; |
6 import | 7 import |
7 '../../../sdk/lib/_internal/compiler/implementation/types/types.dart' | 8 '../../../sdk/lib/_internal/compiler/implementation/types/types.dart' |
8 show TypeMask; | 9 show TypeMask; |
9 | 10 |
10 import 'compiler_helper.dart'; | 11 import 'compiler_helper.dart'; |
11 import 'parser_helper.dart'; | 12 import 'parser_helper.dart'; |
12 | 13 |
13 const String TEST = """ | 14 const String TEST = """ |
14 returnNum1(a) { | 15 returnNum1(a) { |
15 if (a) return 1; | 16 if (a) return 1; |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 testCascade2(); | 591 testCascade2(); |
591 testSpecialization1(); | 592 testSpecialization1(); |
592 testSpecialization2(); | 593 testSpecialization2(); |
593 testSpecialization3(); | 594 testSpecialization3(); |
594 } | 595 } |
595 """; | 596 """; |
596 | 597 |
597 void main() { | 598 void main() { |
598 Uri uri = new Uri(scheme: 'source'); | 599 Uri uri = new Uri(scheme: 'source'); |
599 var compiler = compilerFor(TEST, uri); | 600 var compiler = compilerFor(TEST, uri); |
600 compiler.runCompiler(uri); | 601 asyncTest(() => compiler.runCompiler(uri).then((_) { |
601 var typesTask = compiler.typesTask; | 602 var typesTask = compiler.typesTask; |
602 var typesInferrer = typesTask.typesInferrer; | 603 var typesInferrer = typesTask.typesInferrer; |
603 | 604 |
604 checkReturn(String name, type) { | 605 checkReturn(String name, type) { |
605 var element = findElement(compiler, name); | 606 var element = findElement(compiler, name); |
606 Expect.equals( | 607 Expect.equals( |
607 type, | 608 type, |
608 typesInferrer.getReturnTypeOfElement(element).simplify(compiler), | 609 typesInferrer.getReturnTypeOfElement(element).simplify(compiler), |
609 name); | 610 name); |
610 } | 611 } |
611 var interceptorType = | 612 var interceptorType = |
612 findTypeMask(compiler, 'Interceptor', 'nonNullSubclass'); | 613 findTypeMask(compiler, 'Interceptor', 'nonNullSubclass'); |
613 | 614 |
614 checkReturn('returnNum1', typesTask.numType); | 615 checkReturn('returnNum1', typesTask.numType); |
615 checkReturn('returnNum2', typesTask.numType); | 616 checkReturn('returnNum2', typesTask.numType); |
616 checkReturn('returnInt1', typesTask.intType); | 617 checkReturn('returnInt1', typesTask.intType); |
617 checkReturn('returnInt2', typesTask.intType); | 618 checkReturn('returnInt2', typesTask.intType); |
618 checkReturn('returnDouble', typesTask.doubleType); | 619 checkReturn('returnDouble', typesTask.doubleType); |
619 checkReturn('returnGiveUp', interceptorType); | 620 checkReturn('returnGiveUp', interceptorType); |
620 checkReturn('returnInt5', typesTask.intType); | 621 checkReturn('returnInt5', typesTask.intType); |
621 checkReturn('returnInt6', typesTask.intType); | 622 checkReturn('returnInt6', typesTask.intType); |
622 checkReturn('returnIntOrNull', typesTask.intType.nullable()); | 623 checkReturn('returnIntOrNull', typesTask.intType.nullable()); |
623 checkReturn('returnInt3', typesTask.intType); | 624 checkReturn('returnInt3', typesTask.intType); |
624 checkReturn('returnDynamic', typesTask.dynamicType); | 625 checkReturn('returnDynamic', typesTask.dynamicType); |
625 checkReturn('returnInt4', typesTask.intType); | 626 checkReturn('returnInt4', typesTask.intType); |
626 checkReturn('returnInt7', typesTask.intType); | 627 checkReturn('returnInt7', typesTask.intType); |
627 checkReturn('returnInt8', typesTask.intType); | 628 checkReturn('returnInt8', typesTask.intType); |
628 checkReturn('returnDynamic1', typesTask.dynamicType); | 629 checkReturn('returnDynamic1', typesTask.dynamicType); |
629 checkReturn('returnDynamic2', typesTask.dynamicType); | 630 checkReturn('returnDynamic2', typesTask.dynamicType); |
630 TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass.rawType); | 631 TypeMask intType = new TypeMask.nonNullSubtype(compiler.intClass.rawType); |
631 checkReturn('testIsCheck1', intType); | 632 checkReturn('testIsCheck1', intType); |
632 checkReturn('testIsCheck2', intType); | 633 checkReturn('testIsCheck2', intType); |
633 checkReturn('testIsCheck3', intType.nullable()); | 634 checkReturn('testIsCheck3', intType.nullable()); |
634 checkReturn('testIsCheck4', intType); | 635 checkReturn('testIsCheck4', intType); |
635 checkReturn('testIsCheck5', intType); | 636 checkReturn('testIsCheck5', intType); |
636 checkReturn('testIsCheck6', typesTask.dynamicType); | 637 checkReturn('testIsCheck6', typesTask.dynamicType); |
637 checkReturn('testIsCheck7', intType); | 638 checkReturn('testIsCheck7', intType); |
638 checkReturn('testIsCheck8', typesTask.dynamicType); | 639 checkReturn('testIsCheck8', typesTask.dynamicType); |
639 checkReturn('testIsCheck9', intType); | 640 checkReturn('testIsCheck9', intType); |
640 checkReturn('testIsCheck10', typesTask.dynamicType); | 641 checkReturn('testIsCheck10', typesTask.dynamicType); |
641 checkReturn('testIsCheck11', intType); | 642 checkReturn('testIsCheck11', intType); |
642 checkReturn('testIsCheck12', typesTask.dynamicType); | 643 checkReturn('testIsCheck12', typesTask.dynamicType); |
643 checkReturn('testIsCheck13', intType); | 644 checkReturn('testIsCheck13', intType); |
644 checkReturn('testIsCheck14', typesTask.dynamicType); | 645 checkReturn('testIsCheck14', typesTask.dynamicType); |
645 checkReturn('testIsCheck15', intType); | 646 checkReturn('testIsCheck15', intType); |
646 checkReturn('testIsCheck16', typesTask.dynamicType); | 647 checkReturn('testIsCheck16', typesTask.dynamicType); |
647 checkReturn('testIsCheck17', intType); | 648 checkReturn('testIsCheck17', intType); |
648 checkReturn('testIsCheck18', typesTask.dynamicType); | 649 checkReturn('testIsCheck18', typesTask.dynamicType); |
649 checkReturn('testIsCheck19', typesTask.dynamicType); | 650 checkReturn('testIsCheck19', typesTask.dynamicType); |
650 checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable()); | 651 checkReturn('testIsCheck20', typesTask.dynamicType.nonNullable()); |
651 checkReturn('testIf1', typesTask.intType.nullable()); | 652 checkReturn('testIf1', typesTask.intType.nullable()); |
652 checkReturn('testIf2', typesTask.intType.nullable()); | 653 checkReturn('testIf2', typesTask.intType.nullable()); |
653 checkReturn('returnAsString', | 654 checkReturn('returnAsString', |
654 new TypeMask.subtype(compiler.stringClass.computeType(compiler))); | 655 new TypeMask.subtype(compiler.stringClass.computeType(compiler))); |
655 checkReturn('returnIntAsNum', typesTask.intType); | 656 checkReturn('returnIntAsNum', typesTask.intType); |
656 checkReturn('returnAsTypedef', typesTask.functionType.nullable()); | 657 checkReturn('returnAsTypedef', typesTask.functionType.nullable()); |
657 checkReturn('returnTopLevelGetter', typesTask.intType); | 658 checkReturn('returnTopLevelGetter', typesTask.intType); |
658 checkReturn('testDeadCode', typesTask.intType); | 659 checkReturn('testDeadCode', typesTask.intType); |
659 checkReturn('testLabeledIf', typesTask.intType.nullable()); | 660 checkReturn('testLabeledIf', typesTask.intType.nullable()); |
660 checkReturn('testSwitch1', typesTask.intType | 661 checkReturn('testSwitch1', typesTask.intType |
661 .union(typesTask.doubleType, compiler).nullable().simplify(compiler)); | 662 .union(typesTask.doubleType, compiler) |
662 checkReturn('testSwitch2', typesTask.intType); | 663 .nullable().simplify(compiler)); |
663 checkReturn('testSwitch3', interceptorType.nullable()); | 664 checkReturn('testSwitch2', typesTask.intType); |
664 checkReturn('testSwitch4', typesTask.intType); | 665 checkReturn('testSwitch3', interceptorType.nullable()); |
665 checkReturn('testSwitch5', typesTask.intType); | 666 checkReturn('testSwitch4', typesTask.intType); |
666 checkReturn('testContinue1', interceptorType.nullable()); | 667 checkReturn('testSwitch5', typesTask.intType); |
667 checkReturn('testBreak1', interceptorType.nullable()); | 668 checkReturn('testContinue1', interceptorType.nullable()); |
668 checkReturn('testContinue2', interceptorType.nullable()); | 669 checkReturn('testBreak1', interceptorType.nullable()); |
669 checkReturn('testBreak2', typesTask.intType.nullable()); | 670 checkReturn('testContinue2', interceptorType.nullable()); |
670 checkReturn('testReturnElementOfConstList1', typesTask.intType); | 671 checkReturn('testBreak2', typesTask.intType.nullable()); |
671 checkReturn('testReturnElementOfConstList2', typesTask.intType); | 672 checkReturn('testReturnElementOfConstList1', typesTask.intType); |
672 checkReturn('testReturnItselfOrInt', typesTask.intType); | 673 checkReturn('testReturnElementOfConstList2', typesTask.intType); |
673 checkReturn('testReturnInvokeDynamicGetter', typesTask.dynamicType); | 674 checkReturn('testReturnItselfOrInt', typesTask.intType); |
| 675 checkReturn('testReturnInvokeDynamicGetter', typesTask.dynamicType); |
674 | 676 |
675 checkReturn('testDoWhile1', typesTask.stringType); | 677 checkReturn('testDoWhile1', typesTask.stringType); |
676 checkReturn('testDoWhile2', typesTask.nullType); | 678 checkReturn('testDoWhile2', typesTask.nullType); |
677 checkReturn('testDoWhile3', interceptorType); | 679 checkReturn('testDoWhile3', interceptorType); |
678 checkReturn('testDoWhile4', typesTask.numType); | 680 checkReturn('testDoWhile4', typesTask.numType); |
679 | 681 |
680 checkReturnInClass(String className, String methodName, type) { | 682 checkReturnInClass(String className, String methodName, type) { |
681 var cls = findElement(compiler, className); | 683 var cls = findElement(compiler, className); |
682 var element = cls.lookupLocalMember(buildSourceString(methodName)); | 684 var element = cls.lookupLocalMember(buildSourceString(methodName)); |
683 Expect.equals(type, | 685 Expect.equals(type, |
684 typesInferrer.getReturnTypeOfElement(element).simplify(compiler)); | 686 typesInferrer.getReturnTypeOfElement(element).simplify(compiler)); |
685 } | 687 } |
686 | 688 |
687 checkReturnInClass('A', 'returnInt1', typesTask.intType); | 689 checkReturnInClass('A', 'returnInt1', typesTask.intType); |
688 checkReturnInClass('A', 'returnInt2', typesTask.intType); | 690 checkReturnInClass('A', 'returnInt2', typesTask.intType); |
689 checkReturnInClass('A', 'returnInt3', typesTask.intType); | 691 checkReturnInClass('A', 'returnInt3', typesTask.intType); |
690 checkReturnInClass('A', 'returnInt4', typesTask.intType); | 692 checkReturnInClass('A', 'returnInt4', typesTask.intType); |
691 checkReturnInClass('A', 'returnInt5', typesTask.intType); | 693 checkReturnInClass('A', 'returnInt5', typesTask.intType); |
692 checkReturnInClass('A', 'returnInt6', typesTask.intType); | 694 checkReturnInClass('A', 'returnInt6', typesTask.intType); |
693 checkReturnInClass('A', '==', interceptorType); | 695 checkReturnInClass('A', '==', interceptorType); |
694 | 696 |
695 checkReturnInClass('B', 'returnInt1', typesTask.intType); | 697 checkReturnInClass('B', 'returnInt1', typesTask.intType); |
696 checkReturnInClass('B', 'returnInt2', typesTask.intType); | 698 checkReturnInClass('B', 'returnInt2', typesTask.intType); |
697 checkReturnInClass('B', 'returnInt3', typesTask.intType); | 699 checkReturnInClass('B', 'returnInt3', typesTask.intType); |
698 checkReturnInClass('B', 'returnInt4', typesTask.intType); | 700 checkReturnInClass('B', 'returnInt4', typesTask.intType); |
699 checkReturnInClass('B', 'returnInt5', typesTask.intType); | 701 checkReturnInClass('B', 'returnInt5', typesTask.intType); |
700 checkReturnInClass('B', 'returnInt6', typesTask.intType); | 702 checkReturnInClass('B', 'returnInt6', typesTask.intType); |
701 checkReturnInClass('B', 'returnInt7', typesTask.intType); | 703 checkReturnInClass('B', 'returnInt7', typesTask.intType); |
702 checkReturnInClass('B', 'returnInt8', typesTask.intType); | 704 checkReturnInClass('B', 'returnInt8', typesTask.intType); |
703 checkReturnInClass('B', 'returnInt9', typesTask.intType); | 705 checkReturnInClass('B', 'returnInt9', typesTask.intType); |
704 | 706 |
705 checkFactoryConstructor(String className, String factoryName) { | 707 checkFactoryConstructor(String className, String factoryName) { |
706 var cls = findElement(compiler, className); | 708 var cls = findElement(compiler, className); |
707 var element = cls.localLookup(buildSourceString(factoryName)); | 709 var element = cls.localLookup(buildSourceString(factoryName)); |
708 Expect.equals(new TypeMask.nonNullExact(cls.rawType), | 710 Expect.equals(new TypeMask.nonNullExact(cls.rawType), |
709 typesInferrer.getReturnTypeOfElement(element)); | 711 typesInferrer.getReturnTypeOfElement(element)); |
710 } | 712 } |
711 checkFactoryConstructor('A', ''); | 713 checkFactoryConstructor('A', ''); |
712 | 714 |
713 checkReturn('testCascade1', typesTask.growableListType); | 715 checkReturn('testCascade1', typesTask.growableListType); |
714 checkReturn('testCascade2', new TypeMask.nonNullExact( | 716 checkReturn('testCascade2', new TypeMask.nonNullExact( |
715 typesTask.rawTypeOf(findElement(compiler, 'CascadeHelper')))); | 717 typesTask.rawTypeOf(findElement(compiler, 'CascadeHelper')))); |
716 checkReturn('testSpecialization1', typesTask.numType); | 718 checkReturn('testSpecialization1', typesTask.numType); |
717 checkReturn('testSpecialization2', typesTask.dynamicType); | 719 checkReturn('testSpecialization2', typesTask.dynamicType); |
718 checkReturn('testSpecialization3', typesTask.intType.nullable()); | 720 checkReturn('testSpecialization3', typesTask.intType.nullable()); |
| 721 })); |
719 } | 722 } |
OLD | NEW |