| 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 library dart2js.resolution.members; | 5 library dart2js.resolution.members; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/names.dart' show Selectors; | 8 import '../common/names.dart' show Selectors; |
| 9 import '../common/resolution.dart' show Resolution; | 9 import '../common/resolution.dart' show Resolution; |
| 10 import '../compile_time_constants.dart'; | 10 import '../compile_time_constants.dart'; |
| (...skipping 1162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 registry.setSelector(node, selector); | 1173 registry.setSelector(node, selector); |
| 1174 | 1174 |
| 1175 AccessSemantics semantics; | 1175 AccessSemantics semantics; |
| 1176 if (node.isSuperCall) { | 1176 if (node.isSuperCall) { |
| 1177 semantics = checkSuperAccess(node); | 1177 semantics = checkSuperAccess(node); |
| 1178 if (semantics == null) { | 1178 if (semantics == null) { |
| 1179 semantics = computeSuperAccessSemanticsForSelector(node, selector); | 1179 semantics = computeSuperAccessSemanticsForSelector(node, selector); |
| 1180 // TODO(johnniwinther): Add information to [AccessSemantics] about | 1180 // TODO(johnniwinther): Add information to [AccessSemantics] about |
| 1181 // whether it is erroneous. | 1181 // whether it is erroneous. |
| 1182 if (semantics.kind == AccessKind.SUPER_METHOD) { | 1182 if (semantics.kind == AccessKind.SUPER_METHOD) { |
| 1183 registry.registerStaticUse(new StaticUse.superInvoke( | 1183 MethodElement superMethod = semantics.element.declaration; |
| 1184 semantics.element.declaration, selector.callStructure)); | 1184 registry.registerStaticUse( |
| 1185 new StaticUse.superInvoke(superMethod, selector.callStructure)); |
| 1185 } | 1186 } |
| 1186 // TODO(23998): Remove this when all information goes through | 1187 // TODO(23998): Remove this when all information goes through |
| 1187 // the [SendStructure]. | 1188 // the [SendStructure]. |
| 1188 registry.useElement(node, semantics.element); | 1189 registry.useElement(node, semantics.element); |
| 1189 } | 1190 } |
| 1190 } else { | 1191 } else { |
| 1191 ResolutionResult expressionResult = visitExpression(expression); | 1192 ResolutionResult expressionResult = visitExpression(expression); |
| 1192 semantics = const DynamicAccess.expression(); | 1193 semantics = const DynamicAccess.expression(); |
| 1193 registry.registerDynamicUse(new DynamicUse(selector, null)); | 1194 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| 1194 | 1195 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1347 // [SendStructure]. | 1348 // [SendStructure]. |
| 1348 registry.setSelector(node, selector); | 1349 registry.setSelector(node, selector); |
| 1349 | 1350 |
| 1350 if (node.isSuperCall) { | 1351 if (node.isSuperCall) { |
| 1351 semantics = checkSuperAccess(node); | 1352 semantics = checkSuperAccess(node); |
| 1352 if (semantics == null) { | 1353 if (semantics == null) { |
| 1353 semantics = computeSuperAccessSemanticsForSelector(node, selector); | 1354 semantics = computeSuperAccessSemanticsForSelector(node, selector); |
| 1354 // TODO(johnniwinther): Add information to [AccessSemantics] about | 1355 // TODO(johnniwinther): Add information to [AccessSemantics] about |
| 1355 // whether it is erroneous. | 1356 // whether it is erroneous. |
| 1356 if (semantics.kind == AccessKind.SUPER_METHOD) { | 1357 if (semantics.kind == AccessKind.SUPER_METHOD) { |
| 1357 registry.registerStaticUse(new StaticUse.superInvoke( | 1358 MethodElement superMethod = semantics.element.declaration; |
| 1358 semantics.element.declaration, selector.callStructure)); | 1359 registry.registerStaticUse( |
| 1360 new StaticUse.superInvoke(superMethod, selector.callStructure)); |
| 1359 } | 1361 } |
| 1360 // TODO(23998): Remove this when all information goes through | 1362 // TODO(23998): Remove this when all information goes through |
| 1361 // the [SendStructure]. | 1363 // the [SendStructure]. |
| 1362 registry.useElement(node, semantics.element); | 1364 registry.useElement(node, semantics.element); |
| 1363 } | 1365 } |
| 1364 visitExpression(right); | 1366 visitExpression(right); |
| 1365 } else { | 1367 } else { |
| 1366 ResolutionResult leftResult = visitExpression(left); | 1368 ResolutionResult leftResult = visitExpression(left); |
| 1367 ResolutionResult rightResult = visitExpression(right); | 1369 ResolutionResult rightResult = visitExpression(right); |
| 1368 registry.registerDynamicUse(new DynamicUse(selector, null)); | 1370 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1566 case AccessKind.SUPER_METHOD: | 1568 case AccessKind.SUPER_METHOD: |
| 1567 MethodElement superMethod = semantics.element; | 1569 MethodElement superMethod = semantics.element; |
| 1568 superMethod.computeType(resolution); | 1570 superMethod.computeType(resolution); |
| 1569 if (!callStructure.signatureApplies(superMethod.type)) { | 1571 if (!callStructure.signatureApplies(superMethod.type)) { |
| 1570 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 1572 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); |
| 1571 registry.registerDynamicUse(new DynamicUse(selector, null)); | 1573 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| 1572 registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD); | 1574 registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD); |
| 1573 isIncompatibleInvoke = true; | 1575 isIncompatibleInvoke = true; |
| 1574 } else { | 1576 } else { |
| 1575 registry.registerStaticUse( | 1577 registry.registerStaticUse( |
| 1576 new StaticUse.superInvoke(semantics.element, callStructure)); | 1578 new StaticUse.superInvoke(superMethod, callStructure)); |
| 1577 } | 1579 } |
| 1578 break; | 1580 break; |
| 1579 case AccessKind.SUPER_FIELD: | 1581 case AccessKind.SUPER_FIELD: |
| 1580 case AccessKind.SUPER_FINAL_FIELD: | 1582 case AccessKind.SUPER_FINAL_FIELD: |
| 1581 case AccessKind.SUPER_GETTER: | 1583 case AccessKind.SUPER_GETTER: |
| 1582 registry.registerStaticUse(new StaticUse.superGet(semantics.element)); | 1584 MemberElement superMember = semantics.element; |
| 1585 registry.registerStaticUse(new StaticUse.superGet(superMember)); |
| 1583 selector = callStructure.callSelector; | 1586 selector = callStructure.callSelector; |
| 1584 registry.registerDynamicUse(new DynamicUse(selector, null)); | 1587 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| 1585 break; | 1588 break; |
| 1586 case AccessKind.SUPER_SETTER: | 1589 case AccessKind.SUPER_SETTER: |
| 1587 case AccessKind.UNRESOLVED_SUPER: | 1590 case AccessKind.UNRESOLVED_SUPER: |
| 1588 // NoSuchMethod registered in [computeSuperSemantics]. | 1591 // NoSuchMethod registered in [computeSuperSemantics]. |
| 1589 break; | 1592 break; |
| 1590 case AccessKind.INVALID: | 1593 case AccessKind.INVALID: |
| 1591 // 'super' is not allowed. | 1594 // 'super' is not allowed. |
| 1592 break; | 1595 break; |
| 1593 default: | 1596 default: |
| 1594 reporter.internalError( | 1597 reporter.internalError( |
| 1595 node, "Unexpected super property access $semantics."); | 1598 node, "Unexpected super property access $semantics."); |
| 1596 break; | 1599 break; |
| 1597 } | 1600 } |
| 1598 registry.registerSendStructure( | 1601 registry.registerSendStructure( |
| 1599 node, | 1602 node, |
| 1600 isIncompatibleInvoke | 1603 isIncompatibleInvoke |
| 1601 ? new IncompatibleInvokeStructure(semantics, selector) | 1604 ? new IncompatibleInvokeStructure(semantics, selector) |
| 1602 : new InvokeStructure(semantics, selector)); | 1605 : new InvokeStructure(semantics, selector)); |
| 1603 } else { | 1606 } else { |
| 1604 switch (semantics.kind) { | 1607 switch (semantics.kind) { |
| 1605 case AccessKind.SUPER_METHOD: | 1608 case AccessKind.SUPER_METHOD: |
| 1606 // TODO(johnniwinther): Method this should be registered as a | 1609 // TODO(johnniwinther): Method this should be registered as a |
| 1607 // closurization. | 1610 // closurization. |
| 1608 registry | 1611 MethodElement superMethod = semantics.element; |
| 1609 .registerStaticUse(new StaticUse.superTearOff(semantics.element)); | 1612 registry.registerStaticUse(new StaticUse.superTearOff(superMethod)); |
| 1610 break; | 1613 break; |
| 1611 case AccessKind.SUPER_FIELD: | 1614 case AccessKind.SUPER_FIELD: |
| 1612 case AccessKind.SUPER_FINAL_FIELD: | 1615 case AccessKind.SUPER_FINAL_FIELD: |
| 1613 case AccessKind.SUPER_GETTER: | 1616 case AccessKind.SUPER_GETTER: |
| 1614 registry.registerStaticUse(new StaticUse.superGet(semantics.element)); | 1617 MemberElement superMember = semantics.element; |
| 1618 registry.registerStaticUse(new StaticUse.superGet(superMember)); |
| 1615 break; | 1619 break; |
| 1616 case AccessKind.SUPER_SETTER: | 1620 case AccessKind.SUPER_SETTER: |
| 1617 case AccessKind.UNRESOLVED_SUPER: | 1621 case AccessKind.UNRESOLVED_SUPER: |
| 1618 // NoSuchMethod registered in [computeSuperSemantics]. | 1622 // NoSuchMethod registered in [computeSuperSemantics]. |
| 1619 break; | 1623 break; |
| 1620 case AccessKind.INVALID: | 1624 case AccessKind.INVALID: |
| 1621 // 'super' is not allowed. | 1625 // 'super' is not allowed. |
| 1622 break; | 1626 break; |
| 1623 default: | 1627 default: |
| 1624 reporter.internalError( | 1628 reporter.internalError( |
| (...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2661 case AccessKind.STATIC_METHOD: | 2665 case AccessKind.STATIC_METHOD: |
| 2662 case AccessKind.TOPLEVEL_METHOD: | 2666 case AccessKind.TOPLEVEL_METHOD: |
| 2663 MethodElement method = semantics.element; | 2667 MethodElement method = semantics.element; |
| 2664 method.computeType(resolution); | 2668 method.computeType(resolution); |
| 2665 if (!callStructure.signatureApplies(method.type)) { | 2669 if (!callStructure.signatureApplies(method.type)) { |
| 2666 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 2670 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); |
| 2667 registry.registerDynamicUse(new DynamicUse(selector, null)); | 2671 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| 2668 isIncompatibleInvoke = true; | 2672 isIncompatibleInvoke = true; |
| 2669 } else { | 2673 } else { |
| 2670 registry.registerStaticUse( | 2674 registry.registerStaticUse( |
| 2671 new StaticUse.staticInvoke(semantics.element, callStructure)); | 2675 new StaticUse.staticInvoke(method, callStructure)); |
| 2672 handleForeignCall(node, semantics.element, callStructure); | 2676 handleForeignCall(node, semantics.element, callStructure); |
| 2673 if (method == resolution.commonElements.identicalFunction && | 2677 if (method == resolution.commonElements.identicalFunction && |
| 2674 argumentsResult.isValidAsConstant) { | 2678 argumentsResult.isValidAsConstant) { |
| 2675 result = new ConstantResult( | 2679 result = new ConstantResult( |
| 2676 node, | 2680 node, |
| 2677 new IdenticalConstantExpression( | 2681 new IdenticalConstantExpression( |
| 2678 argumentsResult.argumentResults[0].constant, | 2682 argumentsResult.argumentResults[0].constant, |
| 2679 argumentsResult.argumentResults[1].constant)); | 2683 argumentsResult.argumentResults[1].constant)); |
| 2680 } | 2684 } |
| 2681 } | 2685 } |
| 2682 break; | 2686 break; |
| 2683 case AccessKind.STATIC_FIELD: | 2687 case AccessKind.STATIC_FIELD: |
| 2684 case AccessKind.FINAL_STATIC_FIELD: | 2688 case AccessKind.FINAL_STATIC_FIELD: |
| 2685 case AccessKind.STATIC_GETTER: | 2689 case AccessKind.STATIC_GETTER: |
| 2686 case AccessKind.TOPLEVEL_FIELD: | 2690 case AccessKind.TOPLEVEL_FIELD: |
| 2687 case AccessKind.FINAL_TOPLEVEL_FIELD: | 2691 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 2688 case AccessKind.TOPLEVEL_GETTER: | 2692 case AccessKind.TOPLEVEL_GETTER: |
| 2689 registry | 2693 MemberElement member = semantics.element; |
| 2690 .registerStaticUse(new StaticUse.staticGet(semantics.element)); | 2694 registry.registerStaticUse(new StaticUse.staticGet(member)); |
| 2691 selector = callStructure.callSelector; | 2695 selector = callStructure.callSelector; |
| 2692 registry.registerDynamicUse(new DynamicUse(selector, null)); | 2696 registry.registerDynamicUse(new DynamicUse(selector, null)); |
| 2693 break; | 2697 break; |
| 2694 case AccessKind.STATIC_SETTER: | 2698 case AccessKind.STATIC_SETTER: |
| 2695 case AccessKind.TOPLEVEL_SETTER: | 2699 case AccessKind.TOPLEVEL_SETTER: |
| 2696 case AccessKind.UNRESOLVED: | 2700 case AccessKind.UNRESOLVED: |
| 2697 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 2701 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); |
| 2698 member = reportAndCreateErroneousElement(node.selector, name.text, | 2702 member = reportAndCreateErroneousElement(node.selector, name.text, |
| 2699 MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name}); | 2703 MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name}); |
| 2700 break; | 2704 break; |
| 2701 default: | 2705 default: |
| 2702 reporter.internalError( | 2706 reporter.internalError( |
| 2703 node, "Unexpected statically resolved access $semantics."); | 2707 node, "Unexpected statically resolved access $semantics."); |
| 2704 break; | 2708 break; |
| 2705 } | 2709 } |
| 2706 registry.registerSendStructure( | 2710 registry.registerSendStructure( |
| 2707 node, | 2711 node, |
| 2708 isIncompatibleInvoke | 2712 isIncompatibleInvoke |
| 2709 ? new IncompatibleInvokeStructure(semantics, selector) | 2713 ? new IncompatibleInvokeStructure(semantics, selector) |
| 2710 : new InvokeStructure(semantics, selector)); | 2714 : new InvokeStructure(semantics, selector)); |
| 2711 } else { | 2715 } else { |
| 2712 selector = new Selector.getter(name); | 2716 selector = new Selector.getter(name); |
| 2713 switch (semantics.kind) { | 2717 switch (semantics.kind) { |
| 2714 case AccessKind.STATIC_METHOD: | 2718 case AccessKind.STATIC_METHOD: |
| 2715 case AccessKind.TOPLEVEL_METHOD: | 2719 case AccessKind.TOPLEVEL_METHOD: |
| 2716 registry.registerStaticUse( | 2720 MethodElement method = semantics.element; |
| 2717 new StaticUse.staticTearOff(semantics.element)); | 2721 registry.registerStaticUse(new StaticUse.staticTearOff(method)); |
| 2718 break; | 2722 break; |
| 2719 case AccessKind.STATIC_FIELD: | 2723 case AccessKind.STATIC_FIELD: |
| 2720 case AccessKind.FINAL_STATIC_FIELD: | 2724 case AccessKind.FINAL_STATIC_FIELD: |
| 2721 case AccessKind.STATIC_GETTER: | 2725 case AccessKind.STATIC_GETTER: |
| 2722 case AccessKind.TOPLEVEL_FIELD: | 2726 case AccessKind.TOPLEVEL_FIELD: |
| 2723 case AccessKind.FINAL_TOPLEVEL_FIELD: | 2727 case AccessKind.FINAL_TOPLEVEL_FIELD: |
| 2724 case AccessKind.TOPLEVEL_GETTER: | 2728 case AccessKind.TOPLEVEL_GETTER: |
| 2725 registry | 2729 MemberElement member = semantics.element; |
| 2726 .registerStaticUse(new StaticUse.staticGet(semantics.element)); | 2730 registry.registerStaticUse(new StaticUse.staticGet(member)); |
| 2727 break; | 2731 break; |
| 2728 case AccessKind.STATIC_SETTER: | 2732 case AccessKind.STATIC_SETTER: |
| 2729 case AccessKind.TOPLEVEL_SETTER: | 2733 case AccessKind.TOPLEVEL_SETTER: |
| 2730 case AccessKind.UNRESOLVED: | 2734 case AccessKind.UNRESOLVED: |
| 2731 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 2735 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); |
| 2732 member = reportAndCreateErroneousElement(node.selector, name.text, | 2736 member = reportAndCreateErroneousElement(node.selector, name.text, |
| 2733 MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name}); | 2737 MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name}); |
| 2734 break; | 2738 break; |
| 2735 default: | 2739 default: |
| 2736 reporter.internalError( | 2740 reporter.internalError( |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2826 } else { | 2830 } else { |
| 2827 MemberElement member = element; | 2831 MemberElement member = element; |
| 2828 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery | 2832 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery |
| 2829 // of parse errors to make [element] erroneous. Fix this! | 2833 // of parse errors to make [element] erroneous. Fix this! |
| 2830 member.computeType(resolution); | 2834 member.computeType(resolution); |
| 2831 if (member.isMalformed) { | 2835 if (member.isMalformed) { |
| 2832 // [member] has parse errors. | 2836 // [member] has parse errors. |
| 2833 semantics = new StaticAccess.unresolved(member); | 2837 semantics = new StaticAccess.unresolved(member); |
| 2834 } else if (member.isFunction) { | 2838 } else if (member.isFunction) { |
| 2835 // `a = b`, `a++` or `a += b` where `a` is a function. | 2839 // `a = b`, `a++` or `a += b` where `a` is a function. |
| 2840 MethodElement method = member; |
| 2836 ErroneousElement error = reportAndCreateErroneousElement( | 2841 ErroneousElement error = reportAndCreateErroneousElement( |
| 2837 node.selector, name.text, MessageKind.ASSIGNING_METHOD, const {}); | 2842 node.selector, name.text, MessageKind.ASSIGNING_METHOD, const {}); |
| 2838 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 2843 registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); |
| 2839 if (node.isComplex) { | 2844 if (node.isComplex) { |
| 2840 // `a++` or `a += b` where `a` is a function. | 2845 // `a++` or `a += b` where `a` is a function. |
| 2841 registry.registerStaticUse(new StaticUse.staticTearOff(element)); | 2846 registry.registerStaticUse(new StaticUse.staticTearOff(method)); |
| 2842 } | 2847 } |
| 2843 semantics = member.isTopLevel | 2848 semantics = member.isTopLevel |
| 2844 ? new StaticAccess.topLevelMethod(member) | 2849 ? new StaticAccess.topLevelMethod(method) |
| 2845 : new StaticAccess.staticMethod(member); | 2850 : new StaticAccess.staticMethod(method); |
| 2846 } else { | 2851 } else { |
| 2847 // `a = b`, `a++` or `a += b` where `a` is a field. | 2852 // `a = b`, `a++` or `a += b` where `a` is a field. |
| 2848 assert(invariant(node, member.isField, | 2853 assert(invariant(node, member.isField, |
| 2849 message: "Unexpected element: $member.")); | 2854 message: "Unexpected element: $member.")); |
| 2850 if (node.isComplex) { | 2855 if (node.isComplex) { |
| 2851 // `a++` or `a += b` where `a` is a field. | 2856 // `a++` or `a += b` where `a` is a field. |
| 2852 registry.registerStaticUse(new StaticUse.staticGet(member)); | 2857 registry.registerStaticUse(new StaticUse.staticGet(member)); |
| 2853 } | 2858 } |
| 2854 if (member.isFinal || member.isConst) { | 2859 if (member.isFinal || member.isConst) { |
| 2855 ErroneousElement error = reportAndCreateErroneousElement( | 2860 ErroneousElement error = reportAndCreateErroneousElement( |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3161 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3166 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
| 3162 registry.setSelector(node, setterSelector); | 3167 registry.setSelector(node, setterSelector); |
| 3163 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3168 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
| 3164 | 3169 |
| 3165 if (semantics == null) { | 3170 if (semantics == null) { |
| 3166 semantics = computeSuperAccessSemanticsForSelectors( | 3171 semantics = computeSuperAccessSemanticsForSelectors( |
| 3167 node, getterSelector, setterSelector, | 3172 node, getterSelector, setterSelector, |
| 3168 isIndex: true); | 3173 isIndex: true); |
| 3169 | 3174 |
| 3170 if (!semantics.getter.isError) { | 3175 if (!semantics.getter.isError) { |
| 3171 registry.registerStaticUse(new StaticUse.superInvoke( | 3176 MethodElement getter = semantics.getter; |
| 3172 semantics.getter, getterSelector.callStructure)); | 3177 registry.registerStaticUse( |
| 3178 new StaticUse.superInvoke(getter, getterSelector.callStructure)); |
| 3173 } | 3179 } |
| 3174 if (!semantics.setter.isError) { | 3180 if (!semantics.setter.isError) { |
| 3175 registry.registerStaticUse(new StaticUse.superInvoke( | 3181 MethodElement setter = semantics.setter; |
| 3176 semantics.setter, setterSelector.callStructure)); | 3182 registry.registerStaticUse( |
| 3183 new StaticUse.superInvoke(setter, setterSelector.callStructure)); |
| 3177 } | 3184 } |
| 3178 | 3185 |
| 3179 // TODO(23998): Remove these when elements are only accessed | 3186 // TODO(23998): Remove these when elements are only accessed |
| 3180 // through the send structure. | 3187 // through the send structure. |
| 3181 registry.useElement(node, semantics.setter); | 3188 registry.useElement(node, semantics.setter); |
| 3182 registry.useElement(node.selector, semantics.getter); | 3189 registry.useElement(node.selector, semantics.getter); |
| 3183 } | 3190 } |
| 3184 registry.registerDynamicUse(new DynamicUse(operatorSelector, null)); | 3191 registry.registerDynamicUse(new DynamicUse(operatorSelector, null)); |
| 3185 | 3192 |
| 3186 SendStructure sendStructure = node.isPrefix | 3193 SendStructure sendStructure = node.isPrefix |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3202 | 3209 |
| 3203 // TODO(23998): Remove these when elements are only accessed | 3210 // TODO(23998): Remove these when elements are only accessed |
| 3204 // through the send structure. | 3211 // through the send structure. |
| 3205 registry.useElement(node, semantics.setter); | 3212 registry.useElement(node, semantics.setter); |
| 3206 } | 3213 } |
| 3207 | 3214 |
| 3208 // TODO(23998): Remove this when selectors are only accessed | 3215 // TODO(23998): Remove this when selectors are only accessed |
| 3209 // through the send structure. | 3216 // through the send structure. |
| 3210 registry.setSelector(node, setterSelector); | 3217 registry.setSelector(node, setterSelector); |
| 3211 if (!semantics.setter.isError) { | 3218 if (!semantics.setter.isError) { |
| 3212 registry.registerStaticUse(new StaticUse.superInvoke( | 3219 MethodElement setter = semantics.setter; |
| 3213 semantics.setter, setterSelector.callStructure)); | 3220 registry.registerStaticUse( |
| 3221 new StaticUse.superInvoke(setter, setterSelector.callStructure)); |
| 3214 } | 3222 } |
| 3215 | 3223 |
| 3216 SendStructure sendStructure = new IndexSetStructure(semantics); | 3224 SendStructure sendStructure = new IndexSetStructure(semantics); |
| 3217 registry.registerSendStructure(node, sendStructure); | 3225 registry.registerSendStructure(node, sendStructure); |
| 3218 return const NoneResult(); | 3226 return const NoneResult(); |
| 3219 } else { | 3227 } else { |
| 3220 // `super[a] += b`. | 3228 // `super[a] += b`. |
| 3221 Selector getterSelector = new Selector.index(); | 3229 Selector getterSelector = new Selector.index(); |
| 3222 Selector setterSelector = new Selector.indexSet(); | 3230 Selector setterSelector = new Selector.indexSet(); |
| 3223 Selector operatorSelector = | 3231 Selector operatorSelector = |
| 3224 new Selector.binaryOperator(operator.selectorName); | 3232 new Selector.binaryOperator(operator.selectorName); |
| 3225 if (semantics == null) { | 3233 if (semantics == null) { |
| 3226 semantics = computeSuperAccessSemanticsForSelectors( | 3234 semantics = computeSuperAccessSemanticsForSelectors( |
| 3227 node, getterSelector, setterSelector, | 3235 node, getterSelector, setterSelector, |
| 3228 isIndex: true); | 3236 isIndex: true); |
| 3229 | 3237 |
| 3230 if (!semantics.getter.isError) { | 3238 if (!semantics.getter.isError) { |
| 3239 MethodElement getter = semantics.getter; |
| 3231 registry.registerStaticUse(new StaticUse.superInvoke( | 3240 registry.registerStaticUse(new StaticUse.superInvoke( |
| 3232 semantics.getter, getterSelector.callStructure)); | 3241 getter, getterSelector.callStructure)); |
| 3233 } | 3242 } |
| 3234 if (!semantics.setter.isError) { | 3243 if (!semantics.setter.isError) { |
| 3244 MethodElement setter = semantics.setter; |
| 3235 registry.registerStaticUse(new StaticUse.superInvoke( | 3245 registry.registerStaticUse(new StaticUse.superInvoke( |
| 3236 semantics.setter, setterSelector.callStructure)); | 3246 setter, setterSelector.callStructure)); |
| 3237 } | 3247 } |
| 3238 | 3248 |
| 3239 // TODO(23998): Remove these when elements are only accessed | 3249 // TODO(23998): Remove these when elements are only accessed |
| 3240 // through the send structure. | 3250 // through the send structure. |
| 3241 registry.useElement(node, semantics.setter); | 3251 registry.useElement(node, semantics.setter); |
| 3242 registry.useElement(node.selector, semantics.getter); | 3252 registry.useElement(node.selector, semantics.getter); |
| 3243 } | 3253 } |
| 3244 | 3254 |
| 3245 // TODO(23998): Remove these when selectors are only accessed | 3255 // TODO(23998): Remove these when selectors are only accessed |
| 3246 // through the send structure. | 3256 // through the send structure. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3269 Identifier selector = node.selector.asIdentifier(); | 3279 Identifier selector = node.selector.asIdentifier(); |
| 3270 String text = selector.source; | 3280 String text = selector.source; |
| 3271 Name name = new Name(text, enclosingElement.library); | 3281 Name name = new Name(text, enclosingElement.library); |
| 3272 String operatorText = node.assignmentOperator.source; | 3282 String operatorText = node.assignmentOperator.source; |
| 3273 Selector getterSelector = new Selector.getter(name); | 3283 Selector getterSelector = new Selector.getter(name); |
| 3274 Selector setterSelector = new Selector.setter(name); | 3284 Selector setterSelector = new Selector.setter(name); |
| 3275 | 3285 |
| 3276 void registerStaticUses(AccessSemantics semantics) { | 3286 void registerStaticUses(AccessSemantics semantics) { |
| 3277 switch (semantics.kind) { | 3287 switch (semantics.kind) { |
| 3278 case AccessKind.SUPER_METHOD: | 3288 case AccessKind.SUPER_METHOD: |
| 3279 registry | 3289 MethodElement method = semantics.element; |
| 3280 .registerStaticUse(new StaticUse.superTearOff(semantics.element)); | 3290 registry.registerStaticUse(new StaticUse.superTearOff(method)); |
| 3281 break; | 3291 break; |
| 3282 case AccessKind.SUPER_GETTER: | 3292 case AccessKind.SUPER_GETTER: |
| 3283 registry.registerStaticUse(new StaticUse.superGet(semantics.getter)); | 3293 MethodElement getter = semantics.getter; |
| 3294 registry.registerStaticUse(new StaticUse.superGet(getter)); |
| 3284 break; | 3295 break; |
| 3285 case AccessKind.SUPER_SETTER: | 3296 case AccessKind.SUPER_SETTER: |
| 3286 registry.registerStaticUse( | 3297 MethodElement setter = semantics.setter; |
| 3287 new StaticUse.superSetterSet(semantics.setter)); | 3298 registry.registerStaticUse(new StaticUse.superSetterSet(setter)); |
| 3288 break; | 3299 break; |
| 3289 case AccessKind.SUPER_FIELD: | 3300 case AccessKind.SUPER_FIELD: |
| 3290 registry.registerStaticUse(new StaticUse.superGet(semantics.element)); | 3301 FieldElement field = semantics.element; |
| 3291 registry.registerStaticUse( | 3302 registry.registerStaticUse(new StaticUse.superGet(field)); |
| 3292 new StaticUse.superFieldSet(semantics.element)); | 3303 registry.registerStaticUse(new StaticUse.superFieldSet(field)); |
| 3293 break; | 3304 break; |
| 3294 case AccessKind.SUPER_FINAL_FIELD: | 3305 case AccessKind.SUPER_FINAL_FIELD: |
| 3295 registry.registerStaticUse(new StaticUse.superGet(semantics.element)); | 3306 FieldElement field = semantics.element; |
| 3307 registry.registerStaticUse(new StaticUse.superGet(field)); |
| 3296 break; | 3308 break; |
| 3297 case AccessKind.COMPOUND: | 3309 case AccessKind.COMPOUND: |
| 3298 CompoundAccessSemantics compoundSemantics = semantics; | 3310 CompoundAccessSemantics compoundSemantics = semantics; |
| 3299 switch (compoundSemantics.compoundAccessKind) { | 3311 switch (compoundSemantics.compoundAccessKind) { |
| 3300 case CompoundAccessKind.SUPER_GETTER_FIELD: | 3312 case CompoundAccessKind.SUPER_GETTER_FIELD: |
| 3301 case CompoundAccessKind.SUPER_FIELD_FIELD: | 3313 case CompoundAccessKind.SUPER_FIELD_FIELD: |
| 3302 registry | 3314 MemberElement getter = semantics.getter; |
| 3303 .registerStaticUse(new StaticUse.superGet(semantics.getter)); | 3315 FieldElement setter = semantics.setter; |
| 3304 registry.registerStaticUse( | 3316 registry.registerStaticUse(new StaticUse.superGet(getter)); |
| 3305 new StaticUse.superFieldSet(semantics.setter)); | 3317 registry.registerStaticUse(new StaticUse.superFieldSet(setter)); |
| 3306 break; | 3318 break; |
| 3307 case CompoundAccessKind.SUPER_FIELD_SETTER: | 3319 case CompoundAccessKind.SUPER_FIELD_SETTER: |
| 3308 case CompoundAccessKind.SUPER_GETTER_SETTER: | 3320 case CompoundAccessKind.SUPER_GETTER_SETTER: |
| 3309 registry | 3321 MemberElement getter = semantics.getter; |
| 3310 .registerStaticUse(new StaticUse.superGet(semantics.getter)); | 3322 MethodElement setter = semantics.setter; |
| 3311 registry.registerStaticUse( | 3323 registry.registerStaticUse(new StaticUse.superGet(getter)); |
| 3312 new StaticUse.superSetterSet(semantics.setter)); | 3324 registry.registerStaticUse(new StaticUse.superSetterSet(setter)); |
| 3313 break; | 3325 break; |
| 3314 case CompoundAccessKind.SUPER_METHOD_SETTER: | 3326 case CompoundAccessKind.SUPER_METHOD_SETTER: |
| 3315 registry.registerStaticUse( | 3327 MethodElement setter = semantics.setter; |
| 3316 new StaticUse.superSetterSet(semantics.setter)); | 3328 registry.registerStaticUse(new StaticUse.superSetterSet(setter)); |
| 3317 break; | 3329 break; |
| 3318 case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: | 3330 case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: |
| 3319 registry.registerStaticUse( | 3331 MethodElement setter = semantics.setter; |
| 3320 new StaticUse.superSetterSet(semantics.setter)); | 3332 registry.registerStaticUse(new StaticUse.superSetterSet(setter)); |
| 3321 break; | 3333 break; |
| 3322 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: | 3334 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
| 3323 registry | 3335 MethodElement getter = semantics.getter; |
| 3324 .registerStaticUse(new StaticUse.superGet(semantics.getter)); | 3336 registry.registerStaticUse(new StaticUse.superGet(getter)); |
| 3325 break; | 3337 break; |
| 3326 default: | 3338 default: |
| 3327 break; | 3339 break; |
| 3328 } | 3340 } |
| 3329 break; | 3341 break; |
| 3330 default: | 3342 default: |
| 3331 break; | 3343 break; |
| 3332 } | 3344 } |
| 3333 } | 3345 } |
| 3334 | 3346 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3364 reporter.reportWarningMessage( | 3376 reporter.reportWarningMessage( |
| 3365 node, MessageKind.ASSIGNING_METHOD_IN_SUPER, { | 3377 node, MessageKind.ASSIGNING_METHOD_IN_SUPER, { |
| 3366 'name': name, | 3378 'name': name, |
| 3367 'superclassName': semantics.setter.enclosingClass.name | 3379 'superclassName': semantics.setter.enclosingClass.name |
| 3368 }); | 3380 }); |
| 3369 // TODO(johnniwinther): This shouldn't be needed. | 3381 // TODO(johnniwinther): This shouldn't be needed. |
| 3370 registry.registerDynamicUse(new DynamicUse(setterSelector, null)); | 3382 registry.registerDynamicUse(new DynamicUse(setterSelector, null)); |
| 3371 registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD); | 3383 registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD); |
| 3372 break; | 3384 break; |
| 3373 case AccessKind.SUPER_FIELD: | 3385 case AccessKind.SUPER_FIELD: |
| 3374 registry.registerStaticUse( | 3386 FieldElement field = semantics.setter; |
| 3375 new StaticUse.superFieldSet(semantics.setter)); | 3387 registry.registerStaticUse(new StaticUse.superFieldSet(field)); |
| 3376 break; | 3388 break; |
| 3377 case AccessKind.SUPER_SETTER: | 3389 case AccessKind.SUPER_SETTER: |
| 3378 registry.registerStaticUse( | 3390 MethodElement setter = semantics.setter; |
| 3379 new StaticUse.superSetterSet(semantics.setter)); | 3391 registry.registerStaticUse(new StaticUse.superSetterSet(setter)); |
| 3380 break; | 3392 break; |
| 3381 default: | 3393 default: |
| 3382 break; | 3394 break; |
| 3383 } | 3395 } |
| 3384 } | 3396 } |
| 3385 return handleUpdate(node, name, semantics); | 3397 return handleUpdate(node, name, semantics); |
| 3386 } else { | 3398 } else { |
| 3387 // `super.a += b`. | 3399 // `super.a += b`. |
| 3388 if (semantics == null) { | 3400 if (semantics == null) { |
| 3389 semantics = computeSuperAccessSemanticsForSelectors( | 3401 semantics = computeSuperAccessSemanticsForSelectors( |
| (...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3895 type), | 3907 type), |
| 3896 selector)); | 3908 selector)); |
| 3897 return new ResolutionResult.forElement(constructor); | 3909 return new ResolutionResult.forElement(constructor); |
| 3898 } | 3910 } |
| 3899 | 3911 |
| 3900 if (!isInvalid) { | 3912 if (!isInvalid) { |
| 3901 // [constructor] might be the implementation element | 3913 // [constructor] might be the implementation element |
| 3902 // and only declaration elements may be registered. | 3914 // and only declaration elements may be registered. |
| 3903 // TODO(johniwinther): Avoid registration of `type` in face of redirecting | 3915 // TODO(johniwinther): Avoid registration of `type` in face of redirecting |
| 3904 // factory constructors. | 3916 // factory constructors. |
| 3917 ConstructorElement declaration = constructor.declaration; |
| 3905 registry.registerStaticUse(node.isConst | 3918 registry.registerStaticUse(node.isConst |
| 3906 ? new StaticUse.constConstructorInvoke( | 3919 ? new StaticUse.constConstructorInvoke( |
| 3907 constructor.declaration, callStructure, type) | 3920 declaration, callStructure, type) |
| 3908 : new StaticUse.typedConstructorInvoke( | 3921 : new StaticUse.typedConstructorInvoke( |
| 3909 constructor.declaration, callStructure, type)); | 3922 constructor, callStructure, type)); |
| 3910 ResolutionInterfaceType interfaceType = type; | 3923 ResolutionInterfaceType interfaceType = type; |
| 3911 if (interfaceType.typeArguments | 3924 if (interfaceType.typeArguments |
| 3912 .any((ResolutionDartType type) => !type.isDynamic)) { | 3925 .any((ResolutionDartType type) => !type.isDynamic)) { |
| 3913 registry.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); | 3926 registry.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); |
| 3914 } | 3927 } |
| 3915 } | 3928 } |
| 3916 | 3929 |
| 3917 ResolutionResult resolutionResult = const NoneResult(); | 3930 ResolutionResult resolutionResult = const NoneResult(); |
| 3918 if (node.isConst) { | 3931 if (node.isConst) { |
| 3919 bool isValidAsConstant = !isInvalid && constructor.isConst; | 3932 bool isValidAsConstant = !isInvalid && constructor.isConst; |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4344 loopVariable = registry.getDefinition(identifier); | 4357 loopVariable = registry.getDefinition(identifier); |
| 4345 } | 4358 } |
| 4346 } else { | 4359 } else { |
| 4347 reporter.reportErrorMessage(declaration, MessageKind.INVALID_FOR_IN); | 4360 reporter.reportErrorMessage(declaration, MessageKind.INVALID_FOR_IN); |
| 4348 } | 4361 } |
| 4349 if (loopVariableSelector != null) { | 4362 if (loopVariableSelector != null) { |
| 4350 registry.setSelector(declaration, loopVariableSelector); | 4363 registry.setSelector(declaration, loopVariableSelector); |
| 4351 if (loopVariable == null || loopVariable.isInstanceMember) { | 4364 if (loopVariable == null || loopVariable.isInstanceMember) { |
| 4352 registry.registerDynamicUse(new DynamicUse(loopVariableSelector, null)); | 4365 registry.registerDynamicUse(new DynamicUse(loopVariableSelector, null)); |
| 4353 } else if (loopVariable.isStatic || loopVariable.isTopLevel) { | 4366 } else if (loopVariable.isStatic || loopVariable.isTopLevel) { |
| 4354 registry.registerStaticUse( | 4367 MemberElement member = loopVariable.declaration; |
| 4355 new StaticUse.staticSet(loopVariable.declaration)); | 4368 registry.registerStaticUse(new StaticUse.staticSet(member)); |
| 4356 } | 4369 } |
| 4357 } else { | 4370 } else { |
| 4358 // The selector may only be null if we reported an error. | 4371 // The selector may only be null if we reported an error. |
| 4359 assert(invariant(declaration, reporter.hasReportedError)); | 4372 assert(invariant(declaration, reporter.hasReportedError)); |
| 4360 } | 4373 } |
| 4361 if (loopVariable != null) { | 4374 if (loopVariable != null) { |
| 4362 // loopVariable may be null if it could not be resolved. | 4375 // loopVariable may be null if it could not be resolved. |
| 4363 registry.setForInVariable(node, loopVariable); | 4376 registry.setForInVariable(node, loopVariable); |
| 4364 } | 4377 } |
| 4365 } | 4378 } |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4763 } | 4776 } |
| 4764 return const NoneResult(); | 4777 return const NoneResult(); |
| 4765 } | 4778 } |
| 4766 } | 4779 } |
| 4767 | 4780 |
| 4768 /// Looks up [name] in [scope] and unwraps the result. | 4781 /// Looks up [name] in [scope] and unwraps the result. |
| 4769 Element lookupInScope( | 4782 Element lookupInScope( |
| 4770 DiagnosticReporter reporter, Node node, Scope scope, String name) { | 4783 DiagnosticReporter reporter, Node node, Scope scope, String name) { |
| 4771 return Elements.unwrap(scope.lookup(name), reporter, node); | 4784 return Elements.unwrap(scope.lookup(name), reporter, node); |
| 4772 } | 4785 } |
| OLD | NEW |