Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(656)

Side by Side Diff: pkg/compiler/lib/src/resolution/members.dart

Issue 2644533002: Mostly use entities in use.dart (Closed)
Patch Set: Fixes Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698