| 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 |