| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Core implementation of resolution. | 8 * Core implementation of resolution. |
| 9 * | 9 * |
| 10 * Do not subclass or instantiate this class outside this library | 10 * Do not subclass or instantiate this class outside this library |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 // type literal. | 752 // type literal. |
| 753 DartType type; | 753 DartType type; |
| 754 | 754 |
| 755 // TODO(johnniwinther): Remove this hack when we can pass more complex | 755 // TODO(johnniwinther): Remove this hack when we can pass more complex |
| 756 // information between methods than resolved elements. | 756 // information between methods than resolved elements. |
| 757 if (target == compiler.typeClass && node.receiver == null) { | 757 if (target == compiler.typeClass && node.receiver == null) { |
| 758 // Potentially a 'dynamic' type literal. | 758 // Potentially a 'dynamic' type literal. |
| 759 type = registry.getType(node.selector); | 759 type = registry.getType(node.selector); |
| 760 } | 760 } |
| 761 if (type == null) { | 761 if (type == null) { |
| 762 type = target.computeType(compiler); | 762 if (target.isTypedef || target.isClass) { |
| 763 TypeDeclarationElement typeDeclaration = target; |
| 764 typeDeclaration.computeType(compiler); |
| 765 type = typeDeclaration.rawType; |
| 766 } else { |
| 767 TypeVariableElement typeVariable = target; |
| 768 type = typeVariable.type; |
| 769 } |
| 763 } | 770 } |
| 764 registry.registerTypeLiteral(node, type); | 771 registry.registerTypeLiteral(node, type); |
| 765 | 772 |
| 766 if (!target.isTypeVariable) { | 773 if (!target.isTypeVariable) { |
| 767 // Don't try to make constants of calls and assignments to type literals. | 774 // Don't try to make constants of calls and assignments to type literals. |
| 768 if (!node.isCall && node.asSendSet() == null) { | 775 if (!node.isCall && node.asSendSet() == null) { |
| 769 analyzeConstantDeferred(node, enforceConst: false); | 776 analyzeConstantDeferred(node, enforceConst: false); |
| 770 } else { | 777 } else { |
| 771 // The node itself is not a constant but we register the selector (the | 778 // The node itself is not a constant but we register the selector (the |
| 772 // identifier that refers to the class/typedef) as a constant. | 779 // identifier that refers to the class/typedef) as a constant. |
| (...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 registerPotentialAccessInClosure(node, element); | 1719 registerPotentialAccessInClosure(node, element); |
| 1713 | 1720 |
| 1714 return node.isPropertyAccess | 1721 return node.isPropertyAccess |
| 1715 ? new ElementResult(element) : const NoneResult(); | 1722 ? new ElementResult(element) : const NoneResult(); |
| 1716 } | 1723 } |
| 1717 | 1724 |
| 1718 /// Handle access of a static or top level [element]. | 1725 /// Handle access of a static or top level [element]. |
| 1719 ResolutionResult handleStaticOrTopLevelAccess( | 1726 ResolutionResult handleStaticOrTopLevelAccess( |
| 1720 Send node, Name name, Element element) { | 1727 Send node, Name name, Element element) { |
| 1721 | 1728 |
| 1729 MemberElement member; |
| 1722 if (element.isAbstractField) { | 1730 if (element.isAbstractField) { |
| 1723 AbstractFieldElement abstractField = element; | 1731 AbstractFieldElement abstractField = element; |
| 1724 if (abstractField.getter != null) { | 1732 if (abstractField.getter != null) { |
| 1725 element = abstractField.getter; | 1733 member = abstractField.getter; |
| 1726 } else { | 1734 } else { |
| 1727 element = abstractField.setter; | 1735 member = abstractField.setter; |
| 1728 } | 1736 } |
| 1737 } else { |
| 1738 member = element; |
| 1729 } | 1739 } |
| 1730 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery | 1740 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery |
| 1731 // of parse errors to make [element] erroneous. Fix this! | 1741 // of parse errors to make [element] erroneous. Fix this! |
| 1732 element.computeType(compiler); | 1742 member.computeType(compiler); |
| 1733 | 1743 |
| 1734 Selector selector; | 1744 Selector selector; |
| 1735 CallStructure callStructure = CallStructure.NO_ARGS; | 1745 CallStructure callStructure = CallStructure.NO_ARGS; |
| 1736 if (node.isCall) { | 1746 if (node.isCall) { |
| 1737 callStructure = resolveArguments(node.argumentsNode); | 1747 callStructure = resolveArguments(node.argumentsNode); |
| 1738 selector = new Selector(SelectorKind.CALL, name, callStructure); | 1748 selector = new Selector(SelectorKind.CALL, name, callStructure); |
| 1739 } else { | 1749 } else { |
| 1740 selector = new Selector(SelectorKind.GETTER, name, callStructure); | 1750 selector = new Selector(SelectorKind.GETTER, name, callStructure); |
| 1741 } | 1751 } |
| 1742 AccessSemantics semantics = | 1752 AccessSemantics semantics = |
| 1743 computeStaticOrTopLevelAccessSemantics(node, element); | 1753 computeStaticOrTopLevelAccessSemantics(node, member); |
| 1744 if (node.isCall) { | 1754 if (node.isCall) { |
| 1745 bool isIncompatibleInvoke = false; | 1755 bool isIncompatibleInvoke = false; |
| 1746 switch (semantics.kind) { | 1756 switch (semantics.kind) { |
| 1747 case AccessKind.STATIC_METHOD: | 1757 case AccessKind.STATIC_METHOD: |
| 1748 case AccessKind.TOPLEVEL_METHOD: | 1758 case AccessKind.TOPLEVEL_METHOD: |
| 1749 MethodElementX method = semantics.element; | 1759 MethodElementX method = semantics.element; |
| 1750 method.computeSignature(compiler); | 1760 method.computeSignature(compiler); |
| 1751 if (!callStructure.signatureApplies(method)) { | 1761 if (!callStructure.signatureApplies(method)) { |
| 1752 registry.registerThrowNoSuchMethod(); | 1762 registry.registerThrowNoSuchMethod(); |
| 1753 registry.registerDynamicInvocation(selector); | 1763 registry.registerDynamicInvocation(selector); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1764 case AccessKind.FINAL_TOPLEVEL_FIELD: | 1774 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 1765 case AccessKind.TOPLEVEL_GETTER: | 1775 case AccessKind.TOPLEVEL_GETTER: |
| 1766 registry.registerStaticUse(semantics.element); | 1776 registry.registerStaticUse(semantics.element); |
| 1767 selector = callStructure.callSelector; | 1777 selector = callStructure.callSelector; |
| 1768 registry.registerDynamicInvocation(selector); | 1778 registry.registerDynamicInvocation(selector); |
| 1769 break; | 1779 break; |
| 1770 case AccessKind.STATIC_SETTER: | 1780 case AccessKind.STATIC_SETTER: |
| 1771 case AccessKind.TOPLEVEL_SETTER: | 1781 case AccessKind.TOPLEVEL_SETTER: |
| 1772 case AccessKind.UNRESOLVED: | 1782 case AccessKind.UNRESOLVED: |
| 1773 registry.registerThrowNoSuchMethod(); | 1783 registry.registerThrowNoSuchMethod(); |
| 1774 element = reportAndCreateErroneousElement( | 1784 member = reportAndCreateErroneousElement( |
| 1775 node.selector, name.text, | 1785 node.selector, name.text, |
| 1776 MessageKind.CANNOT_RESOLVE_GETTER, const {}); | 1786 MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
| 1777 break; | 1787 break; |
| 1778 default: | 1788 default: |
| 1779 internalError(node, | 1789 internalError(node, |
| 1780 "Unexpected statically resolved access $semantics."); | 1790 "Unexpected statically resolved access $semantics."); |
| 1781 break; | 1791 break; |
| 1782 } | 1792 } |
| 1783 registry.registerSendStructure(node, | 1793 registry.registerSendStructure(node, |
| 1784 isIncompatibleInvoke | 1794 isIncompatibleInvoke |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1798 case AccessKind.STATIC_GETTER: | 1808 case AccessKind.STATIC_GETTER: |
| 1799 case AccessKind.TOPLEVEL_FIELD: | 1809 case AccessKind.TOPLEVEL_FIELD: |
| 1800 case AccessKind.FINAL_TOPLEVEL_FIELD: | 1810 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 1801 case AccessKind.TOPLEVEL_GETTER: | 1811 case AccessKind.TOPLEVEL_GETTER: |
| 1802 registry.registerStaticUse(semantics.element); | 1812 registry.registerStaticUse(semantics.element); |
| 1803 break; | 1813 break; |
| 1804 case AccessKind.STATIC_SETTER: | 1814 case AccessKind.STATIC_SETTER: |
| 1805 case AccessKind.TOPLEVEL_SETTER: | 1815 case AccessKind.TOPLEVEL_SETTER: |
| 1806 case AccessKind.UNRESOLVED: | 1816 case AccessKind.UNRESOLVED: |
| 1807 registry.registerThrowNoSuchMethod(); | 1817 registry.registerThrowNoSuchMethod(); |
| 1808 element = reportAndCreateErroneousElement( | 1818 member = reportAndCreateErroneousElement( |
| 1809 node.selector, name.text, | 1819 node.selector, name.text, |
| 1810 MessageKind.CANNOT_RESOLVE_GETTER, const {}); | 1820 MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
| 1811 break; | 1821 break; |
| 1812 default: | 1822 default: |
| 1813 internalError(node, | 1823 internalError(node, |
| 1814 "Unexpected statically resolved access $semantics."); | 1824 "Unexpected statically resolved access $semantics."); |
| 1815 break; | 1825 break; |
| 1816 } | 1826 } |
| 1817 registry.registerSendStructure(node, | 1827 registry.registerSendStructure(node, |
| 1818 new GetStructure(semantics, selector)); | 1828 new GetStructure(semantics, selector)); |
| 1819 } | 1829 } |
| 1820 | 1830 |
| 1821 // TODO(johnniwinther): Remove these when all information goes through | 1831 // TODO(johnniwinther): Remove these when all information goes through |
| 1822 // the [SendStructure]. | 1832 // the [SendStructure]. |
| 1823 registry.useElement(node, element); | 1833 registry.useElement(node, member); |
| 1824 registry.setSelector(node, selector); | 1834 registry.setSelector(node, selector); |
| 1825 | 1835 |
| 1826 return node.isPropertyAccess | 1836 return node.isPropertyAccess |
| 1827 ? new ElementResult(element) : const NoneResult(); | 1837 ? new ElementResult(member) : const NoneResult(); |
| 1828 } | 1838 } |
| 1829 | 1839 |
| 1830 /// Handle access to resolved [element]. | 1840 /// Handle access to resolved [element]. |
| 1831 ResolutionResult handleResolvedSend(Send node, Name name, Element element) { | 1841 ResolutionResult handleResolvedSend(Send node, Name name, Element element) { |
| 1832 if (element.isAmbiguous) { | 1842 if (element.isAmbiguous) { |
| 1833 return handleAmbiguousSend(node, name, element); | 1843 return handleAmbiguousSend(node, name, element); |
| 1834 } | 1844 } |
| 1835 if (element.isErroneous) { | 1845 if (element.isErroneous) { |
| 1836 // This handles elements with parser errors. | 1846 // This handles elements with parser errors. |
| 1837 // TODO(johnniwinther): Elements with parse error should not set | 1847 // TODO(johnniwinther): Elements with parse error should not set |
| (...skipping 1427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3265 } | 3275 } |
| 3266 return const NoneResult(); | 3276 return const NoneResult(); |
| 3267 } | 3277 } |
| 3268 } | 3278 } |
| 3269 | 3279 |
| 3270 /// Looks up [name] in [scope] and unwraps the result. | 3280 /// Looks up [name] in [scope] and unwraps the result. |
| 3271 Element lookupInScope(Compiler compiler, Node node, | 3281 Element lookupInScope(Compiler compiler, Node node, |
| 3272 Scope scope, String name) { | 3282 Scope scope, String name) { |
| 3273 return Elements.unwrap(scope.lookup(name), compiler, node); | 3283 return Elements.unwrap(scope.lookup(name), compiler, node); |
| 3274 } | 3284 } |
| OLD | NEW |