| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 /// 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |