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

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: Use bug number for TODOs 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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 registry.registerSendStructure(node, const InvalidUnaryStructure()); 1313 registry.registerSendStructure(node, const InvalidUnaryStructure());
1270 return const NoneResult(); 1314 return const NoneResult();
1271 } 1315 }
1272 1316
1273 /// Handle the unary expression of a user definable unary [operator], like 1317 /// Handle the unary expression of a user definable unary [operator], like
1274 /// `-a`, and `-super`. 1318 /// `-a`, and `-super`.
1275 ResolutionResult handleUserDefinableUnary(Send node, UnaryOperator operator) { 1319 ResolutionResult handleUserDefinableUnary(Send node, UnaryOperator operator) {
1276 ResolutionResult result = const NoneResult(); 1320 ResolutionResult result = const NoneResult();
1277 Node expression = node.receiver; 1321 Node expression = node.receiver;
1278 Selector selector = operator.selector; 1322 Selector selector = operator.selector;
1279 // TODO(johnniwinther): Remove this when all information goes through the 1323 // TODO(23998): Remove this when all information goes through the
1280 // [SendStructure]. 1324 // [SendStructure].
1281 registry.setSelector(node, selector); 1325 registry.setSelector(node, selector);
1282 1326
1283 AccessSemantics semantics; 1327 AccessSemantics semantics;
1284 if (node.isSuperCall) { 1328 if (node.isSuperCall) {
1285 semantics = checkSuperAccess(node); 1329 semantics = checkSuperAccess(node);
1286 if (semantics == null) { 1330 if (semantics == null) {
1287 semantics = computeSuperAccessSemanticsForSelector(node, selector); 1331 semantics = computeSuperAccessSemanticsForSelector(node, selector);
1288 // TODO(johnniwinther): Add information to [AccessSemantics] about 1332 // TODO(johnniwinther): Add information to [AccessSemantics] about
1289 // whether it is erroneous. 1333 // whether it is erroneous.
1290 if (semantics.kind == AccessKind.SUPER_METHOD) { 1334 if (semantics.kind == AccessKind.SUPER_METHOD) {
1291 registry.registerStaticUse(semantics.element.declaration); 1335 registry.registerStaticUse(semantics.element.declaration);
1292 } 1336 }
1293 // TODO(johnniwinther): Remove this when all information goes through 1337 // TODO(23998): Remove this when all information goes through
1294 // the [SendStructure]. 1338 // the [SendStructure].
1295 registry.useElement(node, semantics.element); 1339 registry.useElement(node, semantics.element);
1296 } 1340 }
1297 } else { 1341 } else {
1298 ResolutionResult expressionResult = visitExpression(expression); 1342 ResolutionResult expressionResult = visitExpression(expression);
1299 semantics = new DynamicAccess.dynamicProperty(expression); 1343 semantics = new DynamicAccess.dynamicProperty(expression);
1300 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1344 registry.registerDynamicInvocation(new UniverseSelector(selector, null));
1301 1345
1302 if (expressionResult.isConstant) { 1346 if (expressionResult.isConstant) {
1303 bool isValidConstant; 1347 bool isValidConstant;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 ResolutionResult result = const NoneResult(); 1487 ResolutionResult result = const NoneResult();
1444 Node left = node.receiver; 1488 Node left = node.receiver;
1445 Node right = node.arguments.head; 1489 Node right = node.arguments.head;
1446 AccessSemantics semantics; 1490 AccessSemantics semantics;
1447 Selector selector; 1491 Selector selector;
1448 if (operator.kind == BinaryOperatorKind.INDEX) { 1492 if (operator.kind == BinaryOperatorKind.INDEX) {
1449 selector = new Selector.index(); 1493 selector = new Selector.index();
1450 } else { 1494 } else {
1451 selector = new Selector.binaryOperator(operator.selectorName); 1495 selector = new Selector.binaryOperator(operator.selectorName);
1452 } 1496 }
1453 // TODO(johnniwinther): Remove this when all information goes through the 1497 // TODO(23998): Remove this when all information goes through the
1454 // [SendStructure]. 1498 // [SendStructure].
1455 registry.setSelector(node, selector); 1499 registry.setSelector(node, selector);
1456 1500
1457 if (node.isSuperCall) { 1501 if (node.isSuperCall) {
1458 semantics = checkSuperAccess(node); 1502 semantics = checkSuperAccess(node);
1459 if (semantics == null) { 1503 if (semantics == null) {
1460 semantics = computeSuperAccessSemanticsForSelector(node, selector); 1504 semantics = computeSuperAccessSemanticsForSelector(node, selector);
1461 // TODO(johnniwinther): Add information to [AccessSemantics] about 1505 // TODO(johnniwinther): Add information to [AccessSemantics] about
1462 // whether it is erroneous. 1506 // whether it is erroneous.
1463 if (semantics.kind == AccessKind.SUPER_METHOD) { 1507 if (semantics.kind == AccessKind.SUPER_METHOD) {
1464 registry.registerStaticUse(semantics.element.declaration); 1508 registry.registerStaticUse(semantics.element.declaration);
1465 } 1509 }
1466 // TODO(johnniwinther): Remove this when all information goes through 1510 // TODO(23998): Remove this when all information goes through
1467 // the [SendStructure]. 1511 // the [SendStructure].
1468 registry.useElement(node, semantics.element); 1512 registry.useElement(node, semantics.element);
1469 } 1513 }
1470 visitExpression(right); 1514 visitExpression(right);
1471 } else { 1515 } else {
1472 ResolutionResult leftResult = visitExpression(left); 1516 ResolutionResult leftResult = visitExpression(left);
1473 ResolutionResult rightResult = visitExpression(right); 1517 ResolutionResult rightResult = visitExpression(right);
1474 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1518 registry.registerDynamicInvocation(new UniverseSelector(selector, null));
1475 semantics = new DynamicAccess.dynamicProperty(left); 1519 semantics = new DynamicAccess.dynamicProperty(left);
1476 1520
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1594 1638
1595 /// Handle an invocation of an expression, like `(){}()` or `(foo)()`. 1639 /// Handle an invocation of an expression, like `(){}()` or `(foo)()`.
1596 ResolutionResult handleExpressionInvoke(Send node) { 1640 ResolutionResult handleExpressionInvoke(Send node) {
1597 assert(invariant(node, node.isCall, 1641 assert(invariant(node, node.isCall,
1598 message: "Unexpected expression: $node")); 1642 message: "Unexpected expression: $node"));
1599 Node expression = node.selector; 1643 Node expression = node.selector;
1600 visitExpression(expression); 1644 visitExpression(expression);
1601 CallStructure callStructure = 1645 CallStructure callStructure =
1602 resolveArguments(node.argumentsNode).callStructure; 1646 resolveArguments(node.argumentsNode).callStructure;
1603 Selector selector = callStructure.callSelector; 1647 Selector selector = callStructure.callSelector;
1604 // TODO(johnniwinther): Remove this when all information goes through the 1648 // TODO(23998): Remove this when all information goes through the
1605 // [SendStructure]. 1649 // [SendStructure].
1606 registry.setSelector(node, selector); 1650 registry.setSelector(node, selector);
1607 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1651 registry.registerDynamicInvocation(new UniverseSelector(selector, null));
1608 registry.registerSendStructure(node, 1652 registry.registerSendStructure(node,
1609 new InvokeStructure(new AccessSemantics.expression(), selector)); 1653 new InvokeStructure(new AccessSemantics.expression(), selector));
1610 return const NoneResult(); 1654 return const NoneResult();
1611 } 1655 }
1612 1656
1613 /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`. 1657 /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`.
1614 ResolutionResult handleAssert(Send node) { 1658 ResolutionResult handleAssert(Send node) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 resolveArguments(node.argumentsNode).callStructure; 1698 resolveArguments(node.argumentsNode).callStructure;
1655 Selector selector = callStructure.callSelector; 1699 Selector selector = callStructure.callSelector;
1656 // TODO(johnniwinther): Handle invalid this access as an 1700 // TODO(johnniwinther): Handle invalid this access as an
1657 // [AccessSemantics]. 1701 // [AccessSemantics].
1658 if (checkThisAccess(node)) { 1702 if (checkThisAccess(node)) {
1659 registry.registerDynamicInvocation( 1703 registry.registerDynamicInvocation(
1660 new UniverseSelector(selector, null)); 1704 new UniverseSelector(selector, null));
1661 registry.registerSendStructure(node, 1705 registry.registerSendStructure(node,
1662 new InvokeStructure(accessSemantics, selector)); 1706 new InvokeStructure(accessSemantics, selector));
1663 } 1707 }
1664 // TODO(johnniwinther): Remove this when all information goes through 1708 // TODO(23998): Remove this when all information goes through
1665 // the [SendStructure]. 1709 // the [SendStructure].
1666 registry.setSelector(node, selector); 1710 registry.setSelector(node, selector);
1667 } else { 1711 } else {
1668 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node. 1712 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node.
1669 internalError(node, "Unexpected node '$node'."); 1713 internalError(node, "Unexpected node '$node'.");
1670 } 1714 }
1671 return const NoneResult(); 1715 return const NoneResult();
1672 } 1716 }
1673 1717
1674 /// Handle access of a super property, like `super.foo` and `super.foo()`. 1718 /// Handle access of a super property, like `super.foo` and `super.foo()`.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1749 break; 1793 break;
1750 default: 1794 default:
1751 internalError(node, "Unexpected super property access $semantics."); 1795 internalError(node, "Unexpected super property access $semantics.");
1752 break; 1796 break;
1753 } 1797 }
1754 registry.registerSendStructure(node, 1798 registry.registerSendStructure(node,
1755 new GetStructure(semantics, selector)); 1799 new GetStructure(semantics, selector));
1756 } 1800 }
1757 target = semantics.element; 1801 target = semantics.element;
1758 1802
1759 // TODO(johnniwinther): Remove these when all information goes through 1803 // TODO(23998): Remove these when all information goes through
1760 // the [SendStructure]. 1804 // the [SendStructure].
1761 registry.useElement(node, target); 1805 registry.useElement(node, target);
1762 registry.setSelector(node, selector); 1806 registry.setSelector(node, selector);
1763 return const NoneResult(); 1807 return const NoneResult();
1764 } 1808 }
1765 1809
1766 /// Handle a [Send] whose selector is an [Operator], like `a && b`, `a is T`, 1810 /// Handle a [Send] whose selector is an [Operator], like `a && b`, `a is T`,
1767 /// `a + b`, and `~a`. 1811 /// `a + b`, and `~a`.
1768 ResolutionResult handleOperatorSend(Send node) { 1812 ResolutionResult handleOperatorSend(Send node) {
1769 String operatorText = node.selector.asOperator().source; 1813 String operatorText = node.selector.asOperator().source;
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1942 1986
1943 AccessSemantics semantics = 1987 AccessSemantics semantics =
1944 new StaticAccess.typeParameterTypeLiteral(element); 1988 new StaticAccess.typeParameterTypeLiteral(element);
1945 registry.useElement(node, element); 1989 registry.useElement(node, element);
1946 registry.registerTypeLiteral(node, element.type); 1990 registry.registerTypeLiteral(node, element.type);
1947 1991
1948 if (node.isCall) { 1992 if (node.isCall) {
1949 CallStructure callStructure = 1993 CallStructure callStructure =
1950 resolveArguments(node.argumentsNode).callStructure; 1994 resolveArguments(node.argumentsNode).callStructure;
1951 Selector selector = callStructure.callSelector; 1995 Selector selector = callStructure.callSelector;
1952 // TODO(johnniwinther): Remove this when all information goes through 1996 // TODO(23998): Remove this when all information goes through
1953 // the [SendStructure]. 1997 // the [SendStructure].
1954 registry.setSelector(node, selector); 1998 registry.setSelector(node, selector);
1955 1999
1956 registry.registerSendStructure(node, 2000 registry.registerSendStructure(node,
1957 new InvokeStructure(semantics, selector)); 2001 new InvokeStructure(semantics, selector));
1958 } else { 2002 } else {
1959 // TODO(johnniwinther): Avoid the need for a [Selector] here. 2003 // TODO(johnniwinther): Avoid the need for a [Selector] here.
1960 registry.registerSendStructure(node, 2004 registry.registerSendStructure(node,
1961 new GetStructure(semantics, 2005 new GetStructure(semantics,
1962 new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS))); 2006 new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS)));
(...skipping 12 matching lines...) Expand all
1975 TypeDeclarationElement element, 2019 TypeDeclarationElement element,
1976 DartType type, 2020 DartType type,
1977 ConstantAccess semantics) { 2021 ConstantAccess semantics) {
1978 registry.useElement(node, element); 2022 registry.useElement(node, element);
1979 registry.registerTypeLiteral(node, type); 2023 registry.registerTypeLiteral(node, type);
1980 2024
1981 if (node.isCall) { 2025 if (node.isCall) {
1982 CallStructure callStructure = 2026 CallStructure callStructure =
1983 resolveArguments(node.argumentsNode).callStructure; 2027 resolveArguments(node.argumentsNode).callStructure;
1984 Selector selector = callStructure.callSelector; 2028 Selector selector = callStructure.callSelector;
1985 // TODO(johnniwinther): Remove this when all information goes through 2029 // TODO(23998): Remove this when all information goes through
1986 // the [SendStructure]. 2030 // the [SendStructure].
1987 registry.setSelector(node, selector); 2031 registry.setSelector(node, selector);
1988 2032
1989 // The node itself is not a constant but we register the selector (the 2033 // The node itself is not a constant but we register the selector (the
1990 // identifier that refers to the class/typedef) as a constant. 2034 // identifier that refers to the class/typedef) as a constant.
1991 registry.useElement(node.selector, element); 2035 registry.useElement(node.selector, element);
1992 analyzeConstantDeferred(node.selector, enforceConst: false); 2036 analyzeConstantDeferred(node.selector, enforceConst: false);
1993 2037
1994 registry.registerSendStructure(node, 2038 registry.registerSendStructure(node,
1995 new InvokeStructure(semantics, selector)); 2039 new InvokeStructure(semantics, selector));
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2120 ErroneousElement error = reportAndCreateErroneousElement( 2164 ErroneousElement error = reportAndCreateErroneousElement(
2121 node, 2165 node,
2122 name.text, 2166 name.text,
2123 MessageKind.PREFIX_AS_EXPRESSION, 2167 MessageKind.PREFIX_AS_EXPRESSION,
2124 {'prefix': name}, 2168 {'prefix': name},
2125 isError: true); 2169 isError: true);
2126 return handleErroneousAccess( 2170 return handleErroneousAccess(
2127 node, name, error, new StaticAccess.invalid(error)); 2171 node, name, error, new StaticAccess.invalid(error));
2128 } 2172 }
2129 if (prefix.isDeferred) { 2173 if (prefix.isDeferred) {
2130 // TODO(johnniwinther): Remove this when deferred access is detected 2174 // TODO(23998): Remove this when deferred access is detected
2131 // through a [SendStructure]. 2175 // through a [SendStructure].
2132 registry.useElement(node.selector, prefix); 2176 registry.useElement(node.selector, prefix);
2133 } 2177 }
2134 registry.useElement(node, prefix); 2178 registry.useElement(node, prefix);
2135 return new PrefixResult(prefix, null); 2179 return new PrefixResult(prefix, null);
2136 } 2180 }
2137 2181
2138 /// Handle qualified [Send] where the receiver resolves to an [Element], like 2182 /// Handle qualified [Send] where the receiver resolves to an [Element], like
2139 /// `a.b` where `a` is a prefix or a class. 2183 /// `a.b` where `a` is a prefix or a class.
2140 ResolutionResult handlePrefixSend( 2184 ResolutionResult handlePrefixSend(
(...skipping 25 matching lines...) Expand all
2166 sendStructure = new InvokeStructure(semantics, selector); 2210 sendStructure = new InvokeStructure(semantics, selector);
2167 } else { 2211 } else {
2168 assert(invariant(node, node.isPropertyAccess)); 2212 assert(invariant(node, node.isPropertyAccess));
2169 selector = new Selector( 2213 selector = new Selector(
2170 SelectorKind.GETTER, name, CallStructure.NO_ARGS); 2214 SelectorKind.GETTER, name, CallStructure.NO_ARGS);
2171 registry.registerDynamicGetter( 2215 registry.registerDynamicGetter(
2172 new UniverseSelector(selector, null)); 2216 new UniverseSelector(selector, null));
2173 sendStructure = new GetStructure(semantics, selector); 2217 sendStructure = new GetStructure(semantics, selector);
2174 } 2218 }
2175 registry.registerSendStructure(node, sendStructure); 2219 registry.registerSendStructure(node, sendStructure);
2176 // TODO(johnniwinther): Remove this when all information goes through 2220 // TODO(23998): Remove this when all information goes through
2177 // the [SendStructure]. 2221 // the [SendStructure].
2178 registry.setSelector(node, selector); 2222 registry.setSelector(node, selector);
2179 return const NoneResult(); 2223 return const NoneResult();
2180 } 2224 }
2181 2225
2182 /// Handle dynamic property access, like `a.b` or `a.b()` where `a` is not a 2226 /// Handle dynamic property access, like `a.b` or `a.b()` where `a` is not a
2183 /// prefix or class. 2227 /// prefix or class.
2184 ResolutionResult handleDynamicPropertyAccess(Send node, Name name) { 2228 ResolutionResult handleDynamicPropertyAccess(Send node, Name name) {
2185 AccessSemantics semantics = 2229 AccessSemantics semantics =
2186 new DynamicAccess.dynamicProperty(node.receiver); 2230 new DynamicAccess.dynamicProperty(node.receiver);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2258 new UniverseSelector(selector, null)); 2302 new UniverseSelector(selector, null));
2259 sendStructure = new InvokeStructure(accessSemantics, selector); 2303 sendStructure = new InvokeStructure(accessSemantics, selector);
2260 } else { 2304 } else {
2261 assert(invariant(node, node.isPropertyAccess)); 2305 assert(invariant(node, node.isPropertyAccess));
2262 selector = new Selector( 2306 selector = new Selector(
2263 SelectorKind.GETTER, name, CallStructure.NO_ARGS); 2307 SelectorKind.GETTER, name, CallStructure.NO_ARGS);
2264 registry.registerDynamicGetter( 2308 registry.registerDynamicGetter(
2265 new UniverseSelector(selector, null)); 2309 new UniverseSelector(selector, null));
2266 sendStructure = new GetStructure(accessSemantics, selector); 2310 sendStructure = new GetStructure(accessSemantics, selector);
2267 } 2311 }
2268 // TODO(johnniwinther): Remove this when all information goes through 2312 // TODO(23998): Remove this when all information goes through
2269 // the [SendStructure]. 2313 // the [SendStructure].
2270 registry.setSelector(node, selector); 2314 registry.setSelector(node, selector);
2271 registry.useElement(node, element); 2315 registry.useElement(node, element);
2272 registry.registerSendStructure(node, sendStructure); 2316 registry.registerSendStructure(node, sendStructure);
2273 return const NoneResult(); 2317 return const NoneResult();
2274 } 2318 }
2275 2319
2276 /// Handle access to an ambiguous element, that is, a name imported twice. 2320 /// Handle access to an ambiguous element, that is, a name imported twice.
2277 ResolutionResult handleAmbiguousSend( 2321 ResolutionResult handleAmbiguousSend(
2278 Send node, 2322 Send node,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2387 default: 2431 default:
2388 internalError(node, 2432 internalError(node,
2389 "Unexpected local access $semantics."); 2433 "Unexpected local access $semantics.");
2390 break; 2434 break;
2391 } 2435 }
2392 selector = new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS); 2436 selector = new Selector(SelectorKind.GETTER, name, CallStructure.NO_ARGS);
2393 registry.registerSendStructure(node, 2437 registry.registerSendStructure(node,
2394 new GetStructure(semantics, selector)); 2438 new GetStructure(semantics, selector));
2395 } 2439 }
2396 2440
2397 // TODO(johnniwinther): Remove these when all information goes through 2441 // TODO(23998): Remove these when all information goes through
2398 // the [SendStructure]. 2442 // the [SendStructure].
2399 registry.useElement(node, element); 2443 registry.useElement(node, element);
2400 registry.setSelector(node, selector); 2444 registry.setSelector(node, selector);
2401 2445
2402 registerPotentialAccessInClosure(node, element); 2446 registerPotentialAccessInClosure(node, element);
2403 2447
2404 return result; 2448 return result;
2405 } 2449 }
2406 2450
2407 /// Handle access of a static or top level [element]. 2451 /// Handle access of a static or top level [element].
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2527 new GetStructure(semantics, selector)); 2571 new GetStructure(semantics, selector));
2528 if (member.isConst) { 2572 if (member.isConst) {
2529 FieldElement field = member; 2573 FieldElement field = member;
2530 result = new ConstantResult( 2574 result = new ConstantResult(
2531 node, new VariableConstantExpression(field), element: field); 2575 node, new VariableConstantExpression(field), element: field);
2532 } else { 2576 } else {
2533 result = new ElementResult(member); 2577 result = new ElementResult(member);
2534 } 2578 }
2535 } 2579 }
2536 2580
2537 // TODO(johnniwinther): Remove these when all information goes through 2581 // TODO(23998): Remove these when all information goes through
2538 // the [SendStructure]. 2582 // the [SendStructure].
2539 registry.useElement(node, member); 2583 registry.useElement(node, member);
2540 registry.setSelector(node, selector); 2584 registry.setSelector(node, selector);
2541 2585
2542 return result; 2586 return result;
2543 } 2587 }
2544 2588
2545 /// Handle access to resolved [element]. 2589 /// Handle access to resolved [element].
2546 ResolutionResult handleResolvedSend(Send node, Name name, Element element) { 2590 ResolutionResult handleResolvedSend(Send node, Name name, Element element) {
2547 if (element.isAmbiguous) { 2591 if (element.isAmbiguous) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2683 visitExpression(index); 2727 visitExpression(index);
2684 if (node.isPrefix || node.isPostfix) { 2728 if (node.isPrefix || node.isPostfix) {
2685 // `a[b]++` or `++a[b]`. 2729 // `a[b]++` or `++a[b]`.
2686 IncDecOperator operator = IncDecOperator.parse(operatorText); 2730 IncDecOperator operator = IncDecOperator.parse(operatorText);
2687 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver); 2731 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver);
2688 Selector getterSelector = new Selector.index(); 2732 Selector getterSelector = new Selector.index();
2689 Selector setterSelector = new Selector.indexSet(); 2733 Selector setterSelector = new Selector.indexSet();
2690 Selector operatorSelector = 2734 Selector operatorSelector =
2691 new Selector.binaryOperator(operator.selectorName); 2735 new Selector.binaryOperator(operator.selectorName);
2692 2736
2693 // TODO(johnniwinther): Remove these when selectors are only accessed 2737 // TODO(23998): Remove these when selectors are only accessed
2694 // through the send structure. 2738 // through the send structure.
2695 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 2739 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
2696 registry.setSelector(node, setterSelector); 2740 registry.setSelector(node, setterSelector);
2697 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 2741 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
2698 2742
2699 registry.registerDynamicInvocation( 2743 registry.registerDynamicInvocation(
2700 new UniverseSelector(getterSelector, null)); 2744 new UniverseSelector(getterSelector, null));
2701 registry.registerDynamicInvocation( 2745 registry.registerDynamicInvocation(
2702 new UniverseSelector(setterSelector, null)); 2746 new UniverseSelector(setterSelector, null));
2703 registry.registerDynamicInvocation( 2747 registry.registerDynamicInvocation(
2704 new UniverseSelector(operatorSelector, null)); 2748 new UniverseSelector(operatorSelector, null));
2705 2749
2706 SendStructure sendStructure = node.isPrefix 2750 SendStructure sendStructure = node.isPrefix
2707 ? new IndexPrefixStructure( 2751 ? new IndexPrefixStructure(
2708 semantics, operator, getterSelector, setterSelector) 2752 semantics, operator, getterSelector, setterSelector)
2709 : new IndexPostfixStructure( 2753 : new IndexPostfixStructure(
2710 semantics, operator, getterSelector, setterSelector); 2754 semantics, operator, getterSelector, setterSelector);
2711 registry.registerSendStructure(node, sendStructure); 2755 registry.registerSendStructure(node, sendStructure);
2712 return const NoneResult(); 2756 return const NoneResult();
2713 } else { 2757 } else {
2714 Node rhs = node.arguments.tail.head; 2758 Node rhs = node.arguments.tail.head;
2715 visitExpression(rhs); 2759 visitExpression(rhs);
2716 2760
2717 AssignmentOperator operator = AssignmentOperator.parse(operatorText); 2761 AssignmentOperator operator = AssignmentOperator.parse(operatorText);
2718 if (operator.kind == AssignmentOperatorKind.ASSIGN) { 2762 if (operator.kind == AssignmentOperatorKind.ASSIGN) {
2719 // `a[b] = c`. 2763 // `a[b] = c`.
2720 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver); 2764 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver);
2721 Selector setterSelector = new Selector.indexSet(); 2765 Selector setterSelector = new Selector.indexSet();
2722 2766
2723 // TODO(johnniwinther): Remove this when selectors are only accessed 2767 // TODO(23998): Remove this when selectors are only accessed
2724 // through the send structure. 2768 // through the send structure.
2725 registry.setSelector(node, setterSelector); 2769 registry.setSelector(node, setterSelector);
2726 registry.registerDynamicInvocation( 2770 registry.registerDynamicInvocation(
2727 new UniverseSelector(setterSelector, null)); 2771 new UniverseSelector(setterSelector, null));
2728 2772
2729 SendStructure sendStructure = 2773 SendStructure sendStructure =
2730 new IndexSetStructure(semantics, setterSelector); 2774 new IndexSetStructure(semantics, setterSelector);
2731 registry.registerSendStructure(node, sendStructure); 2775 registry.registerSendStructure(node, sendStructure);
2732 return const NoneResult(); 2776 return const NoneResult();
2733 } else { 2777 } else {
2734 // `a[b] += c`. 2778 // `a[b] += c`.
2735 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver); 2779 AccessSemantics semantics = new DynamicAccess.dynamicProperty(receiver);
2736 Selector getterSelector = new Selector.index(); 2780 Selector getterSelector = new Selector.index();
2737 Selector setterSelector = new Selector.indexSet(); 2781 Selector setterSelector = new Selector.indexSet();
2738 Selector operatorSelector = 2782 Selector operatorSelector =
2739 new Selector.binaryOperator(operator.selectorName); 2783 new Selector.binaryOperator(operator.selectorName);
2740 2784
2741 // TODO(johnniwinther): Remove these when selectors are only accessed 2785 // TODO(23998): Remove these when selectors are only accessed
2742 // through the send structure. 2786 // through the send structure.
2743 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 2787 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
2744 registry.setSelector(node, setterSelector); 2788 registry.setSelector(node, setterSelector);
2745 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 2789 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
2746 2790
2747 registry.registerDynamicInvocation( 2791 registry.registerDynamicInvocation(
2748 new UniverseSelector(getterSelector, null)); 2792 new UniverseSelector(getterSelector, null));
2749 registry.registerDynamicInvocation( 2793 registry.registerDynamicInvocation(
2750 new UniverseSelector(setterSelector, null)); 2794 new UniverseSelector(setterSelector, null));
2751 registry.registerDynamicInvocation( 2795 registry.registerDynamicInvocation(
(...skipping 16 matching lines...) Expand all
2768 visitExpression(index); 2812 visitExpression(index);
2769 AccessSemantics semantics = checkSuperAccess(node); 2813 AccessSemantics semantics = checkSuperAccess(node);
2770 if (node.isPrefix || node.isPostfix) { 2814 if (node.isPrefix || node.isPostfix) {
2771 // `super[a]++` or `++super[a]`. 2815 // `super[a]++` or `++super[a]`.
2772 IncDecOperator operator = IncDecOperator.parse(operatorText); 2816 IncDecOperator operator = IncDecOperator.parse(operatorText);
2773 Selector getterSelector = new Selector.index(); 2817 Selector getterSelector = new Selector.index();
2774 Selector setterSelector = new Selector.indexSet(); 2818 Selector setterSelector = new Selector.indexSet();
2775 Selector operatorSelector = 2819 Selector operatorSelector =
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(23998): 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(23998): 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(
2797 new UniverseSelector(operatorSelector, null)); 2841 new UniverseSelector(operatorSelector, null));
2798 2842
2799 SendStructure sendStructure = node.isPrefix 2843 SendStructure sendStructure = node.isPrefix
2800 ? new IndexPrefixStructure( 2844 ? new IndexPrefixStructure(
2801 semantics, operator, getterSelector, setterSelector) 2845 semantics, operator, getterSelector, setterSelector)
2802 : new IndexPostfixStructure( 2846 : new IndexPostfixStructure(
2803 semantics, operator, getterSelector, setterSelector); 2847 semantics, operator, getterSelector, setterSelector);
2804 registry.registerSendStructure(node, sendStructure); 2848 registry.registerSendStructure(node, sendStructure);
2805 return const NoneResult(); 2849 return const NoneResult();
2806 } else { 2850 } else {
2807 Node rhs = node.arguments.tail.head; 2851 Node rhs = node.arguments.tail.head;
2808 visitExpression(rhs); 2852 visitExpression(rhs);
2809 2853
2810 AssignmentOperator operator = AssignmentOperator.parse(operatorText); 2854 AssignmentOperator operator = AssignmentOperator.parse(operatorText);
2811 if (operator.kind == AssignmentOperatorKind.ASSIGN) { 2855 if (operator.kind == AssignmentOperatorKind.ASSIGN) {
2812 // `super[a] = b`. 2856 // `super[a] = b`.
2813 Selector setterSelector = new Selector.indexSet(); 2857 Selector setterSelector = new Selector.indexSet();
2814 if (semantics == null) { 2858 if (semantics == null) {
2815 semantics = 2859 semantics =
2816 computeSuperAccessSemanticsForSelector(node, setterSelector); 2860 computeSuperAccessSemanticsForSelector(node, setterSelector);
2817 2861
2818 // TODO(johnniwinther): Remove these when elements are only accessed 2862 // TODO(23998): Remove these when elements are only accessed
2819 // through the send structure. 2863 // through the send structure.
2820 registry.useElement(node, semantics.setter); 2864 registry.useElement(node, semantics.setter);
2821 } 2865 }
2822 2866
2823 // TODO(johnniwinther): Remove this when selectors are only accessed 2867 // TODO(23998): Remove this when selectors are only accessed
2824 // through the send structure. 2868 // through the send structure.
2825 registry.setSelector(node, setterSelector); 2869 registry.setSelector(node, setterSelector);
2826 registry.registerStaticInvocation(semantics.setter); 2870 registry.registerStaticInvocation(semantics.setter);
2827 2871
2828 SendStructure sendStructure = 2872 SendStructure sendStructure =
2829 new IndexSetStructure(semantics, setterSelector); 2873 new IndexSetStructure(semantics, setterSelector);
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(23998): 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(23998): 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(23998): 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(23998): 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(23998): Remove these when elements are only accessed
2998 // through the send structure.
2999 registry.useElement(node, semantics.setter);
3000 }
3001
3002 // TODO(23998): 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(23998): 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(23998): 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