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

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

Issue 1274073003: Refactor visitSendSet for super compounds and assignment. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | pkg/compiler/lib/src/types/type_mask.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 part of resolution; 5 part of resolution;
6 6
7 /// The state of constants in resolutions. 7 /// The state of constants in resolutions.
8 enum ConstantState { 8 enum ConstantState {
9 /// Expressions are not required to be constants. 9 /// Expressions are not required to be constants.
10 NON_CONSTANT, 10 NON_CONSTANT,
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 message: "Unexpected super target '$target'.")); 934 message: "Unexpected super target '$target'."));
935 return new StaticAccess.superMethod(target); 935 return new StaticAccess.superMethod(target);
936 } 936 }
937 } 937 }
938 938
939 /// Compute the [AccessSemantics] corresponding to a compound super access 939 /// Compute the [AccessSemantics] corresponding to a compound super access
940 /// reading from [getter] and writing to [setter]. 940 /// reading from [getter] and writing to [setter].
941 AccessSemantics computeCompoundSuperAccessSemantics( 941 AccessSemantics computeCompoundSuperAccessSemantics(
942 Spannable node, 942 Spannable node,
943 Element getter, 943 Element getter,
944 Element setter) { 944 Element setter,
945 {bool isIndex: false}) {
945 if (getter.isErroneous) { 946 if (getter.isErroneous) {
946 if (setter.isErroneous) { 947 if (setter.isErroneous) {
947 return new StaticAccess.unresolvedSuper(getter); 948 return new StaticAccess.unresolvedSuper(getter);
948 } else if (setter.isFunction) { 949 } else if (setter.isFunction) {
949 assert(invariant(node, setter.name == '[]=', 950 assert(invariant(node, setter.name == '[]=',
950 message: "Unexpected super setter '$setter'.")); 951 message: "Unexpected super setter '$setter'."));
951 return new CompoundAccessSemantics( 952 return new CompoundAccessSemantics(
952 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter); 953 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
953 } else { 954 } else {
954 assert(invariant(node, setter.isSetter, 955 assert(invariant(node, setter.isSetter,
955 message: "Unexpected super setter '$setter'.")); 956 message: "Unexpected super setter '$setter'."));
956 return new CompoundAccessSemantics( 957 return new CompoundAccessSemantics(
957 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter); 958 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
958 } 959 }
959 } else if (getter.isField) { 960 } else if (getter.isField) {
960 if (setter.isField) { 961 if (setter.isErroneous) {
962 assert(invariant(node, getter.isFinal,
963 message: "Unexpected super setter '$setter' for getter '$getter."));
964 return new StaticAccess.superFinalField(getter);
965 } else if (setter.isField) {
961 if (getter == setter) { 966 if (getter == setter) {
962 return new StaticAccess.superField(getter); 967 return new StaticAccess.superField(getter);
963 } else { 968 } else {
964 return new CompoundAccessSemantics( 969 return new CompoundAccessSemantics(
965 CompoundAccessKind.SUPER_FIELD_FIELD, getter, setter); 970 CompoundAccessKind.SUPER_FIELD_FIELD, getter, setter);
966 } 971 }
967 } else { 972 } else {
968 // Either the field is accessible directly, or a setter shadows the 973 // Either the field is accessible directly, or a setter shadows the
969 // setter access. If there was another instance member it would shadow 974 // setter access. If there was another instance member it would shadow
970 // the field. 975 // the field.
(...skipping 12 matching lines...) Expand all
983 } else { 988 } else {
984 assert(invariant(node, setter.isSetter, 989 assert(invariant(node, setter.isSetter,
985 message: "Unexpected super setter '$setter'.")); 990 message: "Unexpected super setter '$setter'."));
986 return new CompoundAccessSemantics( 991 return new CompoundAccessSemantics(
987 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter); 992 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter);
988 } 993 }
989 } else { 994 } else {
990 assert(invariant(node, getter.isFunction, 995 assert(invariant(node, getter.isFunction,
991 message: "Unexpected super getter '$getter'.")); 996 message: "Unexpected super getter '$getter'."));
992 if (setter.isErroneous) { 997 if (setter.isErroneous) {
993 return new CompoundAccessSemantics( 998 if (isIndex) {
994 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter); 999 return new CompoundAccessSemantics(
1000 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter);
1001 } else {
1002 return new StaticAccess.superMethod(getter);
1003 }
995 } else if (setter.isFunction) { 1004 } else if (setter.isFunction) {
1005 assert(invariant(node, setter.name == '[]=',
1006 message: "Unexpected super setter '$setter'."));
996 assert(invariant(node, getter.name == '[]', 1007 assert(invariant(node, getter.name == '[]',
997 message: "Unexpected super getter '$getter'.")); 1008 message: "Unexpected super getter '$getter'."));
998 assert(invariant(node, setter.name == '[]=',
999 message: "Unexpected super setter '$setter'."));
1000 return new CompoundAccessSemantics( 1009 return new CompoundAccessSemantics(
1001 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter); 1010 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter);
1002 } else { 1011 } else {
1003 assert(invariant(node, setter.isSetter, 1012 assert(invariant(node, setter.isSetter,
1004 message: "Unexpected super setter '$setter'.")); 1013 message: "Unexpected super setter '$setter'."));
1005 return new CompoundAccessSemantics( 1014 return new CompoundAccessSemantics(
1006 CompoundAccessKind.SUPER_METHOD_SETTER, getter, setter); 1015 CompoundAccessKind.SUPER_METHOD_SETTER, getter, setter);
1007 } 1016 }
1008 } 1017 }
1009 } 1018 }
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 Spannable node, 1109 Spannable node,
1101 Selector selector, 1110 Selector selector,
1102 {Name alternateName}) { 1111 {Name alternateName}) {
1103 1112
1104 Name name = selector.memberName; 1113 Name name = selector.memberName;
1105 // TODO(johnniwinther): Ensure correct behavior if currentClass is a 1114 // TODO(johnniwinther): Ensure correct behavior if currentClass is a
1106 // patch. 1115 // patch.
1107 Element target = currentClass.lookupSuperByName(name); 1116 Element target = currentClass.lookupSuperByName(name);
1108 // [target] may be null which means invoking noSuchMethod on super. 1117 // [target] may be null which means invoking noSuchMethod on super.
1109 if (target == null) { 1118 if (target == null) {
1110 Element error = reportAndCreateErroneousElement( 1119 if (alternateName != null) {
1120 target = currentClass.lookupSuperByName(alternateName);
1121 }
1122 Element error;
1123 if (selector.isSetter) {
1124 error = reportAndCreateErroneousElement(
1125 node, name.text, MessageKind.SETTER_NOT_FOUND_IN_SUPER,
1126 {'className': currentClass.name, 'name': name});
1127 } else {
1128 error = reportAndCreateErroneousElement(
1111 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER, 1129 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER,
1112 {'className': currentClass.name, 'memberName': name}); 1130 {'className': currentClass.name, 'memberName': name});
1113 if (alternateName != null) {
1114 target = currentClass.lookupSuperByName(alternateName);
1115 } 1131 }
1116 if (target == null) { 1132 if (target == null) {
1117 // If a setter wasn't resolved, use the [ErroneousElement]. 1133 // If a setter wasn't resolved, use the [ErroneousElement].
1118 target = error; 1134 target = error;
1119 } 1135 }
1120 // We still need to register the invocation, because we might 1136 // We still need to register the invocation, because we might
1121 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. 1137 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1122 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1138 registry.registerDynamicInvocation(new UniverseSelector(selector, null));
1123 registry.registerSuperNoSuchMethod(); 1139 registry.registerSuperNoSuchMethod();
1124 } 1140 }
(...skipping 11 matching lines...) Expand all
1136 /// 1152 ///
1137 /// class Super { 1153 /// class Super {
1138 /// set name(_) {} 1154 /// set name(_) {}
1139 /// } 1155 /// }
1140 /// class Sub extends Super { 1156 /// class Sub extends Super {
1141 /// foo => super.name; // Access to the setter. 1157 /// foo => super.name; // Access to the setter.
1142 /// } 1158 /// }
1143 /// 1159 ///
1144 AccessSemantics computeSuperAccessSemanticsForSelectors( 1160 AccessSemantics computeSuperAccessSemanticsForSelectors(
1145 Spannable node, 1161 Spannable node,
1146 Selector getterSelector, Selector setterSelector) { 1162 Selector getterSelector,
1163 Selector setterSelector,
1164 {bool isIndex: false}) {
1165 bool getterError = false;
1166 bool setterError = false;
1147 1167
1148 // TODO(johnniwinther): Ensure correct behavior if currentClass is a 1168 // TODO(johnniwinther): Ensure correct behavior if currentClass is a
1149 // patch. 1169 // patch.
1150 Element getter = currentClass.lookupSuperByName(getterSelector.memberName); 1170 Element getter = currentClass.lookupSuperByName(getterSelector.memberName);
1151 // [target] may be null which means invoking noSuchMethod on super. 1171 // [target] may be null which means invoking noSuchMethod on super.
1152 if (getter == null) { 1172 if (getter == null) {
1153 getter = reportAndCreateErroneousElement( 1173 getter = reportAndCreateErroneousElement(
1154 node, getterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER, 1174 node, getterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
1155 {'className': currentClass.name, 'memberName': getterSelector.name}); 1175 {'className': currentClass.name, 'memberName': getterSelector.name});
1156 // We still need to register the invocation, because we might 1176 getterError = true;
1157 // call `super.noSuchMethod` which calls [JSInvocationMirror._invokeOn].
1158 registry.registerDynamicInvocation(
1159 new UniverseSelector(getterSelector, null));
1160 registry.registerSuperNoSuchMethod();
1161 } 1177 }
1162 Element setter = currentClass.lookupSuperByName(setterSelector.memberName); 1178 Element setter = currentClass.lookupSuperByName(setterSelector.memberName);
1163 // [target] may be null which means invoking noSuchMethod on super. 1179 // [target] may be null which means invoking noSuchMethod on super.
1164 if (setter == null) { 1180 if (setter == null) {
1165 setter = reportAndCreateErroneousElement( 1181 setter = reportAndCreateErroneousElement(
1166 node, setterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER, 1182 node, setterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
1167 {'className': currentClass.name, 'memberName': setterSelector.name}); 1183 {'className': currentClass.name, 'memberName': setterSelector.name});
1184 setterError = true;
1185 } else if (getter == setter) {
1186 if (setter.isFunction) {
1187 setter = reportAndCreateErroneousElement(
1188 node, setterSelector.name,
1189 MessageKind.ASSIGNING_METHOD_IN_SUPER,
1190 {'superclassName': setter.enclosingClass.name,
1191 'name': setterSelector.name});
1192 setterError = true;
1193 } else if (setter.isField && setter.isFinal) {
1194 setter = reportAndCreateErroneousElement(
1195 node, setterSelector.name,
1196 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
1197 {'superclassName': setter.enclosingClass.name,
1198 'name': setterSelector.name});
1199 setterError = true;
1200 }
1201 }
1202 if (getterError) {
1168 // We still need to register the invocation, because we might 1203 // We still need to register the invocation, because we might
1169 // call `super.noSuchMethod` which calls [JSInvocationMirror._invokeOn]. 1204 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1205 registry.registerDynamicInvocation(
1206 new UniverseSelector(getterSelector, null));
1207 }
1208 if (setterError) {
1209 // We still need to register the invocation, because we might
1210 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1170 registry.registerDynamicInvocation( 1211 registry.registerDynamicInvocation(
1171 new UniverseSelector(setterSelector, null)); 1212 new UniverseSelector(setterSelector, null));
1213 }
1214 if (getterError || setterError) {
1172 registry.registerSuperNoSuchMethod(); 1215 registry.registerSuperNoSuchMethod();
1173 } 1216 }
1174 return computeCompoundSuperAccessSemantics(node, getter, setter); 1217 return computeCompoundSuperAccessSemantics(
1218 node, getter, setter, isIndex: isIndex);
1175 } 1219 }
1176 1220
1177 /// Resolve [node] as a subexpression that is _not_ the prefix of a member 1221 /// Resolve [node] as a subexpression that is _not_ the prefix of a member
1178 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`. 1222 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`.
1179 ResolutionResult visitExpression(Node node) { 1223 ResolutionResult visitExpression(Node node) {
1180 bool oldSendIsMemberAccess = sendIsMemberAccess; 1224 bool oldSendIsMemberAccess = sendIsMemberAccess;
1181 sendIsMemberAccess = false; 1225 sendIsMemberAccess = false;
1182 ResolutionResult result = visit(node); 1226 ResolutionResult result = visit(node);
1183 sendIsMemberAccess = oldSendIsMemberAccess; 1227 sendIsMemberAccess = oldSendIsMemberAccess;
1184 return result; 1228 return result;
(...skipping 1591 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 new Selector.binaryOperator(operator.selectorName); 2820 new Selector.binaryOperator(operator.selectorName);
2777 2821
2778 // TODO(johnniwinther): Remove these when selectors are only accessed 2822 // TODO(johnniwinther): Remove these when selectors are only accessed
2779 // through the send structure. 2823 // through the send structure.
2780 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 2824 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
2781 registry.setSelector(node, setterSelector); 2825 registry.setSelector(node, setterSelector);
2782 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 2826 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
2783 2827
2784 if (semantics == null) { 2828 if (semantics == null) {
2785 semantics = computeSuperAccessSemanticsForSelectors( 2829 semantics = computeSuperAccessSemanticsForSelectors(
2786 node, getterSelector, setterSelector); 2830 node, getterSelector, setterSelector, isIndex: true);
2787 2831
2788 registry.registerStaticInvocation(semantics.getter); 2832 registry.registerStaticInvocation(semantics.getter);
2789 registry.registerStaticInvocation(semantics.setter); 2833 registry.registerStaticInvocation(semantics.setter);
2790 2834
2791 // TODO(johnniwinther): Remove these when elements are only accessed 2835 // TODO(johnniwinther): Remove these when elements are only accessed
2792 // through the send structure. 2836 // through the send structure.
2793 registry.useElement(node, semantics.setter); 2837 registry.useElement(node, semantics.setter);
2794 registry.useElement(node.selector, semantics.getter); 2838 registry.useElement(node.selector, semantics.getter);
2795 } 2839 }
2796 registry.registerDynamicInvocation( 2840 registry.registerDynamicInvocation(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2830 registry.registerSendStructure(node, sendStructure); 2874 registry.registerSendStructure(node, sendStructure);
2831 return const NoneResult(); 2875 return const NoneResult();
2832 } else { 2876 } else {
2833 // `super[a] += b`. 2877 // `super[a] += b`.
2834 Selector getterSelector = new Selector.index(); 2878 Selector getterSelector = new Selector.index();
2835 Selector setterSelector = new Selector.indexSet(); 2879 Selector setterSelector = new Selector.indexSet();
2836 Selector operatorSelector = 2880 Selector operatorSelector =
2837 new Selector.binaryOperator(operator.selectorName); 2881 new Selector.binaryOperator(operator.selectorName);
2838 if (semantics == null) { 2882 if (semantics == null) {
2839 semantics = computeSuperAccessSemanticsForSelectors( 2883 semantics = computeSuperAccessSemanticsForSelectors(
2840 node, getterSelector, setterSelector); 2884 node, getterSelector, setterSelector, isIndex: true);
2841 2885
2842 registry.registerStaticInvocation(semantics.getter); 2886 registry.registerStaticInvocation(semantics.getter);
2843 registry.registerStaticInvocation(semantics.setter); 2887 registry.registerStaticInvocation(semantics.setter);
2844 2888
2845 // TODO(johnniwinther): Remove these when elements are only accessed 2889 // TODO(johnniwinther): Remove these when elements are only accessed
2846 // through the send structure. 2890 // through the send structure.
2847 registry.useElement(node, semantics.setter); 2891 registry.useElement(node, semantics.setter);
2848 registry.useElement(node.selector, semantics.getter); 2892 registry.useElement(node.selector, semantics.getter);
2849 } 2893 }
2850 2894
2851 // TODO(johnniwinther): Remove these when selectors are only accessed 2895 // TODO(johnniwinther): Remove these when selectors are only accessed
2852 // through the send structure. 2896 // through the send structure.
2853 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 2897 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
2854 registry.setSelector(node, setterSelector); 2898 registry.setSelector(node, setterSelector);
2855 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 2899 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
2856 2900
2857 registry.registerDynamicInvocation( 2901 registry.registerDynamicInvocation(
2858 new UniverseSelector(operatorSelector, null)); 2902 new UniverseSelector(operatorSelector, null));
2859 2903
2860 SendStructure sendStructure = new CompoundIndexSetStructure( 2904 SendStructure sendStructure = new CompoundIndexSetStructure(
2861 semantics, operator, getterSelector, setterSelector); 2905 semantics, operator, getterSelector, setterSelector);
2862 registry.registerSendStructure(node, sendStructure); 2906 registry.registerSendStructure(node, sendStructure);
2863 return const NoneResult(); 2907 return const NoneResult();
2864 } 2908 }
2865 } 2909 }
2866 } 2910 }
2867 2911
2912 /// Handle super index operations like `super.a = b`, `super.a += b`, and
2913 /// `super.a++`.
2914 // TODO(johnniwinther): Share code with [handleSuperIndexSendSet].
2915 ResolutionResult handleSuperSendSet(SendSet node) {
2916 Identifier selector = node.selector.asIdentifier();
2917 String text = selector.source;
2918 Name name = new Name(text, enclosingElement.library);
2919 String operatorText = node.assignmentOperator.source;
2920 AccessSemantics semantics = checkSuperAccess(node);
2921 if (node.isPrefix || node.isPostfix) {
2922 // `super.a++` or `++super.a`.
2923 IncDecOperator operator = IncDecOperator.parse(operatorText);
2924 Selector getterSelector =
2925 new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS);
2926 Selector setterSelector =
2927 new Selector(SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG);
2928 Selector operatorSelector =
2929 new Selector.binaryOperator(operator.selectorName);
2930
2931 // TODO(johnniwinther): Remove these when selectors are only accessed
2932 // through the send structure.
2933 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
2934 registry.setSelector(node, setterSelector);
2935 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
2936
2937 if (semantics == null) {
2938 semantics = computeSuperAccessSemanticsForSelectors(
2939 node, getterSelector, setterSelector);
2940
2941 registry.registerStaticInvocation(semantics.getter);
2942 registry.registerStaticInvocation(semantics.setter);
2943
2944 // TODO(johnniwinther): Remove these when elements are only accessed
2945 // through the send structure.
2946 registry.useElement(node, semantics.setter);
2947 registry.useElement(node.selector, semantics.getter);
2948 }
2949 registry.registerDynamicInvocation(
2950 new UniverseSelector(operatorSelector, null));
2951
2952 SendStructure sendStructure = node.isPrefix
2953 ? new PrefixStructure(
2954 semantics, operator, getterSelector, setterSelector)
2955 : new PostfixStructure(
2956 semantics, operator, getterSelector, setterSelector);
2957 registry.registerSendStructure(node, sendStructure);
2958 return const NoneResult();
2959 } else {
2960 Node rhs = node.arguments.head;
2961 visitExpression(rhs);
2962
2963 AssignmentOperator operator = AssignmentOperator.parse(operatorText);
2964 if (operator.kind == AssignmentOperatorKind.ASSIGN) {
2965 // `super.a = b`.
2966 Selector setterSelector = new Selector(
2967 SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG);
2968 if (semantics == null) {
2969 semantics =
2970 computeSuperAccessSemanticsForSelector(
2971 node, setterSelector, alternateName: name);
2972 switch (semantics.kind) {
2973 case AccessKind.SUPER_FINAL_FIELD:
2974 compiler.reportWarning(
2975 node,
2976 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
2977 {'name': name,
2978 'superclassName': semantics.setter.enclosingClass.name});
2979 registry.registerDynamicInvocation(
2980 new UniverseSelector(setterSelector, null));
2981 registry.registerSuperNoSuchMethod();
2982 break;
2983 case AccessKind.SUPER_METHOD:
2984 compiler.reportWarning(
2985 node, MessageKind.ASSIGNING_METHOD_IN_SUPER,
2986 {'name': name,
2987 'superclassName': semantics.setter.enclosingClass.name});
2988 registry.registerDynamicInvocation(
2989 new UniverseSelector(setterSelector, null));
2990 registry.registerSuperNoSuchMethod();
2991 break;
2992 default:
2993 registry.registerStaticInvocation(semantics.setter);
2994 break;
2995 }
2996
2997 // TODO(johnniwinther): Remove these when elements are only accessed
karlklose 2015/08/06 11:27:17 Consider filing a bug for refactoring TODOs like t
Johnni Winther 2015/08/06 12:26:52 Done.
2998 // through the send structure.
2999 registry.useElement(node, semantics.setter);
3000 }
3001
3002 // TODO(johnniwinther): Remove this when selectors are only accessed
3003 // through the send structure.
3004 registry.setSelector(node, setterSelector);
3005
3006 SendStructure sendStructure =
3007 new SetStructure(semantics, setterSelector);
3008 registry.registerSendStructure(node, sendStructure);
3009 return const NoneResult();
3010 } else {
3011 // `super.a += b`.
3012 Selector getterSelector = new Selector(
3013 SelectorKind.GETTER, name, CallStructure.NO_ARGS);
3014 Selector setterSelector = new Selector(
3015 SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG);
3016 Selector operatorSelector =
3017 new Selector.binaryOperator(operator.selectorName);
3018 if (semantics == null) {
3019 semantics = computeSuperAccessSemanticsForSelectors(
3020 node, getterSelector, setterSelector);
3021
3022 registry.registerStaticInvocation(semantics.getter);
3023 registry.registerStaticInvocation(semantics.setter);
3024
3025 // TODO(johnniwinther): Remove these when elements are only accessed
3026 // through the send structure.
3027 registry.useElement(node, semantics.setter);
3028 registry.useElement(node.selector, semantics.getter);
3029 }
3030
3031 // TODO(johnniwinther): Remove these when selectors are only accessed
3032 // through the send structure.
3033 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3034 registry.setSelector(node, setterSelector);
3035 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3036
3037 registry.registerDynamicInvocation(
3038 new UniverseSelector(operatorSelector, null));
3039
3040 SendStructure sendStructure = new CompoundStructure(
3041 semantics, operator, getterSelector, setterSelector);
3042 registry.registerSendStructure(node, sendStructure);
3043 return const NoneResult();
3044 }
3045 }
3046 }
3047
2868 ResolutionResult visitSendSet(SendSet node) { 3048 ResolutionResult visitSendSet(SendSet node) {
2869 if (node.isIndex) { 3049 if (node.isIndex) {
2870 if (node.isSuperCall) { 3050 if (node.isSuperCall) {
2871 return handleSuperIndexSendSet(node); 3051 return handleSuperIndexSendSet(node);
2872 } else { 3052 } else {
2873 return handleIndexSendSet(node); 3053 return handleIndexSendSet(node);
2874 } 3054 }
3055 } else if (node.isSuperCall) {
3056 return handleSuperSendSet(node);
2875 } 3057 }
2876 return oldVisitSendSet(node); 3058 return oldVisitSendSet(node);
2877 } 3059 }
2878 3060
2879 ResolutionResult oldVisitSendSet(SendSet node) { 3061 ResolutionResult oldVisitSendSet(SendSet node) {
2880 bool oldSendIsMemberAccess = sendIsMemberAccess; 3062 bool oldSendIsMemberAccess = sendIsMemberAccess;
2881 sendIsMemberAccess = node.isPropertyAccess || node.isCall; 3063 sendIsMemberAccess = node.isPropertyAccess || node.isCall;
2882 ResolutionResult result = resolveSend(node); 3064 ResolutionResult result = resolveSend(node);
2883 sendIsMemberAccess = oldSendIsMemberAccess; 3065 sendIsMemberAccess = oldSendIsMemberAccess;
2884 Element target = result.element; 3066 Element target = result.element;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2935 } else if (target.isFunction && target.name != '[]=') { 3117 } else if (target.isFunction && target.name != '[]=') {
2936 assert(!target.isSetter); 3118 assert(!target.isSetter);
2937 if (Elements.isStaticOrTopLevelFunction(target) || target.isLocal) { 3119 if (Elements.isStaticOrTopLevelFunction(target) || target.isLocal) {
2938 setter = reportAndCreateErroneousElement( 3120 setter = reportAndCreateErroneousElement(
2939 node.selector, target.name, MessageKind.ASSIGNING_METHOD, 3121 node.selector, target.name, MessageKind.ASSIGNING_METHOD,
2940 const {}); 3122 const {});
2941 } else if (node.isSuperCall) { 3123 } else if (node.isSuperCall) {
2942 setter = reportAndCreateErroneousElement( 3124 setter = reportAndCreateErroneousElement(
2943 node.selector, target.name, MessageKind.ASSIGNING_METHOD_IN_SUPER, 3125 node.selector, target.name, MessageKind.ASSIGNING_METHOD_IN_SUPER,
2944 {'name': target.name, 3126 {'name': target.name,
2945 'superclassName': target.enclosingElement.name}); 3127 'superclassName': target.enclosingClass.name});
2946 registry.registerSuperNoSuchMethod(); 3128 registry.registerSuperNoSuchMethod();
2947 } else { 3129 } else {
2948 // For instance methods we don't report a warning here because the 3130 // For instance methods we don't report a warning here because the
2949 // type checker will detect this as well and report a better error 3131 // type checker will detect this as well and report a better error
2950 // message with the context of the containing class. 3132 // message with the context of the containing class.
2951 } 3133 }
2952 registry.registerThrowNoSuchMethod(); 3134 registry.registerThrowNoSuchMethod();
2953 } 3135 }
2954 if (isPotentiallyMutableTarget(target)) { 3136 if (isPotentiallyMutableTarget(target)) {
2955 registry.registerPotentialMutation(target, node); 3137 registry.registerPotentialMutation(target, node);
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
4161 } 4343 }
4162 return const NoneResult(); 4344 return const NoneResult();
4163 } 4345 }
4164 } 4346 }
4165 4347
4166 /// Looks up [name] in [scope] and unwraps the result. 4348 /// Looks up [name] in [scope] and unwraps the result.
4167 Element lookupInScope(Compiler compiler, Node node, 4349 Element lookupInScope(Compiler compiler, Node node,
4168 Scope scope, String name) { 4350 Scope scope, String name) {
4169 return Elements.unwrap(scope.lookup(name), compiler, node); 4351 return Elements.unwrap(scope.lookup(name), compiler, node);
4170 } 4352 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/backend.dart ('k') | pkg/compiler/lib/src/types/type_mask.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698