OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.resolution.members; | 5 library dart2js.resolution.members; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart' show | 8 import '../common/names.dart' show |
9 Selectors; | 9 Selectors; |
10 import '../compiler.dart' show | 10 import '../compiler.dart' show |
(...skipping 21 matching lines...) Expand all Loading... |
32 isUserDefinableOperator; | 32 isUserDefinableOperator; |
33 import '../tree/tree.dart'; | 33 import '../tree/tree.dart'; |
34 import '../util/util.dart' show | 34 import '../util/util.dart' show |
35 Link; | 35 Link; |
36 import '../universe/call_structure.dart' show | 36 import '../universe/call_structure.dart' show |
37 CallStructure; | 37 CallStructure; |
38 import '../universe/selector.dart' show | 38 import '../universe/selector.dart' show |
39 Selector; | 39 Selector; |
40 import '../universe/universe.dart' show | 40 import '../universe/universe.dart' show |
41 UniverseSelector; | 41 UniverseSelector; |
| 42 import '../universe/use.dart' show |
| 43 StaticUse; |
42 | 44 |
43 import 'access_semantics.dart'; | 45 import 'access_semantics.dart'; |
44 import 'class_members.dart' show MembersCreator; | 46 import 'class_members.dart' show MembersCreator; |
45 import 'operators.dart'; | 47 import 'operators.dart'; |
46 import 'send_structure.dart'; | 48 import 'send_structure.dart'; |
47 | 49 |
48 import 'constructors.dart' show | 50 import 'constructors.dart' show |
49 ConstructorResolver, | 51 ConstructorResolver, |
50 ConstructorResult; | 52 ConstructorResult; |
51 import 'label_scope.dart' show | 53 import 'label_scope.dart' show |
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 error = reportAndCreateErroneousElement( | 1028 error = reportAndCreateErroneousElement( |
1027 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER, | 1029 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER, |
1028 {'className': currentClass.name, 'memberName': name}); | 1030 {'className': currentClass.name, 'memberName': name}); |
1029 } | 1031 } |
1030 if (target == null) { | 1032 if (target == null) { |
1031 // If a setter wasn't resolved, use the [ErroneousElement]. | 1033 // If a setter wasn't resolved, use the [ErroneousElement]. |
1032 target = error; | 1034 target = error; |
1033 } | 1035 } |
1034 // We still need to register the invocation, because we might | 1036 // We still need to register the invocation, because we might |
1035 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. | 1037 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. |
1036 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 1038 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
1037 registry.registerSuperNoSuchMethod(); | 1039 registry.registerSuperNoSuchMethod(); |
1038 } | 1040 } |
1039 return computeSuperAccessSemantics(node, target); | 1041 return computeSuperAccessSemantics(node, target); |
1040 } | 1042 } |
1041 | 1043 |
1042 /// Compute the [AccessSemantics] for accessing the name of [selector] on the | 1044 /// Compute the [AccessSemantics] for accessing the name of [selector] on the |
1043 /// super class. | 1045 /// super class. |
1044 /// | 1046 /// |
1045 /// If no matching super member is found and error is reported and | 1047 /// If no matching super member is found and error is reported and |
1046 /// `noSuchMethod` on `super` is registered. Furthermore, if [alternateName] | 1048 /// `noSuchMethod` on `super` is registered. Furthermore, if [alternateName] |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 node, setterSelector.name, | 1095 node, setterSelector.name, |
1094 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, | 1096 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, |
1095 {'superclassName': setter.enclosingClass.name, | 1097 {'superclassName': setter.enclosingClass.name, |
1096 'name': setterSelector.name}); | 1098 'name': setterSelector.name}); |
1097 setterError = true; | 1099 setterError = true; |
1098 } | 1100 } |
1099 } | 1101 } |
1100 if (getterError) { | 1102 if (getterError) { |
1101 // We still need to register the invocation, because we might | 1103 // We still need to register the invocation, because we might |
1102 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. | 1104 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. |
1103 registry.registerDynamicInvocation( | 1105 registry.registerDynamicUse( |
1104 new UniverseSelector(getterSelector, null)); | 1106 new UniverseSelector(getterSelector, null)); |
1105 } | 1107 } |
1106 if (setterError) { | 1108 if (setterError) { |
1107 // We still need to register the invocation, because we might | 1109 // We still need to register the invocation, because we might |
1108 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. | 1110 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. |
1109 registry.registerDynamicInvocation( | 1111 registry.registerDynamicUse( |
1110 new UniverseSelector(setterSelector, null)); | 1112 new UniverseSelector(setterSelector, null)); |
1111 } | 1113 } |
1112 if (getterError || setterError) { | 1114 if (getterError || setterError) { |
1113 registry.registerSuperNoSuchMethod(); | 1115 registry.registerSuperNoSuchMethod(); |
1114 } | 1116 } |
1115 return computeCompoundSuperAccessSemantics( | 1117 return computeCompoundSuperAccessSemantics( |
1116 node, getter, setter, isIndex: isIndex); | 1118 node, getter, setter, isIndex: isIndex); |
1117 } | 1119 } |
1118 | 1120 |
1119 /// Resolve [node] as a subexpression that is _not_ the prefix of a member | 1121 /// Resolve [node] as a subexpression that is _not_ the prefix of a member |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1203 registry.setSelector(node, selector); | 1205 registry.setSelector(node, selector); |
1204 | 1206 |
1205 AccessSemantics semantics; | 1207 AccessSemantics semantics; |
1206 if (node.isSuperCall) { | 1208 if (node.isSuperCall) { |
1207 semantics = checkSuperAccess(node); | 1209 semantics = checkSuperAccess(node); |
1208 if (semantics == null) { | 1210 if (semantics == null) { |
1209 semantics = computeSuperAccessSemanticsForSelector(node, selector); | 1211 semantics = computeSuperAccessSemanticsForSelector(node, selector); |
1210 // TODO(johnniwinther): Add information to [AccessSemantics] about | 1212 // TODO(johnniwinther): Add information to [AccessSemantics] about |
1211 // whether it is erroneous. | 1213 // whether it is erroneous. |
1212 if (semantics.kind == AccessKind.SUPER_METHOD) { | 1214 if (semantics.kind == AccessKind.SUPER_METHOD) { |
1213 registry.registerStaticUse(semantics.element.declaration); | 1215 registry.registerStaticUse( |
| 1216 new StaticUse.superInvoke( |
| 1217 semantics.element.declaration, |
| 1218 selector.callStructure)); |
1214 } | 1219 } |
1215 // TODO(23998): Remove this when all information goes through | 1220 // TODO(23998): Remove this when all information goes through |
1216 // the [SendStructure]. | 1221 // the [SendStructure]. |
1217 registry.useElement(node, semantics.element); | 1222 registry.useElement(node, semantics.element); |
1218 } | 1223 } |
1219 } else { | 1224 } else { |
1220 ResolutionResult expressionResult = visitExpression(expression); | 1225 ResolutionResult expressionResult = visitExpression(expression); |
1221 semantics = const DynamicAccess.expression(); | 1226 semantics = const DynamicAccess.expression(); |
1222 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 1227 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
1223 | 1228 |
1224 if (expressionResult.isConstant) { | 1229 if (expressionResult.isConstant) { |
1225 bool isValidConstant; | 1230 bool isValidConstant; |
1226 ConstantExpression expressionConstant = expressionResult.constant; | 1231 ConstantExpression expressionConstant = expressionResult.constant; |
1227 DartType knownExpressionType = | 1232 DartType knownExpressionType = |
1228 expressionConstant.getKnownType(coreTypes); | 1233 expressionConstant.getKnownType(coreTypes); |
1229 switch (operator.kind) { | 1234 switch (operator.kind) { |
1230 case UnaryOperatorKind.COMPLEMENT: | 1235 case UnaryOperatorKind.COMPLEMENT: |
1231 isValidConstant = | 1236 isValidConstant = |
1232 knownExpressionType == coreTypes.intType; | 1237 knownExpressionType == coreTypes.intType; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 // [SendStructure]. | 1380 // [SendStructure]. |
1376 registry.setSelector(node, selector); | 1381 registry.setSelector(node, selector); |
1377 | 1382 |
1378 if (node.isSuperCall) { | 1383 if (node.isSuperCall) { |
1379 semantics = checkSuperAccess(node); | 1384 semantics = checkSuperAccess(node); |
1380 if (semantics == null) { | 1385 if (semantics == null) { |
1381 semantics = computeSuperAccessSemanticsForSelector(node, selector); | 1386 semantics = computeSuperAccessSemanticsForSelector(node, selector); |
1382 // TODO(johnniwinther): Add information to [AccessSemantics] about | 1387 // TODO(johnniwinther): Add information to [AccessSemantics] about |
1383 // whether it is erroneous. | 1388 // whether it is erroneous. |
1384 if (semantics.kind == AccessKind.SUPER_METHOD) { | 1389 if (semantics.kind == AccessKind.SUPER_METHOD) { |
1385 registry.registerStaticUse(semantics.element.declaration); | 1390 registry.registerStaticUse( |
| 1391 new StaticUse.superInvoke( |
| 1392 semantics.element.declaration, |
| 1393 selector.callStructure)); |
1386 } | 1394 } |
1387 // TODO(23998): Remove this when all information goes through | 1395 // TODO(23998): Remove this when all information goes through |
1388 // the [SendStructure]. | 1396 // the [SendStructure]. |
1389 registry.useElement(node, semantics.element); | 1397 registry.useElement(node, semantics.element); |
1390 } | 1398 } |
1391 visitExpression(right); | 1399 visitExpression(right); |
1392 } else { | 1400 } else { |
1393 ResolutionResult leftResult = visitExpression(left); | 1401 ResolutionResult leftResult = visitExpression(left); |
1394 ResolutionResult rightResult = visitExpression(right); | 1402 ResolutionResult rightResult = visitExpression(right); |
1395 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 1403 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
1396 semantics = const DynamicAccess.expression(); | 1404 semantics = const DynamicAccess.expression(); |
1397 | 1405 |
1398 if (leftResult.isConstant && rightResult.isConstant) { | 1406 if (leftResult.isConstant && rightResult.isConstant) { |
1399 bool isValidConstant; | 1407 bool isValidConstant; |
1400 ConstantExpression leftConstant = leftResult.constant; | 1408 ConstantExpression leftConstant = leftResult.constant; |
1401 ConstantExpression rightConstant = rightResult.constant; | 1409 ConstantExpression rightConstant = rightResult.constant; |
1402 DartType knownLeftType = leftConstant.getKnownType(coreTypes); | 1410 DartType knownLeftType = leftConstant.getKnownType(coreTypes); |
1403 DartType knownRightType = rightConstant.getKnownType(coreTypes); | 1411 DartType knownRightType = rightConstant.getKnownType(coreTypes); |
1404 switch (operator.kind) { | 1412 switch (operator.kind) { |
1405 case BinaryOperatorKind.EQ: | 1413 case BinaryOperatorKind.EQ: |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 assert(invariant(node, node.isCall, | 1528 assert(invariant(node, node.isCall, |
1521 message: "Unexpected expression: $node")); | 1529 message: "Unexpected expression: $node")); |
1522 Node expression = node.selector; | 1530 Node expression = node.selector; |
1523 visitExpression(expression); | 1531 visitExpression(expression); |
1524 CallStructure callStructure = | 1532 CallStructure callStructure = |
1525 resolveArguments(node.argumentsNode).callStructure; | 1533 resolveArguments(node.argumentsNode).callStructure; |
1526 Selector selector = callStructure.callSelector; | 1534 Selector selector = callStructure.callSelector; |
1527 // TODO(23998): Remove this when all information goes through the | 1535 // TODO(23998): Remove this when all information goes through the |
1528 // [SendStructure]. | 1536 // [SendStructure]. |
1529 registry.setSelector(node, selector); | 1537 registry.setSelector(node, selector); |
1530 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 1538 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
1531 registry.registerSendStructure(node, | 1539 registry.registerSendStructure(node, |
1532 new InvokeStructure(const DynamicAccess.expression(), selector)); | 1540 new InvokeStructure(const DynamicAccess.expression(), selector)); |
1533 return const NoneResult(); | 1541 return const NoneResult(); |
1534 } | 1542 } |
1535 | 1543 |
1536 /// Handle access of a property of [name] on `this`, like `this.name` and | 1544 /// Handle access of a property of [name] on `this`, like `this.name` and |
1537 /// `this.name()`, or `name` and `name()` in instance context. | 1545 /// `this.name()`, or `name` and `name()` in instance context. |
1538 ResolutionResult handleThisPropertyAccess(Send node, Name name) { | 1546 ResolutionResult handleThisPropertyAccess(Send node, Name name) { |
1539 AccessSemantics semantics = new DynamicAccess.thisProperty(name); | 1547 AccessSemantics semantics = new DynamicAccess.thisProperty(name); |
1540 return handleDynamicAccessSemantics(node, name, semantics); | 1548 return handleDynamicAccessSemantics(node, name, semantics); |
(...skipping 12 matching lines...) Expand all Loading... |
1553 ResolutionResult handleThisAccess(Send node) { | 1561 ResolutionResult handleThisAccess(Send node) { |
1554 if (node.isCall) { | 1562 if (node.isCall) { |
1555 CallStructure callStructure = | 1563 CallStructure callStructure = |
1556 resolveArguments(node.argumentsNode).callStructure; | 1564 resolveArguments(node.argumentsNode).callStructure; |
1557 Selector selector = callStructure.callSelector; | 1565 Selector selector = callStructure.callSelector; |
1558 // TODO(johnniwinther): Handle invalid this access as an | 1566 // TODO(johnniwinther): Handle invalid this access as an |
1559 // [AccessSemantics]. | 1567 // [AccessSemantics]. |
1560 AccessSemantics accessSemantics = checkThisAccess(node); | 1568 AccessSemantics accessSemantics = checkThisAccess(node); |
1561 if (accessSemantics == null) { | 1569 if (accessSemantics == null) { |
1562 accessSemantics = const DynamicAccess.thisAccess(); | 1570 accessSemantics = const DynamicAccess.thisAccess(); |
1563 registry.registerDynamicInvocation( | 1571 registry.registerDynamicUse( |
1564 new UniverseSelector(selector, null)); | 1572 new UniverseSelector(selector, null)); |
1565 } | 1573 } |
1566 registry.registerSendStructure(node, | 1574 registry.registerSendStructure(node, |
1567 new InvokeStructure(accessSemantics, selector)); | 1575 new InvokeStructure(accessSemantics, selector)); |
1568 // TODO(23998): Remove this when all information goes through | 1576 // TODO(23998): Remove this when all information goes through |
1569 // the [SendStructure]. | 1577 // the [SendStructure]. |
1570 registry.setSelector(node, selector); | 1578 registry.setSelector(node, selector); |
1571 return const NoneResult(); | 1579 return const NoneResult(); |
1572 } else { | 1580 } else { |
1573 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node. | 1581 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node. |
(...skipping 21 matching lines...) Expand all Loading... |
1595 } | 1603 } |
1596 if (node.isCall) { | 1604 if (node.isCall) { |
1597 bool isIncompatibleInvoke = false; | 1605 bool isIncompatibleInvoke = false; |
1598 switch (semantics.kind) { | 1606 switch (semantics.kind) { |
1599 case AccessKind.SUPER_METHOD: | 1607 case AccessKind.SUPER_METHOD: |
1600 MethodElementX superMethod = semantics.element; | 1608 MethodElementX superMethod = semantics.element; |
1601 superMethod.computeType(resolution); | 1609 superMethod.computeType(resolution); |
1602 if (!callStructure.signatureApplies( | 1610 if (!callStructure.signatureApplies( |
1603 superMethod.functionSignature)) { | 1611 superMethod.functionSignature)) { |
1604 registry.registerThrowNoSuchMethod(); | 1612 registry.registerThrowNoSuchMethod(); |
1605 registry.registerDynamicInvocation( | 1613 registry.registerDynamicUse( |
1606 new UniverseSelector(selector, null)); | 1614 new UniverseSelector(selector, null)); |
1607 registry.registerSuperNoSuchMethod(); | 1615 registry.registerSuperNoSuchMethod(); |
1608 isIncompatibleInvoke = true; | 1616 isIncompatibleInvoke = true; |
1609 } else { | 1617 } else { |
1610 registry.registerStaticInvocation(semantics.element); | 1618 registry.registerStaticUse( |
| 1619 new StaticUse.superInvoke(semantics.element, callStructure)); |
1611 } | 1620 } |
1612 break; | 1621 break; |
1613 case AccessKind.SUPER_FIELD: | 1622 case AccessKind.SUPER_FIELD: |
1614 case AccessKind.SUPER_FINAL_FIELD: | 1623 case AccessKind.SUPER_FINAL_FIELD: |
1615 case AccessKind.SUPER_GETTER: | 1624 case AccessKind.SUPER_GETTER: |
1616 registry.registerStaticUse(semantics.element); | 1625 registry.registerStaticUse( |
| 1626 new StaticUse.superGet(semantics.element)); |
1617 selector = callStructure.callSelector; | 1627 selector = callStructure.callSelector; |
1618 registry.registerDynamicInvocation( | 1628 registry.registerDynamicUse( |
1619 new UniverseSelector(selector, null)); | 1629 new UniverseSelector(selector, null)); |
1620 break; | 1630 break; |
1621 case AccessKind.SUPER_SETTER: | 1631 case AccessKind.SUPER_SETTER: |
1622 case AccessKind.UNRESOLVED_SUPER: | 1632 case AccessKind.UNRESOLVED_SUPER: |
1623 // NoSuchMethod registered in [computeSuperSemantics]. | 1633 // NoSuchMethod registered in [computeSuperSemantics]. |
1624 break; | 1634 break; |
1625 case AccessKind.INVALID: | 1635 case AccessKind.INVALID: |
1626 // 'super' is not allowed. | 1636 // 'super' is not allowed. |
1627 break; | 1637 break; |
1628 default: | 1638 default: |
1629 reporter.internalError( | 1639 reporter.internalError( |
1630 node, "Unexpected super property access $semantics."); | 1640 node, "Unexpected super property access $semantics."); |
1631 break; | 1641 break; |
1632 } | 1642 } |
1633 registry.registerSendStructure(node, | 1643 registry.registerSendStructure(node, |
1634 isIncompatibleInvoke | 1644 isIncompatibleInvoke |
1635 ? new IncompatibleInvokeStructure(semantics, selector) | 1645 ? new IncompatibleInvokeStructure(semantics, selector) |
1636 : new InvokeStructure(semantics, selector)); | 1646 : new InvokeStructure(semantics, selector)); |
1637 } else { | 1647 } else { |
1638 switch (semantics.kind) { | 1648 switch (semantics.kind) { |
1639 case AccessKind.SUPER_METHOD: | 1649 case AccessKind.SUPER_METHOD: |
1640 // TODO(johnniwinther): Method this should be registered as a | 1650 // TODO(johnniwinther): Method this should be registered as a |
1641 // closurization. | 1651 // closurization. |
1642 registry.registerStaticUse(semantics.element); | 1652 registry.registerStaticUse( |
| 1653 new StaticUse.superTearOff(semantics.element)); |
1643 break; | 1654 break; |
1644 case AccessKind.SUPER_FIELD: | 1655 case AccessKind.SUPER_FIELD: |
1645 case AccessKind.SUPER_FINAL_FIELD: | 1656 case AccessKind.SUPER_FINAL_FIELD: |
1646 case AccessKind.SUPER_GETTER: | 1657 case AccessKind.SUPER_GETTER: |
1647 registry.registerStaticUse(semantics.element); | 1658 registry.registerStaticUse( |
| 1659 new StaticUse.superGet(semantics.element)); |
1648 break; | 1660 break; |
1649 case AccessKind.SUPER_SETTER: | 1661 case AccessKind.SUPER_SETTER: |
1650 case AccessKind.UNRESOLVED_SUPER: | 1662 case AccessKind.UNRESOLVED_SUPER: |
1651 // NoSuchMethod registered in [computeSuperSemantics]. | 1663 // NoSuchMethod registered in [computeSuperSemantics]. |
1652 break; | 1664 break; |
1653 case AccessKind.INVALID: | 1665 case AccessKind.INVALID: |
1654 // 'super' is not allowed. | 1666 // 'super' is not allowed. |
1655 break; | 1667 break; |
1656 default: | 1668 default: |
1657 reporter.internalError( | 1669 reporter.internalError( |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2319 | 2331 |
2320 /// Handle dynamic access of [semantics]. | 2332 /// Handle dynamic access of [semantics]. |
2321 ResolutionResult handleDynamicAccessSemantics( | 2333 ResolutionResult handleDynamicAccessSemantics( |
2322 Send node, Name name, AccessSemantics semantics) { | 2334 Send node, Name name, AccessSemantics semantics) { |
2323 SendStructure sendStructure; | 2335 SendStructure sendStructure; |
2324 Selector selector; | 2336 Selector selector; |
2325 if (node.isCall) { | 2337 if (node.isCall) { |
2326 CallStructure callStructure = | 2338 CallStructure callStructure = |
2327 resolveArguments(node.argumentsNode).callStructure; | 2339 resolveArguments(node.argumentsNode).callStructure; |
2328 selector = new Selector.call(name, callStructure); | 2340 selector = new Selector.call(name, callStructure); |
2329 registry.registerDynamicInvocation( | 2341 registry.registerDynamicUse( |
2330 new UniverseSelector(selector, null)); | 2342 new UniverseSelector(selector, null)); |
2331 sendStructure = new InvokeStructure(semantics, selector); | 2343 sendStructure = new InvokeStructure(semantics, selector); |
2332 } else { | 2344 } else { |
2333 assert(invariant(node, node.isPropertyAccess)); | 2345 assert(invariant(node, node.isPropertyAccess)); |
2334 selector = new Selector.getter(name); | 2346 selector = new Selector.getter(name); |
2335 registry.registerDynamicGetter( | 2347 registry.registerDynamicUse( |
2336 new UniverseSelector(selector, null)); | 2348 new UniverseSelector(selector, null)); |
2337 sendStructure = new GetStructure(semantics); | 2349 sendStructure = new GetStructure(semantics); |
2338 } | 2350 } |
2339 registry.registerSendStructure(node, sendStructure); | 2351 registry.registerSendStructure(node, sendStructure); |
2340 // TODO(23998): Remove this when all information goes through | 2352 // TODO(23998): Remove this when all information goes through |
2341 // the [SendStructure]. | 2353 // the [SendStructure]. |
2342 registry.setSelector(node, selector); | 2354 registry.setSelector(node, selector); |
2343 return const NoneResult(); | 2355 return const NoneResult(); |
2344 } | 2356 } |
2345 | 2357 |
2346 /// Handle dynamic update of [semantics]. | 2358 /// Handle dynamic update of [semantics]. |
2347 ResolutionResult handleDynamicUpdateSemantics( | 2359 ResolutionResult handleDynamicUpdateSemantics( |
2348 SendSet node, Name name, Element element, AccessSemantics semantics) { | 2360 SendSet node, Name name, Element element, AccessSemantics semantics) { |
2349 Selector getterSelector = new Selector.getter(name); | 2361 Selector getterSelector = new Selector.getter(name); |
2350 Selector setterSelector = new Selector.setter(name.setter); | 2362 Selector setterSelector = new Selector.setter(name.setter); |
2351 registry.registerDynamicSetter( | 2363 registry.registerDynamicUse( |
2352 new UniverseSelector(setterSelector, null)); | 2364 new UniverseSelector(setterSelector, null)); |
2353 if (node.isComplex) { | 2365 if (node.isComplex) { |
2354 registry.registerDynamicGetter( | 2366 registry.registerDynamicUse( |
2355 new UniverseSelector(getterSelector, null)); | 2367 new UniverseSelector(getterSelector, null)); |
2356 } | 2368 } |
2357 | 2369 |
2358 // TODO(23998): Remove these when elements are only accessed through the | 2370 // TODO(23998): Remove these when elements are only accessed through the |
2359 // send structure. | 2371 // send structure. |
2360 Element getter = element; | 2372 Element getter = element; |
2361 Element setter = element; | 2373 Element setter = element; |
2362 if (element != null && element.isAbstractField) { | 2374 if (element != null && element.isAbstractField) { |
2363 AbstractFieldElement abstractField = element; | 2375 AbstractFieldElement abstractField = element; |
2364 getter = abstractField.getter; | 2376 getter = abstractField.getter; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2465 | 2477 |
2466 /// Handle erroneous access of [element] of the given [semantics]. | 2478 /// Handle erroneous access of [element] of the given [semantics]. |
2467 ResolutionResult handleErroneousAccess( | 2479 ResolutionResult handleErroneousAccess( |
2468 Send node, Name name, AccessSemantics semantics) { | 2480 Send node, Name name, AccessSemantics semantics) { |
2469 SendStructure sendStructure; | 2481 SendStructure sendStructure; |
2470 Selector selector; | 2482 Selector selector; |
2471 if (node.isCall) { | 2483 if (node.isCall) { |
2472 CallStructure callStructure = | 2484 CallStructure callStructure = |
2473 resolveArguments(node.argumentsNode).callStructure; | 2485 resolveArguments(node.argumentsNode).callStructure; |
2474 selector = new Selector.call(name, callStructure); | 2486 selector = new Selector.call(name, callStructure); |
2475 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 2487 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
2476 sendStructure = new InvokeStructure(semantics, selector); | 2488 sendStructure = new InvokeStructure(semantics, selector); |
2477 } else { | 2489 } else { |
2478 assert(invariant(node, node.isPropertyAccess)); | 2490 assert(invariant(node, node.isPropertyAccess)); |
2479 selector = new Selector.getter(name); | 2491 selector = new Selector.getter(name); |
2480 registry.registerDynamicGetter(new UniverseSelector(selector, null)); | 2492 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
2481 sendStructure = new GetStructure(semantics); | 2493 sendStructure = new GetStructure(semantics); |
2482 } | 2494 } |
2483 // TODO(23998): Remove this when all information goes through | 2495 // TODO(23998): Remove this when all information goes through |
2484 // the [SendStructure]. | 2496 // the [SendStructure]. |
2485 registry.setSelector(node, selector); | 2497 registry.setSelector(node, selector); |
2486 registry.useElement(node, semantics.element); | 2498 registry.useElement(node, semantics.element); |
2487 registry.registerSendStructure(node, sendStructure); | 2499 registry.registerSendStructure(node, sendStructure); |
2488 return const NoneResult(); | 2500 return const NoneResult(); |
2489 } | 2501 } |
2490 | 2502 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2547 CallStructure callStructure = | 2559 CallStructure callStructure = |
2548 resolveArguments(node.argumentsNode).callStructure; | 2560 resolveArguments(node.argumentsNode).callStructure; |
2549 selector = new Selector.call(name, callStructure); | 2561 selector = new Selector.call(name, callStructure); |
2550 bool isIncompatibleInvoke = false; | 2562 bool isIncompatibleInvoke = false; |
2551 switch (semantics.kind) { | 2563 switch (semantics.kind) { |
2552 case AccessKind.LOCAL_FUNCTION: | 2564 case AccessKind.LOCAL_FUNCTION: |
2553 LocalFunctionElementX function = semantics.element; | 2565 LocalFunctionElementX function = semantics.element; |
2554 function.computeType(resolution); | 2566 function.computeType(resolution); |
2555 if (!callStructure.signatureApplies(function.functionSignature)) { | 2567 if (!callStructure.signatureApplies(function.functionSignature)) { |
2556 registry.registerThrowNoSuchMethod(); | 2568 registry.registerThrowNoSuchMethod(); |
2557 registry.registerDynamicInvocation( | 2569 registry.registerDynamicUse( |
2558 new UniverseSelector(selector, null)); | 2570 new UniverseSelector(selector, null)); |
2559 isIncompatibleInvoke = true; | 2571 isIncompatibleInvoke = true; |
2560 } | 2572 } |
2561 break; | 2573 break; |
2562 case AccessKind.PARAMETER: | 2574 case AccessKind.PARAMETER: |
2563 case AccessKind.FINAL_PARAMETER: | 2575 case AccessKind.FINAL_PARAMETER: |
2564 case AccessKind.LOCAL_VARIABLE: | 2576 case AccessKind.LOCAL_VARIABLE: |
2565 case AccessKind.FINAL_LOCAL_VARIABLE: | 2577 case AccessKind.FINAL_LOCAL_VARIABLE: |
2566 selector = callStructure.callSelector; | 2578 selector = callStructure.callSelector; |
2567 registry.registerDynamicInvocation( | 2579 registry.registerDynamicUse( |
2568 new UniverseSelector(selector, null)); | 2580 new UniverseSelector(selector, null)); |
2569 break; | 2581 break; |
2570 default: | 2582 default: |
2571 reporter.internalError(node, | 2583 reporter.internalError(node, |
2572 "Unexpected local access $semantics."); | 2584 "Unexpected local access $semantics."); |
2573 break; | 2585 break; |
2574 } | 2586 } |
2575 registry.registerSendStructure(node, | 2587 registry.registerSendStructure(node, |
2576 isIncompatibleInvoke | 2588 isIncompatibleInvoke |
2577 ? new IncompatibleInvokeStructure(semantics, selector) | 2589 ? new IncompatibleInvokeStructure(semantics, selector) |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2720 selector = new Selector.call(name, callStructure); | 2732 selector = new Selector.call(name, callStructure); |
2721 | 2733 |
2722 bool isIncompatibleInvoke = false; | 2734 bool isIncompatibleInvoke = false; |
2723 switch (semantics.kind) { | 2735 switch (semantics.kind) { |
2724 case AccessKind.STATIC_METHOD: | 2736 case AccessKind.STATIC_METHOD: |
2725 case AccessKind.TOPLEVEL_METHOD: | 2737 case AccessKind.TOPLEVEL_METHOD: |
2726 MethodElement method = semantics.element; | 2738 MethodElement method = semantics.element; |
2727 method.computeType(resolution); | 2739 method.computeType(resolution); |
2728 if (!callStructure.signatureApplies(method.functionSignature)) { | 2740 if (!callStructure.signatureApplies(method.functionSignature)) { |
2729 registry.registerThrowNoSuchMethod(); | 2741 registry.registerThrowNoSuchMethod(); |
2730 registry.registerDynamicInvocation( | 2742 registry.registerDynamicUse( |
2731 new UniverseSelector(selector, null)); | 2743 new UniverseSelector(selector, null)); |
2732 isIncompatibleInvoke = true; | 2744 isIncompatibleInvoke = true; |
2733 } else { | 2745 } else { |
2734 registry.registerStaticUse(semantics.element); | 2746 registry.registerStaticUse( |
| 2747 new StaticUse.staticInvoke(semantics.element, callStructure)); |
2735 handleForeignCall(node, semantics.element, callStructure); | 2748 handleForeignCall(node, semantics.element, callStructure); |
2736 if (method == compiler.identicalFunction && | 2749 if (method == compiler.identicalFunction && |
2737 argumentsResult.isValidAsConstant) { | 2750 argumentsResult.isValidAsConstant) { |
2738 result = new ConstantResult(node, | 2751 result = new ConstantResult(node, |
2739 new IdenticalConstantExpression( | 2752 new IdenticalConstantExpression( |
2740 argumentsResult.argumentResults[0].constant, | 2753 argumentsResult.argumentResults[0].constant, |
2741 argumentsResult.argumentResults[1].constant)); | 2754 argumentsResult.argumentResults[1].constant)); |
2742 } | 2755 } |
2743 } | 2756 } |
2744 break; | 2757 break; |
2745 case AccessKind.STATIC_FIELD: | 2758 case AccessKind.STATIC_FIELD: |
2746 case AccessKind.FINAL_STATIC_FIELD: | 2759 case AccessKind.FINAL_STATIC_FIELD: |
2747 case AccessKind.STATIC_GETTER: | 2760 case AccessKind.STATIC_GETTER: |
2748 case AccessKind.TOPLEVEL_FIELD: | 2761 case AccessKind.TOPLEVEL_FIELD: |
2749 case AccessKind.FINAL_TOPLEVEL_FIELD: | 2762 case AccessKind.FINAL_TOPLEVEL_FIELD: |
2750 case AccessKind.TOPLEVEL_GETTER: | 2763 case AccessKind.TOPLEVEL_GETTER: |
2751 registry.registerStaticUse(semantics.element); | 2764 registry.registerStaticUse( |
| 2765 new StaticUse.staticGet(semantics.element)); |
2752 selector = callStructure.callSelector; | 2766 selector = callStructure.callSelector; |
2753 registry.registerDynamicInvocation( | 2767 registry.registerDynamicUse( |
2754 new UniverseSelector(selector, null)); | 2768 new UniverseSelector(selector, null)); |
2755 break; | 2769 break; |
2756 case AccessKind.STATIC_SETTER: | 2770 case AccessKind.STATIC_SETTER: |
2757 case AccessKind.TOPLEVEL_SETTER: | 2771 case AccessKind.TOPLEVEL_SETTER: |
2758 case AccessKind.UNRESOLVED: | 2772 case AccessKind.UNRESOLVED: |
2759 registry.registerThrowNoSuchMethod(); | 2773 registry.registerThrowNoSuchMethod(); |
2760 member = reportAndCreateErroneousElement( | 2774 member = reportAndCreateErroneousElement( |
2761 node.selector, name.text, | 2775 node.selector, name.text, |
2762 MessageKind.CANNOT_RESOLVE_GETTER, const {}); | 2776 MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
2763 break; | 2777 break; |
2764 default: | 2778 default: |
2765 reporter.internalError(node, | 2779 reporter.internalError(node, |
2766 "Unexpected statically resolved access $semantics."); | 2780 "Unexpected statically resolved access $semantics."); |
2767 break; | 2781 break; |
2768 } | 2782 } |
2769 registry.registerSendStructure(node, | 2783 registry.registerSendStructure(node, |
2770 isIncompatibleInvoke | 2784 isIncompatibleInvoke |
2771 ? new IncompatibleInvokeStructure(semantics, selector) | 2785 ? new IncompatibleInvokeStructure(semantics, selector) |
2772 : new InvokeStructure(semantics, selector)); | 2786 : new InvokeStructure(semantics, selector)); |
2773 } else { | 2787 } else { |
2774 selector = new Selector.getter(name); | 2788 selector = new Selector.getter(name); |
2775 switch (semantics.kind) { | 2789 switch (semantics.kind) { |
2776 case AccessKind.STATIC_METHOD: | 2790 case AccessKind.STATIC_METHOD: |
2777 case AccessKind.TOPLEVEL_METHOD: | 2791 case AccessKind.TOPLEVEL_METHOD: |
2778 // TODO(johnniwinther): Method this should be registered as a | 2792 registry.registerStaticUse( |
2779 // closurization. | 2793 new StaticUse.staticTearOff(semantics.element)); |
2780 registry.registerStaticUse(semantics.element); | |
2781 registry.registerGetOfStaticFunction(semantics.element); | |
2782 break; | 2794 break; |
2783 case AccessKind.STATIC_FIELD: | 2795 case AccessKind.STATIC_FIELD: |
2784 case AccessKind.FINAL_STATIC_FIELD: | 2796 case AccessKind.FINAL_STATIC_FIELD: |
2785 case AccessKind.STATIC_GETTER: | 2797 case AccessKind.STATIC_GETTER: |
2786 case AccessKind.TOPLEVEL_FIELD: | 2798 case AccessKind.TOPLEVEL_FIELD: |
2787 case AccessKind.FINAL_TOPLEVEL_FIELD: | 2799 case AccessKind.FINAL_TOPLEVEL_FIELD: |
2788 case AccessKind.TOPLEVEL_GETTER: | 2800 case AccessKind.TOPLEVEL_GETTER: |
2789 registry.registerStaticUse(semantics.element); | 2801 registry.registerStaticUse( |
| 2802 new StaticUse.staticGet(semantics.element)); |
2790 break; | 2803 break; |
2791 case AccessKind.STATIC_SETTER: | 2804 case AccessKind.STATIC_SETTER: |
2792 case AccessKind.TOPLEVEL_SETTER: | 2805 case AccessKind.TOPLEVEL_SETTER: |
2793 case AccessKind.UNRESOLVED: | 2806 case AccessKind.UNRESOLVED: |
2794 registry.registerThrowNoSuchMethod(); | 2807 registry.registerThrowNoSuchMethod(); |
2795 member = reportAndCreateErroneousElement( | 2808 member = reportAndCreateErroneousElement( |
2796 node.selector, name.text, | 2809 node.selector, name.text, |
2797 MessageKind.CANNOT_RESOLVE_GETTER, const {}); | 2810 MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
2798 break; | 2811 break; |
2799 default: | 2812 default: |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2838 ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_SETTER | 2851 ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_SETTER |
2839 : CompoundAccessKind.UNRESOLVED_STATIC_SETTER, | 2852 : CompoundAccessKind.UNRESOLVED_STATIC_SETTER, |
2840 abstractField.getter, | 2853 abstractField.getter, |
2841 error); | 2854 error); |
2842 } else { | 2855 } else { |
2843 // `a = b` where `a` has no setter. | 2856 // `a = b` where `a` has no setter. |
2844 semantics = element.isTopLevel | 2857 semantics = element.isTopLevel |
2845 ? new StaticAccess.topLevelGetter(abstractField.getter) | 2858 ? new StaticAccess.topLevelGetter(abstractField.getter) |
2846 : new StaticAccess.staticGetter(abstractField.getter); | 2859 : new StaticAccess.staticGetter(abstractField.getter); |
2847 } | 2860 } |
2848 registry.registerStaticUse(abstractField.getter); | 2861 registry.registerStaticUse( |
| 2862 new StaticUse.staticGet(abstractField.getter)); |
2849 } else if (node.isComplex) { | 2863 } else if (node.isComplex) { |
2850 if (abstractField.getter == null) { | 2864 if (abstractField.getter == null) { |
2851 ErroneousElement error = reportAndCreateErroneousElement( | 2865 ErroneousElement error = reportAndCreateErroneousElement( |
2852 node.selector, name.text, | 2866 node.selector, name.text, |
2853 MessageKind.CANNOT_RESOLVE_GETTER, const {}); | 2867 MessageKind.CANNOT_RESOLVE_GETTER, const {}); |
2854 registry.registerThrowNoSuchMethod(); | 2868 registry.registerThrowNoSuchMethod(); |
2855 // `a++` or `a += b` where `a` has no getter. | 2869 // `a++` or `a += b` where `a` has no getter. |
2856 semantics = new CompoundAccessSemantics( | 2870 semantics = new CompoundAccessSemantics( |
2857 element.isTopLevel | 2871 element.isTopLevel |
2858 ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_GETTER | 2872 ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_GETTER |
2859 : CompoundAccessKind.UNRESOLVED_STATIC_GETTER, | 2873 : CompoundAccessKind.UNRESOLVED_STATIC_GETTER, |
2860 error, | 2874 error, |
2861 abstractField.setter); | 2875 abstractField.setter); |
2862 registry.registerStaticUse(abstractField.setter); | 2876 registry.registerStaticUse( |
| 2877 new StaticUse.staticSet(abstractField.setter)); |
2863 } else { | 2878 } else { |
2864 // `a++` or `a += b` where `a` has both a getter and a setter. | 2879 // `a++` or `a += b` where `a` has both a getter and a setter. |
2865 semantics = new CompoundAccessSemantics( | 2880 semantics = new CompoundAccessSemantics( |
2866 element.isTopLevel | 2881 element.isTopLevel |
2867 ? CompoundAccessKind.TOPLEVEL_GETTER_SETTER | 2882 ? CompoundAccessKind.TOPLEVEL_GETTER_SETTER |
2868 : CompoundAccessKind.STATIC_GETTER_SETTER, | 2883 : CompoundAccessKind.STATIC_GETTER_SETTER, |
2869 abstractField.getter, | 2884 abstractField.getter, |
2870 abstractField.setter); | 2885 abstractField.setter); |
2871 registry.registerStaticUse(abstractField.getter); | 2886 registry.registerStaticUse( |
2872 registry.registerStaticUse(abstractField.setter); | 2887 new StaticUse.staticGet(abstractField.getter)); |
| 2888 registry.registerStaticUse( |
| 2889 new StaticUse.staticSet(abstractField.setter)); |
2873 } | 2890 } |
2874 } else { | 2891 } else { |
2875 // `a = b` where `a` has a setter. | 2892 // `a = b` where `a` has a setter. |
2876 semantics = element.isTopLevel | 2893 semantics = element.isTopLevel |
2877 ? new StaticAccess.topLevelSetter(abstractField.setter) | 2894 ? new StaticAccess.topLevelSetter(abstractField.setter) |
2878 : new StaticAccess.staticSetter(abstractField.setter); | 2895 : new StaticAccess.staticSetter(abstractField.setter); |
2879 registry.registerStaticUse(abstractField.setter); | 2896 registry.registerStaticUse( |
| 2897 new StaticUse.staticSet(abstractField.setter)); |
2880 } | 2898 } |
2881 } else { | 2899 } else { |
2882 MemberElement member = element; | 2900 MemberElement member = element; |
2883 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery | 2901 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery |
2884 // of parse errors to make [element] erroneous. Fix this! | 2902 // of parse errors to make [element] erroneous. Fix this! |
2885 member.computeType(resolution); | 2903 member.computeType(resolution); |
2886 registry.registerStaticUse(member); | |
2887 if (member.isMalformed) { | 2904 if (member.isMalformed) { |
2888 // [member] has parse errors. | 2905 // [member] has parse errors. |
2889 semantics = new StaticAccess.unresolved(member); | 2906 semantics = new StaticAccess.unresolved(member); |
2890 } else if (member.isFunction) { | 2907 } else if (member.isFunction) { |
2891 // `a = b`, `a++` or `a += b` where `a` is a function. | 2908 // `a = b`, `a++` or `a += b` where `a` is a function. |
2892 ErroneousElement error = reportAndCreateErroneousElement( | 2909 ErroneousElement error = reportAndCreateErroneousElement( |
2893 node.selector, name.text, | 2910 node.selector, name.text, |
2894 MessageKind.ASSIGNING_METHOD, const {}); | 2911 MessageKind.ASSIGNING_METHOD, const {}); |
2895 registry.registerThrowNoSuchMethod(); | 2912 registry.registerThrowNoSuchMethod(); |
2896 if (node.isComplex) { | 2913 if (node.isComplex) { |
2897 // `a++` or `a += b` where `a` is a function. | 2914 // `a++` or `a += b` where `a` is a function. |
2898 registry.registerGetOfStaticFunction(element); | 2915 registry.registerStaticUse( |
| 2916 new StaticUse.staticTearOff(element)); |
2899 } | 2917 } |
2900 semantics = member.isTopLevel | 2918 semantics = member.isTopLevel |
2901 ? new StaticAccess.topLevelMethod(member) | 2919 ? new StaticAccess.topLevelMethod(member) |
2902 : new StaticAccess.staticMethod(member); | 2920 : new StaticAccess.staticMethod(member); |
2903 } else { | 2921 } else { |
2904 // `a = b`, `a++` or `a += b` where `a` is a field. | 2922 // `a = b`, `a++` or `a += b` where `a` is a field. |
2905 assert(invariant(node, member.isField, | 2923 assert(invariant(node, member.isField, |
2906 message: "Unexpected element: $member.")); | 2924 message: "Unexpected element: $member.")); |
| 2925 if (node.isComplex) { |
| 2926 // `a++` or `a += b` where `a` is a field. |
| 2927 registry.registerStaticUse(new StaticUse.staticGet(member)); |
| 2928 } |
2907 if (member.isFinal || member.isConst) { | 2929 if (member.isFinal || member.isConst) { |
2908 ErroneousElement error = reportAndCreateErroneousElement( | 2930 ErroneousElement error = reportAndCreateErroneousElement( |
2909 node.selector, name.text, | 2931 node.selector, name.text, |
2910 MessageKind.CANNOT_RESOLVE_SETTER, const {}); | 2932 MessageKind.CANNOT_RESOLVE_SETTER, const {}); |
2911 registry.registerThrowNoSuchMethod(); | 2933 registry.registerThrowNoSuchMethod(); |
2912 semantics = member.isTopLevel | 2934 semantics = member.isTopLevel |
2913 ? new StaticAccess.finalTopLevelField(member) | 2935 ? new StaticAccess.finalTopLevelField(member) |
2914 : new StaticAccess.finalStaticField(member); | 2936 : new StaticAccess.finalStaticField(member); |
2915 } else { | 2937 } else { |
| 2938 registry.registerStaticUse(new StaticUse.staticSet(member)); |
2916 semantics = member.isTopLevel | 2939 semantics = member.isTopLevel |
2917 ? new StaticAccess.topLevelField(member) | 2940 ? new StaticAccess.topLevelField(member) |
2918 : new StaticAccess.staticField(member); | 2941 : new StaticAccess.staticField(member); |
2919 } | 2942 } |
2920 } | 2943 } |
2921 } | 2944 } |
2922 return handleUpdate(node, name, semantics); | 2945 return handleUpdate(node, name, semantics); |
2923 } | 2946 } |
2924 | 2947 |
2925 /// Handle access to resolved [element]. | 2948 /// Handle access to resolved [element]. |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3114 Selector setterSelector = new Selector.indexSet(); | 3137 Selector setterSelector = new Selector.indexSet(); |
3115 Selector operatorSelector = | 3138 Selector operatorSelector = |
3116 new Selector.binaryOperator(operator.selectorName); | 3139 new Selector.binaryOperator(operator.selectorName); |
3117 | 3140 |
3118 // TODO(23998): Remove these when selectors are only accessed | 3141 // TODO(23998): Remove these when selectors are only accessed |
3119 // through the send structure. | 3142 // through the send structure. |
3120 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3143 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3121 registry.setSelector(node, setterSelector); | 3144 registry.setSelector(node, setterSelector); |
3122 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3145 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3123 | 3146 |
3124 registry.registerDynamicInvocation( | 3147 registry.registerDynamicUse( |
3125 new UniverseSelector(getterSelector, null)); | 3148 new UniverseSelector(getterSelector, null)); |
3126 registry.registerDynamicInvocation( | 3149 registry.registerDynamicUse( |
3127 new UniverseSelector(setterSelector, null)); | 3150 new UniverseSelector(setterSelector, null)); |
3128 registry.registerDynamicInvocation( | 3151 registry.registerDynamicUse( |
3129 new UniverseSelector(operatorSelector, null)); | 3152 new UniverseSelector(operatorSelector, null)); |
3130 | 3153 |
3131 SendStructure sendStructure = node.isPrefix | 3154 SendStructure sendStructure = node.isPrefix |
3132 ? new IndexPrefixStructure(semantics, operator) | 3155 ? new IndexPrefixStructure(semantics, operator) |
3133 : new IndexPostfixStructure(semantics, operator); | 3156 : new IndexPostfixStructure(semantics, operator); |
3134 registry.registerSendStructure(node, sendStructure); | 3157 registry.registerSendStructure(node, sendStructure); |
3135 return const NoneResult(); | 3158 return const NoneResult(); |
3136 } else { | 3159 } else { |
3137 Node rhs = node.arguments.tail.head; | 3160 Node rhs = node.arguments.tail.head; |
3138 visitExpression(rhs); | 3161 visitExpression(rhs); |
3139 | 3162 |
3140 AssignmentOperator operator = AssignmentOperator.parse(operatorText); | 3163 AssignmentOperator operator = AssignmentOperator.parse(operatorText); |
3141 if (operator.kind == AssignmentOperatorKind.ASSIGN) { | 3164 if (operator.kind == AssignmentOperatorKind.ASSIGN) { |
3142 // `a[b] = c`. | 3165 // `a[b] = c`. |
3143 Selector setterSelector = new Selector.indexSet(); | 3166 Selector setterSelector = new Selector.indexSet(); |
3144 | 3167 |
3145 // TODO(23998): Remove this when selectors are only accessed | 3168 // TODO(23998): Remove this when selectors are only accessed |
3146 // through the send structure. | 3169 // through the send structure. |
3147 registry.setSelector(node, setterSelector); | 3170 registry.setSelector(node, setterSelector); |
3148 registry.registerDynamicInvocation( | 3171 registry.registerDynamicUse( |
3149 new UniverseSelector(setterSelector, null)); | 3172 new UniverseSelector(setterSelector, null)); |
3150 | 3173 |
3151 SendStructure sendStructure = new IndexSetStructure(semantics); | 3174 SendStructure sendStructure = new IndexSetStructure(semantics); |
3152 registry.registerSendStructure(node, sendStructure); | 3175 registry.registerSendStructure(node, sendStructure); |
3153 return const NoneResult(); | 3176 return const NoneResult(); |
3154 } else { | 3177 } else { |
3155 // `a[b] += c`. | 3178 // `a[b] += c`. |
3156 Selector getterSelector = new Selector.index(); | 3179 Selector getterSelector = new Selector.index(); |
3157 Selector setterSelector = new Selector.indexSet(); | 3180 Selector setterSelector = new Selector.indexSet(); |
3158 Selector operatorSelector = | 3181 Selector operatorSelector = |
3159 new Selector.binaryOperator(operator.selectorName); | 3182 new Selector.binaryOperator(operator.selectorName); |
3160 | 3183 |
3161 // TODO(23998): Remove these when selectors are only accessed | 3184 // TODO(23998): Remove these when selectors are only accessed |
3162 // through the send structure. | 3185 // through the send structure. |
3163 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3186 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3164 registry.setSelector(node, setterSelector); | 3187 registry.setSelector(node, setterSelector); |
3165 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3188 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3166 | 3189 |
3167 registry.registerDynamicInvocation( | 3190 registry.registerDynamicUse( |
3168 new UniverseSelector(getterSelector, null)); | 3191 new UniverseSelector(getterSelector, null)); |
3169 registry.registerDynamicInvocation( | 3192 registry.registerDynamicUse( |
3170 new UniverseSelector(setterSelector, null)); | 3193 new UniverseSelector(setterSelector, null)); |
3171 registry.registerDynamicInvocation( | 3194 registry.registerDynamicUse( |
3172 new UniverseSelector(operatorSelector, null)); | 3195 new UniverseSelector(operatorSelector, null)); |
3173 | 3196 |
3174 SendStructure sendStructure = | 3197 SendStructure sendStructure = |
3175 new CompoundIndexSetStructure(semantics, operator); | 3198 new CompoundIndexSetStructure(semantics, operator); |
3176 registry.registerSendStructure(node, sendStructure); | 3199 registry.registerSendStructure(node, sendStructure); |
3177 return const NoneResult(); | 3200 return const NoneResult(); |
3178 } | 3201 } |
3179 } | 3202 } |
3180 } | 3203 } |
3181 | 3204 |
3182 /// Handle super index operations like `super[a] = b`, `super[a] += b`, and | 3205 /// Handle super index operations like `super[a] = b`, `super[a] += b`, and |
3183 /// `super[a]++`. | 3206 /// `super[a]++`. |
3184 // TODO(johnniwinther): Share code with [handleIndexSendSet]. | 3207 // TODO(johnniwinther): Share code with [handleIndexSendSet]. |
3185 ResolutionResult handleSuperIndexSendSet(SendSet node) { | 3208 ResolutionResult handleSuperIndexSendSet(SendSet node) { |
3186 String operatorText = node.assignmentOperator.source; | 3209 String operatorText = node.assignmentOperator.source; |
3187 Node index = node.arguments.head; | 3210 Node index = node.arguments.head; |
3188 visitExpression(index); | 3211 visitExpression(index); |
| 3212 |
3189 AccessSemantics semantics = checkSuperAccess(node); | 3213 AccessSemantics semantics = checkSuperAccess(node); |
3190 if (node.isPrefix || node.isPostfix) { | 3214 if (node.isPrefix || node.isPostfix) { |
3191 // `super[a]++` or `++super[a]`. | 3215 // `super[a]++` or `++super[a]`. |
3192 IncDecOperator operator = IncDecOperator.parse(operatorText); | 3216 IncDecOperator operator = IncDecOperator.parse(operatorText); |
3193 Selector getterSelector = new Selector.index(); | 3217 Selector getterSelector = new Selector.index(); |
3194 Selector setterSelector = new Selector.indexSet(); | 3218 Selector setterSelector = new Selector.indexSet(); |
3195 Selector operatorSelector = | 3219 Selector operatorSelector = |
3196 new Selector.binaryOperator(operator.selectorName); | 3220 new Selector.binaryOperator(operator.selectorName); |
3197 | 3221 |
3198 // TODO(23998): Remove these when selectors are only accessed | 3222 // TODO(23998): Remove these when selectors are only accessed |
3199 // through the send structure. | 3223 // through the send structure. |
3200 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3224 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3201 registry.setSelector(node, setterSelector); | 3225 registry.setSelector(node, setterSelector); |
3202 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3226 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3203 | 3227 |
3204 if (semantics == null) { | 3228 if (semantics == null) { |
3205 semantics = computeSuperAccessSemanticsForSelectors( | 3229 semantics = computeSuperAccessSemanticsForSelectors( |
3206 node, getterSelector, setterSelector, isIndex: true); | 3230 node, getterSelector, setterSelector, isIndex: true); |
3207 | 3231 |
3208 registry.registerStaticInvocation(semantics.getter); | 3232 if (!semantics.getter.isError) { |
3209 registry.registerStaticInvocation(semantics.setter); | 3233 registry.registerStaticUse( |
| 3234 new StaticUse.superInvoke( |
| 3235 semantics.getter, getterSelector.callStructure)); |
| 3236 } |
| 3237 if (!semantics.setter.isError) { |
| 3238 registry.registerStaticUse( |
| 3239 new StaticUse.superInvoke( |
| 3240 semantics.setter, setterSelector.callStructure)); |
| 3241 } |
3210 | 3242 |
3211 // TODO(23998): Remove these when elements are only accessed | 3243 // TODO(23998): Remove these when elements are only accessed |
3212 // through the send structure. | 3244 // through the send structure. |
3213 registry.useElement(node, semantics.setter); | 3245 registry.useElement(node, semantics.setter); |
3214 registry.useElement(node.selector, semantics.getter); | 3246 registry.useElement(node.selector, semantics.getter); |
3215 } | 3247 } |
3216 registry.registerDynamicInvocation( | 3248 registry.registerDynamicUse( |
3217 new UniverseSelector(operatorSelector, null)); | 3249 new UniverseSelector(operatorSelector, null)); |
3218 | 3250 |
3219 SendStructure sendStructure = node.isPrefix | 3251 SendStructure sendStructure = node.isPrefix |
3220 ? new IndexPrefixStructure(semantics, operator) | 3252 ? new IndexPrefixStructure(semantics, operator) |
3221 : new IndexPostfixStructure(semantics, operator); | 3253 : new IndexPostfixStructure(semantics, operator); |
3222 registry.registerSendStructure(node, sendStructure); | 3254 registry.registerSendStructure(node, sendStructure); |
3223 return const NoneResult(); | 3255 return const NoneResult(); |
3224 } else { | 3256 } else { |
3225 Node rhs = node.arguments.tail.head; | 3257 Node rhs = node.arguments.tail.head; |
3226 visitExpression(rhs); | 3258 visitExpression(rhs); |
3227 | 3259 |
3228 AssignmentOperator operator = AssignmentOperator.parse(operatorText); | 3260 AssignmentOperator operator = AssignmentOperator.parse(operatorText); |
3229 if (operator.kind == AssignmentOperatorKind.ASSIGN) { | 3261 if (operator.kind == AssignmentOperatorKind.ASSIGN) { |
3230 // `super[a] = b`. | 3262 // `super[a] = b`. |
3231 Selector setterSelector = new Selector.indexSet(); | 3263 Selector setterSelector = new Selector.indexSet(); |
3232 if (semantics == null) { | 3264 if (semantics == null) { |
3233 semantics = | 3265 semantics = |
3234 computeSuperAccessSemanticsForSelector(node, setterSelector); | 3266 computeSuperAccessSemanticsForSelector(node, setterSelector); |
3235 | 3267 |
3236 // TODO(23998): Remove these when elements are only accessed | 3268 // TODO(23998): Remove these when elements are only accessed |
3237 // through the send structure. | 3269 // through the send structure. |
3238 registry.useElement(node, semantics.setter); | 3270 registry.useElement(node, semantics.setter); |
3239 } | 3271 } |
3240 | 3272 |
3241 // TODO(23998): Remove this when selectors are only accessed | 3273 // TODO(23998): Remove this when selectors are only accessed |
3242 // through the send structure. | 3274 // through the send structure. |
3243 registry.setSelector(node, setterSelector); | 3275 registry.setSelector(node, setterSelector); |
3244 registry.registerStaticInvocation(semantics.setter); | 3276 if (!semantics.setter.isError) { |
| 3277 registry.registerStaticUse( |
| 3278 new StaticUse.superInvoke( |
| 3279 semantics.setter, setterSelector.callStructure)); |
| 3280 } |
3245 | 3281 |
3246 SendStructure sendStructure = new IndexSetStructure(semantics); | 3282 SendStructure sendStructure = new IndexSetStructure(semantics); |
3247 registry.registerSendStructure(node, sendStructure); | 3283 registry.registerSendStructure(node, sendStructure); |
3248 return const NoneResult(); | 3284 return const NoneResult(); |
3249 } else { | 3285 } else { |
3250 // `super[a] += b`. | 3286 // `super[a] += b`. |
3251 Selector getterSelector = new Selector.index(); | 3287 Selector getterSelector = new Selector.index(); |
3252 Selector setterSelector = new Selector.indexSet(); | 3288 Selector setterSelector = new Selector.indexSet(); |
3253 Selector operatorSelector = | 3289 Selector operatorSelector = |
3254 new Selector.binaryOperator(operator.selectorName); | 3290 new Selector.binaryOperator(operator.selectorName); |
3255 if (semantics == null) { | 3291 if (semantics == null) { |
3256 semantics = computeSuperAccessSemanticsForSelectors( | 3292 semantics = computeSuperAccessSemanticsForSelectors( |
3257 node, getterSelector, setterSelector, isIndex: true); | 3293 node, getterSelector, setterSelector, isIndex: true); |
3258 | 3294 |
3259 registry.registerStaticInvocation(semantics.getter); | 3295 if (!semantics.getter.isError) { |
3260 registry.registerStaticInvocation(semantics.setter); | 3296 registry.registerStaticUse( |
| 3297 new StaticUse.superInvoke( |
| 3298 semantics.getter, getterSelector.callStructure)); |
| 3299 } |
| 3300 if (!semantics.setter.isError) { |
| 3301 registry.registerStaticUse( |
| 3302 new StaticUse.superInvoke( |
| 3303 semantics.setter, setterSelector.callStructure)); |
| 3304 } |
3261 | 3305 |
3262 // TODO(23998): Remove these when elements are only accessed | 3306 // TODO(23998): Remove these when elements are only accessed |
3263 // through the send structure. | 3307 // through the send structure. |
3264 registry.useElement(node, semantics.setter); | 3308 registry.useElement(node, semantics.setter); |
3265 registry.useElement(node.selector, semantics.getter); | 3309 registry.useElement(node.selector, semantics.getter); |
3266 } | 3310 } |
3267 | 3311 |
3268 // TODO(23998): Remove these when selectors are only accessed | 3312 // TODO(23998): Remove these when selectors are only accessed |
3269 // through the send structure. | 3313 // through the send structure. |
3270 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3314 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3271 registry.setSelector(node, setterSelector); | 3315 registry.setSelector(node, setterSelector); |
3272 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3316 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3273 | 3317 |
3274 registry.registerDynamicInvocation( | 3318 registry.registerDynamicUse( |
3275 new UniverseSelector(operatorSelector, null)); | 3319 new UniverseSelector(operatorSelector, null)); |
3276 | 3320 |
3277 SendStructure sendStructure = | 3321 SendStructure sendStructure = |
3278 new CompoundIndexSetStructure(semantics, operator); | 3322 new CompoundIndexSetStructure(semantics, operator); |
3279 registry.registerSendStructure(node, sendStructure); | 3323 registry.registerSendStructure(node, sendStructure); |
3280 return const NoneResult(); | 3324 return const NoneResult(); |
3281 } | 3325 } |
3282 } | 3326 } |
3283 } | 3327 } |
3284 | 3328 |
3285 /// Handle super index operations like `super.a = b`, `super.a += b`, and | 3329 /// Handle super index operations like `super.a = b`, `super.a += b`, and |
3286 /// `super.a++`. | 3330 /// `super.a++`. |
3287 // TODO(johnniwinther): Share code with [handleSuperIndexSendSet]. | 3331 // TODO(johnniwinther): Share code with [handleSuperIndexSendSet]. |
3288 ResolutionResult handleSuperSendSet(SendSet node) { | 3332 ResolutionResult handleSuperSendSet(SendSet node) { |
3289 Identifier selector = node.selector.asIdentifier(); | 3333 Identifier selector = node.selector.asIdentifier(); |
3290 String text = selector.source; | 3334 String text = selector.source; |
3291 Name name = new Name(text, enclosingElement.library); | 3335 Name name = new Name(text, enclosingElement.library); |
3292 String operatorText = node.assignmentOperator.source; | 3336 String operatorText = node.assignmentOperator.source; |
3293 Selector getterSelector = new Selector.getter(name); | 3337 Selector getterSelector = new Selector.getter(name); |
3294 Selector setterSelector = new Selector.setter(name); | 3338 Selector setterSelector = new Selector.setter(name); |
| 3339 |
| 3340 void registerStaticUses(AccessSemantics semantics) { |
| 3341 switch (semantics.kind) { |
| 3342 case AccessKind.SUPER_METHOD: |
| 3343 registry.registerStaticUse( |
| 3344 new StaticUse.superTearOff(semantics.element)); |
| 3345 break; |
| 3346 case AccessKind.SUPER_GETTER: |
| 3347 registry.registerStaticUse(new StaticUse.superGet(semantics.getter)); |
| 3348 break; |
| 3349 case AccessKind.SUPER_SETTER: |
| 3350 registry.registerStaticUse(new StaticUse.superSet(semantics.setter)); |
| 3351 break; |
| 3352 case AccessKind.SUPER_FIELD: |
| 3353 registry.registerStaticUse( |
| 3354 new StaticUse.superGet(semantics.element)); |
| 3355 registry.registerStaticUse( |
| 3356 new StaticUse.superSet(semantics.element)); |
| 3357 break; |
| 3358 case AccessKind.SUPER_FINAL_FIELD: |
| 3359 registry.registerStaticUse( |
| 3360 new StaticUse.superGet(semantics.element)); |
| 3361 break; |
| 3362 case AccessKind.COMPOUND: |
| 3363 CompoundAccessSemantics compoundSemantics = semantics; |
| 3364 switch (compoundSemantics.compoundAccessKind) { |
| 3365 case CompoundAccessKind.SUPER_GETTER_SETTER: |
| 3366 case CompoundAccessKind.SUPER_GETTER_FIELD: |
| 3367 case CompoundAccessKind.SUPER_FIELD_SETTER: |
| 3368 case CompoundAccessKind.SUPER_FIELD_FIELD: |
| 3369 registry.registerStaticUse( |
| 3370 new StaticUse.superGet(semantics.getter)); |
| 3371 registry.registerStaticUse( |
| 3372 new StaticUse.superSet(semantics.setter)); |
| 3373 break; |
| 3374 case CompoundAccessKind.SUPER_METHOD_SETTER: |
| 3375 registry.registerStaticUse( |
| 3376 new StaticUse.superSet(semantics.setter)); |
| 3377 break; |
| 3378 case CompoundAccessKind.UNRESOLVED_SUPER_GETTER: |
| 3379 registry.registerStaticUse( |
| 3380 new StaticUse.superSet(semantics.setter)); |
| 3381 break; |
| 3382 case CompoundAccessKind.UNRESOLVED_SUPER_SETTER: |
| 3383 registry.registerStaticUse( |
| 3384 new StaticUse.superGet(semantics.getter)); |
| 3385 break; |
| 3386 default: |
| 3387 break; |
| 3388 } |
| 3389 break; |
| 3390 default: |
| 3391 break; |
| 3392 } |
| 3393 } |
| 3394 |
3295 AccessSemantics semantics = checkSuperAccess(node); | 3395 AccessSemantics semantics = checkSuperAccess(node); |
3296 if (node.isPrefix || node.isPostfix) { | 3396 if (node.isPrefix || node.isPostfix) { |
3297 // `super.a++` or `++super.a`. | 3397 // `super.a++` or `++super.a`. |
3298 if (semantics == null) { | 3398 if (semantics == null) { |
3299 semantics = computeSuperAccessSemanticsForSelectors( | 3399 semantics = computeSuperAccessSemanticsForSelectors( |
3300 node, getterSelector, setterSelector); | 3400 node, getterSelector, setterSelector); |
3301 registry.registerStaticInvocation(semantics.getter); | 3401 registerStaticUses(semantics); |
3302 registry.registerStaticInvocation(semantics.setter); | |
3303 } | 3402 } |
3304 return handleUpdate(node, name, semantics); | 3403 return handleUpdate(node, name, semantics); |
3305 } else { | 3404 } else { |
3306 AssignmentOperator operator = AssignmentOperator.parse(operatorText); | 3405 AssignmentOperator operator = AssignmentOperator.parse(operatorText); |
3307 if (operator.kind == AssignmentOperatorKind.ASSIGN) { | 3406 if (operator.kind == AssignmentOperatorKind.ASSIGN) { |
3308 // `super.a = b`. | 3407 // `super.a = b`. |
3309 if (semantics == null) { | 3408 if (semantics == null) { |
3310 semantics = | 3409 semantics = |
3311 computeSuperAccessSemanticsForSelector( | 3410 computeSuperAccessSemanticsForSelector( |
3312 node, setterSelector, alternateName: name); | 3411 node, setterSelector, alternateName: name); |
3313 registry.registerStaticInvocation(semantics.setter); | |
3314 switch (semantics.kind) { | 3412 switch (semantics.kind) { |
3315 case AccessKind.SUPER_FINAL_FIELD: | 3413 case AccessKind.SUPER_FINAL_FIELD: |
3316 reporter.reportWarningMessage( | 3414 reporter.reportWarningMessage( |
3317 node, | 3415 node, |
3318 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, | 3416 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, |
3319 {'name': name, | 3417 {'name': name, |
3320 'superclassName': semantics.setter.enclosingClass.name}); | 3418 'superclassName': semantics.setter.enclosingClass.name}); |
3321 // TODO(johnniwinther): This shouldn't be needed. | 3419 // TODO(johnniwinther): This shouldn't be needed. |
3322 registry.registerDynamicInvocation( | 3420 registry.registerDynamicUse( |
3323 new UniverseSelector(setterSelector, null)); | 3421 new UniverseSelector(setterSelector, null)); |
3324 registry.registerSuperNoSuchMethod(); | 3422 registry.registerSuperNoSuchMethod(); |
3325 break; | 3423 break; |
3326 case AccessKind.SUPER_METHOD: | 3424 case AccessKind.SUPER_METHOD: |
3327 reporter.reportWarningMessage( | 3425 reporter.reportWarningMessage( |
3328 node, MessageKind.ASSIGNING_METHOD_IN_SUPER, | 3426 node, MessageKind.ASSIGNING_METHOD_IN_SUPER, |
3329 {'name': name, | 3427 {'name': name, |
3330 'superclassName': semantics.setter.enclosingClass.name}); | 3428 'superclassName': semantics.setter.enclosingClass.name}); |
3331 // TODO(johnniwinther): This shouldn't be needed. | 3429 // TODO(johnniwinther): This shouldn't be needed. |
3332 registry.registerDynamicInvocation( | 3430 registry.registerDynamicUse( |
3333 new UniverseSelector(setterSelector, null)); | 3431 new UniverseSelector(setterSelector, null)); |
3334 registry.registerSuperNoSuchMethod(); | 3432 registry.registerSuperNoSuchMethod(); |
3335 break; | 3433 break; |
| 3434 case AccessKind.SUPER_FIELD: |
| 3435 case AccessKind.SUPER_SETTER: |
| 3436 registry.registerStaticUse( |
| 3437 new StaticUse.superSet(semantics.setter)); |
| 3438 break; |
3336 default: | 3439 default: |
3337 registry.registerStaticInvocation(semantics.setter); | |
3338 break; | 3440 break; |
3339 } | 3441 } |
3340 } | 3442 } |
3341 return handleUpdate(node, name, semantics); | 3443 return handleUpdate(node, name, semantics); |
3342 } else { | 3444 } else { |
3343 // `super.a += b`. | 3445 // `super.a += b`. |
3344 if (semantics == null) { | 3446 if (semantics == null) { |
3345 semantics = computeSuperAccessSemanticsForSelectors( | 3447 semantics = computeSuperAccessSemanticsForSelectors( |
3346 node, getterSelector, setterSelector); | 3448 node, getterSelector, setterSelector); |
3347 registry.registerStaticInvocation(semantics.getter); | 3449 registerStaticUses(semantics); |
3348 registry.registerStaticInvocation(semantics.setter); | |
3349 } | 3450 } |
3350 return handleUpdate(node, name, semantics); | 3451 return handleUpdate(node, name, semantics); |
3351 } | 3452 } |
3352 } | 3453 } |
3353 } | 3454 } |
3354 | 3455 |
3355 /// Handle update of an entity defined by [semantics]. For instance `a = b`, | 3456 /// Handle update of an entity defined by [semantics]. For instance `a = b`, |
3356 /// `a++` or `a += b` where [semantics] describe `a`. | 3457 /// `a++` or `a += b` where [semantics] describe `a`. |
3357 ResolutionResult handleUpdate( | 3458 ResolutionResult handleUpdate( |
3358 SendSet node, | 3459 SendSet node, |
(...skipping 13 matching lines...) Expand all Loading... |
3372 // through the send structure. | 3473 // through the send structure. |
3373 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3474 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3374 registry.setSelector(node, setterSelector); | 3475 registry.setSelector(node, setterSelector); |
3375 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3476 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3376 | 3477 |
3377 // TODO(23998): Remove these when elements are only accessed | 3478 // TODO(23998): Remove these when elements are only accessed |
3378 // through the send structure. | 3479 // through the send structure. |
3379 registry.useElement(node, semantics.setter); | 3480 registry.useElement(node, semantics.setter); |
3380 registry.useElement(node.selector, semantics.getter); | 3481 registry.useElement(node.selector, semantics.getter); |
3381 | 3482 |
3382 registry.registerDynamicInvocation( | 3483 registry.registerDynamicUse( |
3383 new UniverseSelector(operatorSelector, null)); | 3484 new UniverseSelector(operatorSelector, null)); |
3384 | 3485 |
3385 SendStructure sendStructure = node.isPrefix | 3486 SendStructure sendStructure = node.isPrefix |
3386 ? new PrefixStructure(semantics, operator) | 3487 ? new PrefixStructure(semantics, operator) |
3387 : new PostfixStructure(semantics, operator); | 3488 : new PostfixStructure(semantics, operator); |
3388 registry.registerSendStructure(node, sendStructure); | 3489 registry.registerSendStructure(node, sendStructure); |
3389 registry.registerIncDecOperation(); | 3490 registry.registerIncDecOperation(); |
3390 } else { | 3491 } else { |
3391 Node rhs = node.arguments.head; | 3492 Node rhs = node.arguments.head; |
3392 visitExpression(rhs); | 3493 visitExpression(rhs); |
(...skipping 21 matching lines...) Expand all Loading... |
3414 // through the send structure. | 3515 // through the send structure. |
3415 registry.useElement(node, semantics.setter); | 3516 registry.useElement(node, semantics.setter); |
3416 registry.useElement(node.selector, semantics.getter); | 3517 registry.useElement(node.selector, semantics.getter); |
3417 | 3518 |
3418 // TODO(23998): Remove these when selectors are only accessed | 3519 // TODO(23998): Remove these when selectors are only accessed |
3419 // through the send structure. | 3520 // through the send structure. |
3420 registry.setGetterSelectorInComplexSendSet(node, getterSelector); | 3521 registry.setGetterSelectorInComplexSendSet(node, getterSelector); |
3421 registry.setSelector(node, setterSelector); | 3522 registry.setSelector(node, setterSelector); |
3422 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); | 3523 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); |
3423 | 3524 |
3424 registry.registerDynamicInvocation( | 3525 registry.registerDynamicUse( |
3425 new UniverseSelector(operatorSelector, null)); | 3526 new UniverseSelector(operatorSelector, null)); |
3426 | 3527 |
3427 SendStructure sendStructure; | 3528 SendStructure sendStructure; |
3428 if (operator.kind == AssignmentOperatorKind.IF_NULL) { | 3529 if (operator.kind == AssignmentOperatorKind.IF_NULL) { |
3429 sendStructure = new SetIfNullStructure(semantics); | 3530 sendStructure = new SetIfNullStructure(semantics); |
3430 } else { | 3531 } else { |
3431 sendStructure = new CompoundStructure(semantics, operator); | 3532 sendStructure = new CompoundStructure(semantics, operator); |
3432 } | 3533 } |
3433 registry.registerSendStructure(node, sendStructure); | 3534 registry.registerSendStructure(node, sendStructure); |
3434 } | 3535 } |
(...skipping 15 matching lines...) Expand all Loading... |
3450 return handleSuperSendSet(node); | 3551 return handleSuperSendSet(node); |
3451 } else if (node.receiver == null) { | 3552 } else if (node.receiver == null) { |
3452 // `a = c` | 3553 // `a = c` |
3453 return handleUnqualifiedSendSet(node); | 3554 return handleUnqualifiedSendSet(node); |
3454 } else { | 3555 } else { |
3455 // `a.b = c` | 3556 // `a.b = c` |
3456 return handleQualifiedSendSet(node); | 3557 return handleQualifiedSendSet(node); |
3457 } | 3558 } |
3458 } | 3559 } |
3459 | 3560 |
3460 void registerSend(Selector selector, Element target) { | |
3461 if (target == null || target.isInstanceMember) { | |
3462 if (selector.isGetter) { | |
3463 registry.registerDynamicGetter( | |
3464 new UniverseSelector(selector, null)); | |
3465 } else if (selector.isSetter) { | |
3466 registry.registerDynamicSetter( | |
3467 new UniverseSelector(selector, null)); | |
3468 } else { | |
3469 registry.registerDynamicInvocation( | |
3470 new UniverseSelector(selector, null)); | |
3471 } | |
3472 } else if (Elements.isStaticOrTopLevel(target)) { | |
3473 // Avoid registration of type variables since they are not analyzable but | |
3474 // instead resolved through their enclosing type declaration. | |
3475 if (!target.isTypeVariable) { | |
3476 // [target] might be the implementation element and only declaration | |
3477 // elements may be registered. | |
3478 registry.registerStaticUse(target.declaration); | |
3479 } | |
3480 } | |
3481 } | |
3482 | |
3483 ConstantResult visitLiteralInt(LiteralInt node) { | 3561 ConstantResult visitLiteralInt(LiteralInt node) { |
3484 registry.registerInstantiatedType(coreTypes.intType); | 3562 registry.registerInstantiatedType(coreTypes.intType); |
3485 ConstantExpression constant = new IntConstantExpression(node.value); | 3563 ConstantExpression constant = new IntConstantExpression(node.value); |
3486 registry.setConstant(node, constant); | 3564 registry.setConstant(node, constant); |
3487 return new ConstantResult(node, constant); | 3565 return new ConstantResult(node, constant); |
3488 } | 3566 } |
3489 | 3567 |
3490 ConstantResult visitLiteralDouble(LiteralDouble node) { | 3568 ConstantResult visitLiteralDouble(LiteralDouble node) { |
3491 registry.registerInstantiatedType(coreTypes.doubleType); | 3569 registry.registerInstantiatedType(coreTypes.doubleType); |
3492 ConstantExpression constant = new DoubleConstantExpression(node.value); | 3570 ConstantExpression constant = new DoubleConstantExpression(node.value); |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3661 registry.registerThrowNoSuchMethod(); | 3739 registry.registerThrowNoSuchMethod(); |
3662 isValidAsConstant = false; | 3740 isValidAsConstant = false; |
3663 } | 3741 } |
3664 | 3742 |
3665 // Register a post process to check for cycles in the redirection chain and | 3743 // Register a post process to check for cycles in the redirection chain and |
3666 // set the actual generative constructor at the end of the chain. | 3744 // set the actual generative constructor at the end of the chain. |
3667 addDeferredAction(constructor, () { | 3745 addDeferredAction(constructor, () { |
3668 compiler.resolver.resolveRedirectionChain(constructor, node); | 3746 compiler.resolver.resolveRedirectionChain(constructor, node); |
3669 }); | 3747 }); |
3670 | 3748 |
3671 registry.registerStaticUse(redirectionTarget); | 3749 registry.registerStaticUse( |
| 3750 new StaticUse.constructorRedirect(redirectionTarget)); |
3672 // TODO(johnniwinther): Register the effective target type instead. | 3751 // TODO(johnniwinther): Register the effective target type instead. |
3673 registry.registerInstantiatedType( | 3752 registry.registerInstantiatedType( |
3674 redirectionTarget.enclosingClass.thisType | 3753 redirectionTarget.enclosingClass.thisType |
3675 .subst(type.typeArguments, targetClass.typeVariables)); | 3754 .subst(type.typeArguments, targetClass.typeVariables)); |
3676 if (isSymbolConstructor) { | 3755 if (isSymbolConstructor) { |
3677 registry.registerSymbolConstructor(); | 3756 registry.registerSymbolConstructor(); |
3678 } | 3757 } |
3679 if (isValidAsConstant) { | 3758 if (isValidAsConstant) { |
3680 List<String> names = <String>[]; | 3759 List<String> names = <String>[]; |
3681 List<ConstantExpression> arguments = <ConstantExpression>[]; | 3760 List<ConstantExpression> arguments = <ConstantExpression>[]; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3805 if (Elements.isUnresolved(constructor)) { | 3884 if (Elements.isUnresolved(constructor)) { |
3806 return new ResolutionResult.forElement(constructor); | 3885 return new ResolutionResult.forElement(constructor); |
3807 } | 3886 } |
3808 constructor.computeType(resolution); | 3887 constructor.computeType(resolution); |
3809 if (!callSelector.applies(constructor, compiler.world)) { | 3888 if (!callSelector.applies(constructor, compiler.world)) { |
3810 registry.registerThrowNoSuchMethod(); | 3889 registry.registerThrowNoSuchMethod(); |
3811 } | 3890 } |
3812 | 3891 |
3813 // [constructor] might be the implementation element | 3892 // [constructor] might be the implementation element |
3814 // and only declaration elements may be registered. | 3893 // and only declaration elements may be registered. |
3815 registry.registerStaticUse(constructor.declaration); | 3894 registry.registerStaticUse( |
| 3895 new StaticUse.constructorInvoke( |
| 3896 constructor.declaration, callSelector.callStructure)); |
3816 ClassElement cls = constructor.enclosingClass; | 3897 ClassElement cls = constructor.enclosingClass; |
3817 if (cls.isEnumClass && currentClass != cls) { | 3898 if (cls.isEnumClass && currentClass != cls) { |
3818 reporter.reportErrorMessage( | 3899 reporter.reportErrorMessage( |
3819 node, | 3900 node, |
3820 MessageKind.CANNOT_INSTANTIATE_ENUM, | 3901 MessageKind.CANNOT_INSTANTIATE_ENUM, |
3821 {'enumName': cls.name}); | 3902 {'enumName': cls.name}); |
3822 isValidAsConstant = false; | 3903 isValidAsConstant = false; |
3823 } | 3904 } |
3824 | 3905 |
3825 InterfaceType type = registry.getType(node); | 3906 InterfaceType type = registry.getType(node); |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4161 node.target, MessageKind.INVALID_CONTINUE); | 4242 node.target, MessageKind.INVALID_CONTINUE); |
4162 } | 4243 } |
4163 label.setContinueTarget(); | 4244 label.setContinueTarget(); |
4164 registry.useLabel(node, label); | 4245 registry.useLabel(node, label); |
4165 } | 4246 } |
4166 registry.registerTargetOf(node, target); | 4247 registry.registerTargetOf(node, target); |
4167 return const NoneResult(); | 4248 return const NoneResult(); |
4168 } | 4249 } |
4169 | 4250 |
4170 registerImplicitInvocation(Selector selector) { | 4251 registerImplicitInvocation(Selector selector) { |
4171 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 4252 registry.registerDynamicUse(new UniverseSelector(selector, null)); |
4172 } | 4253 } |
4173 | 4254 |
4174 ResolutionResult visitAsyncForIn(AsyncForIn node) { | 4255 ResolutionResult visitAsyncForIn(AsyncForIn node) { |
4175 registry.registerAsyncForIn(node); | 4256 registry.registerAsyncForIn(node); |
4176 registry.setCurrentSelector(node, Selectors.current); | 4257 registry.setCurrentSelector(node, Selectors.current); |
4177 registry.registerDynamicGetter( | 4258 registry.registerDynamicUse( |
4178 new UniverseSelector(Selectors.current, null)); | 4259 new UniverseSelector(Selectors.current, null)); |
4179 registry.setMoveNextSelector(node, Selectors.moveNext); | 4260 registry.setMoveNextSelector(node, Selectors.moveNext); |
4180 registry.registerDynamicInvocation( | 4261 registry.registerDynamicUse( |
4181 new UniverseSelector(Selectors.moveNext, null)); | 4262 new UniverseSelector(Selectors.moveNext, null)); |
4182 | 4263 |
4183 visit(node.expression); | 4264 visit(node.expression); |
4184 | 4265 |
4185 Scope blockScope = new BlockScope(scope); | 4266 Scope blockScope = new BlockScope(scope); |
4186 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); | 4267 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); |
4187 visitLoopBodyIn(node, node.body, blockScope); | 4268 visitLoopBodyIn(node, node.body, blockScope); |
4188 return const NoneResult(); | 4269 return const NoneResult(); |
4189 } | 4270 } |
4190 | 4271 |
4191 ResolutionResult visitSyncForIn(SyncForIn node) { | 4272 ResolutionResult visitSyncForIn(SyncForIn node) { |
4192 registry.registerSyncForIn(node); | 4273 registry.registerSyncForIn(node); |
4193 registry.setIteratorSelector(node, Selectors.iterator); | 4274 registry.setIteratorSelector(node, Selectors.iterator); |
4194 registry.registerDynamicGetter( | 4275 registry.registerDynamicUse( |
4195 new UniverseSelector(Selectors.iterator, null)); | 4276 new UniverseSelector(Selectors.iterator, null)); |
4196 registry.setCurrentSelector(node, Selectors.current); | 4277 registry.setCurrentSelector(node, Selectors.current); |
4197 registry.registerDynamicGetter( | 4278 registry.registerDynamicUse( |
4198 new UniverseSelector(Selectors.current, null)); | 4279 new UniverseSelector(Selectors.current, null)); |
4199 registry.setMoveNextSelector(node, Selectors.moveNext); | 4280 registry.setMoveNextSelector(node, Selectors.moveNext); |
4200 registry.registerDynamicInvocation( | 4281 registry.registerDynamicUse( |
4201 new UniverseSelector(Selectors.moveNext, null)); | 4282 new UniverseSelector(Selectors.moveNext, null)); |
4202 | 4283 |
4203 visit(node.expression); | 4284 visit(node.expression); |
4204 | 4285 |
4205 Scope blockScope = new BlockScope(scope); | 4286 Scope blockScope = new BlockScope(scope); |
4206 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); | 4287 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); |
4207 visitLoopBodyIn(node, node.body, blockScope); | 4288 visitLoopBodyIn(node, node.body, blockScope); |
4208 return const NoneResult(); | 4289 return const NoneResult(); |
4209 } | 4290 } |
4210 | 4291 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4253 loopVariableSelector = new Selector.setter( | 4334 loopVariableSelector = new Selector.setter( |
4254 new Name(identifier.source, library)); | 4335 new Name(identifier.source, library)); |
4255 loopVariable = registry.getDefinition(identifier); | 4336 loopVariable = registry.getDefinition(identifier); |
4256 } | 4337 } |
4257 } else { | 4338 } else { |
4258 reporter.reportErrorMessage( | 4339 reporter.reportErrorMessage( |
4259 declaration, MessageKind.INVALID_FOR_IN); | 4340 declaration, MessageKind.INVALID_FOR_IN); |
4260 } | 4341 } |
4261 if (loopVariableSelector != null) { | 4342 if (loopVariableSelector != null) { |
4262 registry.setSelector(declaration, loopVariableSelector); | 4343 registry.setSelector(declaration, loopVariableSelector); |
4263 registerSend(loopVariableSelector, loopVariable); | 4344 if (loopVariable == null || loopVariable.isInstanceMember) { |
| 4345 registry.registerDynamicUse( |
| 4346 new UniverseSelector(loopVariableSelector, null)); |
| 4347 } else if (loopVariable.isStatic || loopVariable.isTopLevel) { |
| 4348 registry.registerStaticUse( |
| 4349 new StaticUse.staticSet(loopVariable.declaration)); |
| 4350 } |
4264 } else { | 4351 } else { |
4265 // The selector may only be null if we reported an error. | 4352 // The selector may only be null if we reported an error. |
4266 assert(invariant(declaration, compiler.compilationFailed)); | 4353 assert(invariant(declaration, compiler.compilationFailed)); |
4267 } | 4354 } |
4268 if (loopVariable != null) { | 4355 if (loopVariable != null) { |
4269 // loopVariable may be null if it could not be resolved. | 4356 // loopVariable may be null if it could not be resolved. |
4270 registry.setForInVariable(node, loopVariable); | 4357 registry.setForInVariable(node, loopVariable); |
4271 } | 4358 } |
4272 } | 4359 } |
4273 | 4360 |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4672 } | 4759 } |
4673 return const NoneResult(); | 4760 return const NoneResult(); |
4674 } | 4761 } |
4675 } | 4762 } |
4676 | 4763 |
4677 /// Looks up [name] in [scope] and unwraps the result. | 4764 /// Looks up [name] in [scope] and unwraps the result. |
4678 Element lookupInScope(DiagnosticReporter reporter, Node node, | 4765 Element lookupInScope(DiagnosticReporter reporter, Node node, |
4679 Scope scope, String name) { | 4766 Scope scope, String name) { |
4680 return Elements.unwrap(scope.lookup(name), reporter, node); | 4767 return Elements.unwrap(scope.lookup(name), reporter, node); |
4681 } | 4768 } |
OLD | NEW |