| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 analyzer.test.generated.simple_resolver_test; | 5 library analyzer.test.generated.simple_resolver_test; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| 8 import 'package:analyzer/dart/ast/visitor.dart'; | 9 import 'package:analyzer/dart/ast/visitor.dart'; |
| 9 import 'package:analyzer/dart/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| 10 import 'package:analyzer/dart/element/type.dart'; | 11 import 'package:analyzer/dart/element/type.dart'; |
| 11 import 'package:analyzer/exception/exception.dart'; | 12 import 'package:analyzer/exception/exception.dart'; |
| 12 import 'package:analyzer/src/error/codes.dart'; | 13 import 'package:analyzer/src/error/codes.dart'; |
| 13 import 'package:analyzer/src/generated/engine.dart'; | 14 import 'package:analyzer/src/generated/engine.dart'; |
| 14 import 'package:analyzer/src/generated/source_io.dart'; | 15 import 'package:analyzer/src/generated/source_io.dart'; |
| 15 import 'package:test/test.dart'; | 16 import 'package:test/test.dart'; |
| 16 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 17 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 17 | 18 |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 assertNoErrors(source); | 742 assertNoErrors(source); |
| 742 verify([source]); | 743 verify([source]); |
| 743 // Verify that both the getter and setter for "x" in C.f() refer to the | 744 // Verify that both the getter and setter for "x" in C.f() refer to the |
| 744 // accessors defined in M2. | 745 // accessors defined in M2. |
| 745 ClassElement classC = library.definingCompilationUnit.types[3]; | 746 ClassElement classC = library.definingCompilationUnit.types[3]; |
| 746 MethodDeclaration f = classC.getMethod('f').computeNode(); | 747 MethodDeclaration f = classC.getMethod('f').computeNode(); |
| 747 BlockFunctionBody body = f.body; | 748 BlockFunctionBody body = f.body; |
| 748 ExpressionStatement stmt = body.block.statements[0]; | 749 ExpressionStatement stmt = body.block.statements[0]; |
| 749 AssignmentExpression assignment = stmt.expression; | 750 AssignmentExpression assignment = stmt.expression; |
| 750 SimpleIdentifier leftHandSide = assignment.leftHandSide; | 751 SimpleIdentifier leftHandSide = assignment.leftHandSide; |
| 751 expect(leftHandSide.staticElement.enclosingElement.name, 'M2'); | 752 expect( |
| 753 resolutionMap |
| 754 .staticElementForIdentifier(leftHandSide) |
| 755 .enclosingElement |
| 756 .name, |
| 757 'M2'); |
| 752 expect(leftHandSide.auxiliaryElements.staticElement.enclosingElement.name, | 758 expect(leftHandSide.auxiliaryElements.staticElement.enclosingElement.name, |
| 753 'M2'); | 759 'M2'); |
| 754 } | 760 } |
| 755 | 761 |
| 756 @failingTest | 762 @failingTest |
| 757 void test_getter_and_setter_fromMixins_property_access() { | 763 void test_getter_and_setter_fromMixins_property_access() { |
| 758 // TODO(paulberry): it appears that auxiliaryElements isn't properly set on | 764 // TODO(paulberry): it appears that auxiliaryElements isn't properly set on |
| 759 // a SimpleIdentifier that's inside a property access. This bug should be | 765 // a SimpleIdentifier that's inside a property access. This bug should be |
| 760 // fixed. | 766 // fixed. |
| 761 Source source = addSource(''' | 767 Source source = addSource(''' |
| (...skipping 16 matching lines...) Expand all Loading... |
| 778 verify([source]); | 784 verify([source]); |
| 779 // Verify that both the getter and setter for "x" in "new C().x" refer to | 785 // Verify that both the getter and setter for "x" in "new C().x" refer to |
| 780 // the accessors defined in M2. | 786 // the accessors defined in M2. |
| 781 FunctionDeclaration main = | 787 FunctionDeclaration main = |
| 782 library.definingCompilationUnit.functions[0].computeNode(); | 788 library.definingCompilationUnit.functions[0].computeNode(); |
| 783 BlockFunctionBody body = main.functionExpression.body; | 789 BlockFunctionBody body = main.functionExpression.body; |
| 784 ExpressionStatement stmt = body.block.statements[0]; | 790 ExpressionStatement stmt = body.block.statements[0]; |
| 785 AssignmentExpression assignment = stmt.expression; | 791 AssignmentExpression assignment = stmt.expression; |
| 786 PropertyAccess propertyAccess = assignment.leftHandSide; | 792 PropertyAccess propertyAccess = assignment.leftHandSide; |
| 787 expect( | 793 expect( |
| 788 propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2'); | 794 resolutionMap |
| 795 .staticElementForIdentifier(propertyAccess.propertyName) |
| 796 .enclosingElement |
| 797 .name, |
| 798 'M2'); |
| 789 expect( | 799 expect( |
| 790 propertyAccess | 800 propertyAccess |
| 791 .propertyName.auxiliaryElements.staticElement.enclosingElement.name, | 801 .propertyName.auxiliaryElements.staticElement.enclosingElement.name, |
| 792 'M2'); | 802 'M2'); |
| 793 } | 803 } |
| 794 | 804 |
| 795 void test_getter_fromMixins_bare_identifier() { | 805 void test_getter_fromMixins_bare_identifier() { |
| 796 Source source = addSource(''' | 806 Source source = addSource(''' |
| 797 class B {} | 807 class B {} |
| 798 class M1 { | 808 class M1 { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 810 LibraryElement library = resolve2(source); | 820 LibraryElement library = resolve2(source); |
| 811 assertNoErrors(source); | 821 assertNoErrors(source); |
| 812 verify([source]); | 822 verify([source]); |
| 813 // Verify that the getter for "x" in C.f() refers to the getter defined in | 823 // Verify that the getter for "x" in C.f() refers to the getter defined in |
| 814 // M2. | 824 // M2. |
| 815 ClassElement classC = library.definingCompilationUnit.types[3]; | 825 ClassElement classC = library.definingCompilationUnit.types[3]; |
| 816 MethodDeclaration f = classC.getMethod('f').computeNode(); | 826 MethodDeclaration f = classC.getMethod('f').computeNode(); |
| 817 BlockFunctionBody body = f.body; | 827 BlockFunctionBody body = f.body; |
| 818 ReturnStatement stmt = body.block.statements[0]; | 828 ReturnStatement stmt = body.block.statements[0]; |
| 819 SimpleIdentifier x = stmt.expression; | 829 SimpleIdentifier x = stmt.expression; |
| 820 expect(x.staticElement.enclosingElement.name, 'M2'); | 830 expect(resolutionMap.staticElementForIdentifier(x).enclosingElement.name, |
| 831 'M2'); |
| 821 } | 832 } |
| 822 | 833 |
| 823 void test_getter_fromMixins_property_access() { | 834 void test_getter_fromMixins_property_access() { |
| 824 Source source = addSource(''' | 835 Source source = addSource(''' |
| 825 class B {} | 836 class B {} |
| 826 class M1 { | 837 class M1 { |
| 827 get x => null; | 838 get x => null; |
| 828 } | 839 } |
| 829 class M2 { | 840 class M2 { |
| 830 get x => null; | 841 get x => null; |
| 831 } | 842 } |
| 832 class C extends B with M1, M2 {} | 843 class C extends B with M1, M2 {} |
| 833 void main() { | 844 void main() { |
| 834 var y = new C().x; | 845 var y = new C().x; |
| 835 } | 846 } |
| 836 '''); | 847 '''); |
| 837 LibraryElement library = resolve2(source); | 848 LibraryElement library = resolve2(source); |
| 838 assertNoErrors(source); | 849 assertNoErrors(source); |
| 839 verify([source]); | 850 verify([source]); |
| 840 // Verify that the getter for "x" in "new C().x" refers to the getter | 851 // Verify that the getter for "x" in "new C().x" refers to the getter |
| 841 // defined in M2. | 852 // defined in M2. |
| 842 FunctionDeclaration main = | 853 FunctionDeclaration main = |
| 843 library.definingCompilationUnit.functions[0].computeNode(); | 854 library.definingCompilationUnit.functions[0].computeNode(); |
| 844 BlockFunctionBody body = main.functionExpression.body; | 855 BlockFunctionBody body = main.functionExpression.body; |
| 845 VariableDeclarationStatement stmt = body.block.statements[0]; | 856 VariableDeclarationStatement stmt = body.block.statements[0]; |
| 846 PropertyAccess propertyAccess = stmt.variables.variables[0].initializer; | 857 PropertyAccess propertyAccess = stmt.variables.variables[0].initializer; |
| 847 expect( | 858 expect( |
| 848 propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2'); | 859 resolutionMap |
| 860 .staticElementForIdentifier(propertyAccess.propertyName) |
| 861 .enclosingElement |
| 862 .name, |
| 863 'M2'); |
| 849 } | 864 } |
| 850 | 865 |
| 851 void test_getterAndSetterWithDifferentTypes() { | 866 void test_getterAndSetterWithDifferentTypes() { |
| 852 Source source = addSource(r''' | 867 Source source = addSource(r''' |
| 853 class A { | 868 class A { |
| 854 int get f => 0; | 869 int get f => 0; |
| 855 void set f(String s) {} | 870 void set f(String s) {} |
| 856 } | 871 } |
| 857 g (A a) { | 872 g (A a) { |
| 858 a.f = a.f.toString(); | 873 a.f = a.f.toString(); |
| (...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 '''); | 1543 '''); |
| 1529 LibraryElement library = resolve2(source); | 1544 LibraryElement library = resolve2(source); |
| 1530 assertNoErrors(source); | 1545 assertNoErrors(source); |
| 1531 verify([source]); | 1546 verify([source]); |
| 1532 // Verify that the "f" in "new C().f()" refers to the "f" defined in M2. | 1547 // Verify that the "f" in "new C().f()" refers to the "f" defined in M2. |
| 1533 FunctionDeclaration main = | 1548 FunctionDeclaration main = |
| 1534 library.definingCompilationUnit.functions[0].computeNode(); | 1549 library.definingCompilationUnit.functions[0].computeNode(); |
| 1535 BlockFunctionBody body = main.functionExpression.body; | 1550 BlockFunctionBody body = main.functionExpression.body; |
| 1536 ExpressionStatement stmt = body.block.statements[0]; | 1551 ExpressionStatement stmt = body.block.statements[0]; |
| 1537 MethodInvocation expr = stmt.expression; | 1552 MethodInvocation expr = stmt.expression; |
| 1538 expect(expr.methodName.staticElement.enclosingElement.name, 'M2'); | 1553 expect( |
| 1554 resolutionMap |
| 1555 .staticElementForIdentifier(expr.methodName) |
| 1556 .enclosingElement |
| 1557 .name, |
| 1558 'M2'); |
| 1539 } | 1559 } |
| 1540 | 1560 |
| 1541 void test_method_fromMixins_bare_identifier() { | 1561 void test_method_fromMixins_bare_identifier() { |
| 1542 Source source = addSource(''' | 1562 Source source = addSource(''' |
| 1543 class B {} | 1563 class B {} |
| 1544 class M1 { | 1564 class M1 { |
| 1545 void f() {} | 1565 void f() {} |
| 1546 } | 1566 } |
| 1547 class M2 { | 1567 class M2 { |
| 1548 void f() {} | 1568 void f() {} |
| 1549 } | 1569 } |
| 1550 class C extends B with M1, M2 { | 1570 class C extends B with M1, M2 { |
| 1551 void g() { | 1571 void g() { |
| 1552 f(); | 1572 f(); |
| 1553 } | 1573 } |
| 1554 } | 1574 } |
| 1555 '''); | 1575 '''); |
| 1556 LibraryElement library = resolve2(source); | 1576 LibraryElement library = resolve2(source); |
| 1557 assertNoErrors(source); | 1577 assertNoErrors(source); |
| 1558 verify([source]); | 1578 verify([source]); |
| 1559 // Verify that the call to f() in C.g() refers to the method defined in M2. | 1579 // Verify that the call to f() in C.g() refers to the method defined in M2. |
| 1560 ClassElement classC = library.definingCompilationUnit.types[3]; | 1580 ClassElement classC = library.definingCompilationUnit.types[3]; |
| 1561 MethodDeclaration g = classC.getMethod('g').computeNode(); | 1581 MethodDeclaration g = classC.getMethod('g').computeNode(); |
| 1562 BlockFunctionBody body = g.body; | 1582 BlockFunctionBody body = g.body; |
| 1563 ExpressionStatement stmt = body.block.statements[0]; | 1583 ExpressionStatement stmt = body.block.statements[0]; |
| 1564 MethodInvocation invocation = stmt.expression; | 1584 MethodInvocation invocation = stmt.expression; |
| 1565 SimpleIdentifier methodName = invocation.methodName; | 1585 SimpleIdentifier methodName = invocation.methodName; |
| 1566 expect(methodName.staticElement.enclosingElement.name, 'M2'); | 1586 expect( |
| 1587 resolutionMap |
| 1588 .staticElementForIdentifier(methodName) |
| 1589 .enclosingElement |
| 1590 .name, |
| 1591 'M2'); |
| 1567 } | 1592 } |
| 1568 | 1593 |
| 1569 void test_method_fromMixins_invked_from_outside_class() { | 1594 void test_method_fromMixins_invked_from_outside_class() { |
| 1570 Source source = addSource(''' | 1595 Source source = addSource(''' |
| 1571 class B {} | 1596 class B {} |
| 1572 class M1 { | 1597 class M1 { |
| 1573 void f() {} | 1598 void f() {} |
| 1574 } | 1599 } |
| 1575 class M2 { | 1600 class M2 { |
| 1576 void f() {} | 1601 void f() {} |
| 1577 } | 1602 } |
| 1578 class C extends B with M1, M2 {} | 1603 class C extends B with M1, M2 {} |
| 1579 void main() { | 1604 void main() { |
| 1580 new C().f(); | 1605 new C().f(); |
| 1581 } | 1606 } |
| 1582 '''); | 1607 '''); |
| 1583 LibraryElement library = resolve2(source); | 1608 LibraryElement library = resolve2(source); |
| 1584 assertNoErrors(source); | 1609 assertNoErrors(source); |
| 1585 verify([source]); | 1610 verify([source]); |
| 1586 // Verify that the call to f() in "new C().f()" refers to the method | 1611 // Verify that the call to f() in "new C().f()" refers to the method |
| 1587 // defined in M2. | 1612 // defined in M2. |
| 1588 FunctionDeclaration main = | 1613 FunctionDeclaration main = |
| 1589 library.definingCompilationUnit.functions[0].computeNode(); | 1614 library.definingCompilationUnit.functions[0].computeNode(); |
| 1590 BlockFunctionBody body = main.functionExpression.body; | 1615 BlockFunctionBody body = main.functionExpression.body; |
| 1591 ExpressionStatement stmt = body.block.statements[0]; | 1616 ExpressionStatement stmt = body.block.statements[0]; |
| 1592 MethodInvocation invocation = stmt.expression; | 1617 MethodInvocation invocation = stmt.expression; |
| 1593 expect(invocation.methodName.staticElement.enclosingElement.name, 'M2'); | 1618 expect( |
| 1619 resolutionMap |
| 1620 .staticElementForIdentifier(invocation.methodName) |
| 1621 .enclosingElement |
| 1622 .name, |
| 1623 'M2'); |
| 1594 } | 1624 } |
| 1595 | 1625 |
| 1596 void test_method_fromSuperclassMixin() { | 1626 void test_method_fromSuperclassMixin() { |
| 1597 Source source = addSource(r''' | 1627 Source source = addSource(r''' |
| 1598 class A { | 1628 class A { |
| 1599 void m1() {} | 1629 void m1() {} |
| 1600 } | 1630 } |
| 1601 class B extends Object with A { | 1631 class B extends Object with A { |
| 1602 } | 1632 } |
| 1603 class C extends B { | 1633 class C extends B { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1673 assertNoErrors(source); | 1703 assertNoErrors(source); |
| 1674 verify([source]); | 1704 verify([source]); |
| 1675 // Verify that the setter for "x" in C.f() refers to the setter defined in | 1705 // Verify that the setter for "x" in C.f() refers to the setter defined in |
| 1676 // M2. | 1706 // M2. |
| 1677 ClassElement classC = library.definingCompilationUnit.types[3]; | 1707 ClassElement classC = library.definingCompilationUnit.types[3]; |
| 1678 MethodDeclaration f = classC.getMethod('f').computeNode(); | 1708 MethodDeclaration f = classC.getMethod('f').computeNode(); |
| 1679 BlockFunctionBody body = f.body; | 1709 BlockFunctionBody body = f.body; |
| 1680 ExpressionStatement stmt = body.block.statements[0]; | 1710 ExpressionStatement stmt = body.block.statements[0]; |
| 1681 AssignmentExpression assignment = stmt.expression; | 1711 AssignmentExpression assignment = stmt.expression; |
| 1682 SimpleIdentifier leftHandSide = assignment.leftHandSide; | 1712 SimpleIdentifier leftHandSide = assignment.leftHandSide; |
| 1683 expect(leftHandSide.staticElement.enclosingElement.name, 'M2'); | 1713 expect( |
| 1714 resolutionMap |
| 1715 .staticElementForIdentifier(leftHandSide) |
| 1716 .enclosingElement |
| 1717 .name, |
| 1718 'M2'); |
| 1684 } | 1719 } |
| 1685 | 1720 |
| 1686 void test_setter_fromMixins_property_access() { | 1721 void test_setter_fromMixins_property_access() { |
| 1687 Source source = addSource(''' | 1722 Source source = addSource(''' |
| 1688 class B {} | 1723 class B {} |
| 1689 class M1 { | 1724 class M1 { |
| 1690 set x(value) {} | 1725 set x(value) {} |
| 1691 } | 1726 } |
| 1692 class M2 { | 1727 class M2 { |
| 1693 set x(value) {} | 1728 set x(value) {} |
| 1694 } | 1729 } |
| 1695 class C extends B with M1, M2 {} | 1730 class C extends B with M1, M2 {} |
| 1696 void main() { | 1731 void main() { |
| 1697 new C().x = 1; | 1732 new C().x = 1; |
| 1698 } | 1733 } |
| 1699 '''); | 1734 '''); |
| 1700 LibraryElement library = resolve2(source); | 1735 LibraryElement library = resolve2(source); |
| 1701 assertNoErrors(source); | 1736 assertNoErrors(source); |
| 1702 verify([source]); | 1737 verify([source]); |
| 1703 // Verify that the setter for "x" in "new C().x" refers to the setter | 1738 // Verify that the setter for "x" in "new C().x" refers to the setter |
| 1704 // defined in M2. | 1739 // defined in M2. |
| 1705 FunctionDeclaration main = | 1740 FunctionDeclaration main = |
| 1706 library.definingCompilationUnit.functions[0].computeNode(); | 1741 library.definingCompilationUnit.functions[0].computeNode(); |
| 1707 BlockFunctionBody body = main.functionExpression.body; | 1742 BlockFunctionBody body = main.functionExpression.body; |
| 1708 ExpressionStatement stmt = body.block.statements[0]; | 1743 ExpressionStatement stmt = body.block.statements[0]; |
| 1709 AssignmentExpression assignment = stmt.expression; | 1744 AssignmentExpression assignment = stmt.expression; |
| 1710 PropertyAccess propertyAccess = assignment.leftHandSide; | 1745 PropertyAccess propertyAccess = assignment.leftHandSide; |
| 1711 expect( | 1746 expect( |
| 1712 propertyAccess.propertyName.staticElement.enclosingElement.name, 'M2'); | 1747 resolutionMap |
| 1748 .staticElementForIdentifier(propertyAccess.propertyName) |
| 1749 .enclosingElement |
| 1750 .name, |
| 1751 'M2'); |
| 1713 } | 1752 } |
| 1714 | 1753 |
| 1715 void test_setter_inherited() { | 1754 void test_setter_inherited() { |
| 1716 Source source = addSource(r''' | 1755 Source source = addSource(r''' |
| 1717 class A { | 1756 class A { |
| 1718 int get x => 0; | 1757 int get x => 0; |
| 1719 set x(int p) {} | 1758 set x(int p) {} |
| 1720 } | 1759 } |
| 1721 class B extends A { | 1760 class B extends A { |
| 1722 int get x => super.x == null ? 0 : super.x; | 1761 int get x => super.x == null ? 0 : super.x; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1830 // check propagated type | 1869 // check propagated type |
| 1831 FunctionType propagatedType = node.propagatedType as FunctionType; | 1870 FunctionType propagatedType = node.propagatedType as FunctionType; |
| 1832 expect(propagatedType.returnType, test.typeProvider.stringType); | 1871 expect(propagatedType.returnType, test.typeProvider.stringType); |
| 1833 } on AnalysisException catch (e, stackTrace) { | 1872 } on AnalysisException catch (e, stackTrace) { |
| 1834 thrownException[0] = new CaughtException(e, stackTrace); | 1873 thrownException[0] = new CaughtException(e, stackTrace); |
| 1835 } | 1874 } |
| 1836 } | 1875 } |
| 1837 return null; | 1876 return null; |
| 1838 } | 1877 } |
| 1839 } | 1878 } |
| OLD | NEW |