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

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

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698