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

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

Issue 1408383006: Rename UniverseSelector to DynamicUse and move it to use.dart (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. 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 19 matching lines...) Expand all
30 VariableList; 30 VariableList;
31 import '../tokens/token.dart' show 31 import '../tokens/token.dart' show
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
41 UniverseSelector;
42 import '../universe/use.dart' show 40 import '../universe/use.dart' show
41 DynamicUse,
43 StaticUse; 42 StaticUse;
44 43
45 import 'access_semantics.dart'; 44 import 'access_semantics.dart';
46 import 'class_members.dart' show MembersCreator; 45 import 'class_members.dart' show MembersCreator;
47 import 'operators.dart'; 46 import 'operators.dart';
48 import 'send_structure.dart'; 47 import 'send_structure.dart';
49 48
50 import 'constructors.dart' show 49 import 'constructors.dart' show
51 ConstructorResolver, 50 ConstructorResolver,
52 ConstructorResult; 51 ConstructorResult;
(...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 error = reportAndCreateErroneousElement( 1027 error = reportAndCreateErroneousElement(
1029 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER, 1028 node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER,
1030 {'className': currentClass.name, 'memberName': name}); 1029 {'className': currentClass.name, 'memberName': name});
1031 } 1030 }
1032 if (target == null) { 1031 if (target == null) {
1033 // If a setter wasn't resolved, use the [ErroneousElement]. 1032 // If a setter wasn't resolved, use the [ErroneousElement].
1034 target = error; 1033 target = error;
1035 } 1034 }
1036 // We still need to register the invocation, because we might 1035 // We still need to register the invocation, because we might
1037 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. 1036 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1038 registry.registerDynamicUse(new UniverseSelector(selector, null)); 1037 registry.registerDynamicUse(new DynamicUse(selector, null));
1039 registry.registerSuperNoSuchMethod(); 1038 registry.registerSuperNoSuchMethod();
1040 } 1039 }
1041 return computeSuperAccessSemantics(node, target); 1040 return computeSuperAccessSemantics(node, target);
1042 } 1041 }
1043 1042
1044 /// Compute the [AccessSemantics] for accessing the name of [selector] on the 1043 /// Compute the [AccessSemantics] for accessing the name of [selector] on the
1045 /// super class. 1044 /// super class.
1046 /// 1045 ///
1047 /// If no matching super member is found and error is reported and 1046 /// If no matching super member is found and error is reported and
1048 /// `noSuchMethod` on `super` is registered. Furthermore, if [alternateName] 1047 /// `noSuchMethod` on `super` is registered. Furthermore, if [alternateName]
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, 1095 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
1097 {'superclassName': setter.enclosingClass.name, 1096 {'superclassName': setter.enclosingClass.name,
1098 'name': setterSelector.name}); 1097 'name': setterSelector.name});
1099 setterError = true; 1098 setterError = true;
1100 } 1099 }
1101 } 1100 }
1102 if (getterError) { 1101 if (getterError) {
1103 // We still need to register the invocation, because we might 1102 // We still need to register the invocation, because we might
1104 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. 1103 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1105 registry.registerDynamicUse( 1104 registry.registerDynamicUse(
1106 new UniverseSelector(getterSelector, null)); 1105 new DynamicUse(getterSelector, null));
1107 } 1106 }
1108 if (setterError) { 1107 if (setterError) {
1109 // We still need to register the invocation, because we might 1108 // We still need to register the invocation, because we might
1110 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. 1109 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
1111 registry.registerDynamicUse( 1110 registry.registerDynamicUse(
1112 new UniverseSelector(setterSelector, null)); 1111 new DynamicUse(setterSelector, null));
1113 } 1112 }
1114 if (getterError || setterError) { 1113 if (getterError || setterError) {
1115 registry.registerSuperNoSuchMethod(); 1114 registry.registerSuperNoSuchMethod();
1116 } 1115 }
1117 return computeCompoundSuperAccessSemantics( 1116 return computeCompoundSuperAccessSemantics(
1118 node, getter, setter, isIndex: isIndex); 1117 node, getter, setter, isIndex: isIndex);
1119 } 1118 }
1120 1119
1121 /// Resolve [node] as a subexpression that is _not_ the prefix of a member 1120 /// Resolve [node] as a subexpression that is _not_ the prefix of a member
1122 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`. 1121 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1217 semantics.element.declaration, 1216 semantics.element.declaration,
1218 selector.callStructure)); 1217 selector.callStructure));
1219 } 1218 }
1220 // TODO(23998): Remove this when all information goes through 1219 // TODO(23998): Remove this when all information goes through
1221 // the [SendStructure]. 1220 // the [SendStructure].
1222 registry.useElement(node, semantics.element); 1221 registry.useElement(node, semantics.element);
1223 } 1222 }
1224 } else { 1223 } else {
1225 ResolutionResult expressionResult = visitExpression(expression); 1224 ResolutionResult expressionResult = visitExpression(expression);
1226 semantics = const DynamicAccess.expression(); 1225 semantics = const DynamicAccess.expression();
1227 registry.registerDynamicUse(new UniverseSelector(selector, null)); 1226 registry.registerDynamicUse(new DynamicUse(selector, null));
1228 1227
1229 if (expressionResult.isConstant) { 1228 if (expressionResult.isConstant) {
1230 bool isValidConstant; 1229 bool isValidConstant;
1231 ConstantExpression expressionConstant = expressionResult.constant; 1230 ConstantExpression expressionConstant = expressionResult.constant;
1232 DartType knownExpressionType = 1231 DartType knownExpressionType =
1233 expressionConstant.getKnownType(coreTypes); 1232 expressionConstant.getKnownType(coreTypes);
1234 switch (operator.kind) { 1233 switch (operator.kind) {
1235 case UnaryOperatorKind.COMPLEMENT: 1234 case UnaryOperatorKind.COMPLEMENT:
1236 isValidConstant = 1235 isValidConstant =
1237 knownExpressionType == coreTypes.intType; 1236 knownExpressionType == coreTypes.intType;
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 selector.callStructure)); 1392 selector.callStructure));
1394 } 1393 }
1395 // TODO(23998): Remove this when all information goes through 1394 // TODO(23998): Remove this when all information goes through
1396 // the [SendStructure]. 1395 // the [SendStructure].
1397 registry.useElement(node, semantics.element); 1396 registry.useElement(node, semantics.element);
1398 } 1397 }
1399 visitExpression(right); 1398 visitExpression(right);
1400 } else { 1399 } else {
1401 ResolutionResult leftResult = visitExpression(left); 1400 ResolutionResult leftResult = visitExpression(left);
1402 ResolutionResult rightResult = visitExpression(right); 1401 ResolutionResult rightResult = visitExpression(right);
1403 registry.registerDynamicUse(new UniverseSelector(selector, null)); 1402 registry.registerDynamicUse(new DynamicUse(selector, null));
1404 semantics = const DynamicAccess.expression(); 1403 semantics = const DynamicAccess.expression();
1405 1404
1406 if (leftResult.isConstant && rightResult.isConstant) { 1405 if (leftResult.isConstant && rightResult.isConstant) {
1407 bool isValidConstant; 1406 bool isValidConstant;
1408 ConstantExpression leftConstant = leftResult.constant; 1407 ConstantExpression leftConstant = leftResult.constant;
1409 ConstantExpression rightConstant = rightResult.constant; 1408 ConstantExpression rightConstant = rightResult.constant;
1410 DartType knownLeftType = leftConstant.getKnownType(coreTypes); 1409 DartType knownLeftType = leftConstant.getKnownType(coreTypes);
1411 DartType knownRightType = rightConstant.getKnownType(coreTypes); 1410 DartType knownRightType = rightConstant.getKnownType(coreTypes);
1412 switch (operator.kind) { 1411 switch (operator.kind) {
1413 case BinaryOperatorKind.EQ: 1412 case BinaryOperatorKind.EQ:
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 assert(invariant(node, node.isCall, 1527 assert(invariant(node, node.isCall,
1529 message: "Unexpected expression: $node")); 1528 message: "Unexpected expression: $node"));
1530 Node expression = node.selector; 1529 Node expression = node.selector;
1531 visitExpression(expression); 1530 visitExpression(expression);
1532 CallStructure callStructure = 1531 CallStructure callStructure =
1533 resolveArguments(node.argumentsNode).callStructure; 1532 resolveArguments(node.argumentsNode).callStructure;
1534 Selector selector = callStructure.callSelector; 1533 Selector selector = callStructure.callSelector;
1535 // TODO(23998): Remove this when all information goes through the 1534 // TODO(23998): Remove this when all information goes through the
1536 // [SendStructure]. 1535 // [SendStructure].
1537 registry.setSelector(node, selector); 1536 registry.setSelector(node, selector);
1538 registry.registerDynamicUse(new UniverseSelector(selector, null)); 1537 registry.registerDynamicUse(new DynamicUse(selector, null));
1539 registry.registerSendStructure(node, 1538 registry.registerSendStructure(node,
1540 new InvokeStructure(const DynamicAccess.expression(), selector)); 1539 new InvokeStructure(const DynamicAccess.expression(), selector));
1541 return const NoneResult(); 1540 return const NoneResult();
1542 } 1541 }
1543 1542
1544 /// Handle access of a property of [name] on `this`, like `this.name` and 1543 /// Handle access of a property of [name] on `this`, like `this.name` and
1545 /// `this.name()`, or `name` and `name()` in instance context. 1544 /// `this.name()`, or `name` and `name()` in instance context.
1546 ResolutionResult handleThisPropertyAccess(Send node, Name name) { 1545 ResolutionResult handleThisPropertyAccess(Send node, Name name) {
1547 AccessSemantics semantics = new DynamicAccess.thisProperty(name); 1546 AccessSemantics semantics = new DynamicAccess.thisProperty(name);
1548 return handleDynamicAccessSemantics(node, name, semantics); 1547 return handleDynamicAccessSemantics(node, name, semantics);
(...skipping 13 matching lines...) Expand all
1562 if (node.isCall) { 1561 if (node.isCall) {
1563 CallStructure callStructure = 1562 CallStructure callStructure =
1564 resolveArguments(node.argumentsNode).callStructure; 1563 resolveArguments(node.argumentsNode).callStructure;
1565 Selector selector = callStructure.callSelector; 1564 Selector selector = callStructure.callSelector;
1566 // TODO(johnniwinther): Handle invalid this access as an 1565 // TODO(johnniwinther): Handle invalid this access as an
1567 // [AccessSemantics]. 1566 // [AccessSemantics].
1568 AccessSemantics accessSemantics = checkThisAccess(node); 1567 AccessSemantics accessSemantics = checkThisAccess(node);
1569 if (accessSemantics == null) { 1568 if (accessSemantics == null) {
1570 accessSemantics = const DynamicAccess.thisAccess(); 1569 accessSemantics = const DynamicAccess.thisAccess();
1571 registry.registerDynamicUse( 1570 registry.registerDynamicUse(
1572 new UniverseSelector(selector, null)); 1571 new DynamicUse(selector, null));
1573 } 1572 }
1574 registry.registerSendStructure(node, 1573 registry.registerSendStructure(node,
1575 new InvokeStructure(accessSemantics, selector)); 1574 new InvokeStructure(accessSemantics, selector));
1576 // TODO(23998): Remove this when all information goes through 1575 // TODO(23998): Remove this when all information goes through
1577 // the [SendStructure]. 1576 // the [SendStructure].
1578 registry.setSelector(node, selector); 1577 registry.setSelector(node, selector);
1579 return const NoneResult(); 1578 return const NoneResult();
1580 } else { 1579 } else {
1581 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node. 1580 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node.
1582 reporter.internalError( 1581 reporter.internalError(
(...skipping 21 matching lines...) Expand all
1604 if (node.isCall) { 1603 if (node.isCall) {
1605 bool isIncompatibleInvoke = false; 1604 bool isIncompatibleInvoke = false;
1606 switch (semantics.kind) { 1605 switch (semantics.kind) {
1607 case AccessKind.SUPER_METHOD: 1606 case AccessKind.SUPER_METHOD:
1608 MethodElementX superMethod = semantics.element; 1607 MethodElementX superMethod = semantics.element;
1609 superMethod.computeType(resolution); 1608 superMethod.computeType(resolution);
1610 if (!callStructure.signatureApplies( 1609 if (!callStructure.signatureApplies(
1611 superMethod.functionSignature)) { 1610 superMethod.functionSignature)) {
1612 registry.registerThrowNoSuchMethod(); 1611 registry.registerThrowNoSuchMethod();
1613 registry.registerDynamicUse( 1612 registry.registerDynamicUse(
1614 new UniverseSelector(selector, null)); 1613 new DynamicUse(selector, null));
1615 registry.registerSuperNoSuchMethod(); 1614 registry.registerSuperNoSuchMethod();
1616 isIncompatibleInvoke = true; 1615 isIncompatibleInvoke = true;
1617 } else { 1616 } else {
1618 registry.registerStaticUse( 1617 registry.registerStaticUse(
1619 new StaticUse.superInvoke(semantics.element, callStructure)); 1618 new StaticUse.superInvoke(semantics.element, callStructure));
1620 } 1619 }
1621 break; 1620 break;
1622 case AccessKind.SUPER_FIELD: 1621 case AccessKind.SUPER_FIELD:
1623 case AccessKind.SUPER_FINAL_FIELD: 1622 case AccessKind.SUPER_FINAL_FIELD:
1624 case AccessKind.SUPER_GETTER: 1623 case AccessKind.SUPER_GETTER:
1625 registry.registerStaticUse( 1624 registry.registerStaticUse(
1626 new StaticUse.superGet(semantics.element)); 1625 new StaticUse.superGet(semantics.element));
1627 selector = callStructure.callSelector; 1626 selector = callStructure.callSelector;
1628 registry.registerDynamicUse( 1627 registry.registerDynamicUse(
1629 new UniverseSelector(selector, null)); 1628 new DynamicUse(selector, null));
1630 break; 1629 break;
1631 case AccessKind.SUPER_SETTER: 1630 case AccessKind.SUPER_SETTER:
1632 case AccessKind.UNRESOLVED_SUPER: 1631 case AccessKind.UNRESOLVED_SUPER:
1633 // NoSuchMethod registered in [computeSuperSemantics]. 1632 // NoSuchMethod registered in [computeSuperSemantics].
1634 break; 1633 break;
1635 case AccessKind.INVALID: 1634 case AccessKind.INVALID:
1636 // 'super' is not allowed. 1635 // 'super' is not allowed.
1637 break; 1636 break;
1638 default: 1637 default:
1639 reporter.internalError( 1638 reporter.internalError(
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
2332 /// Handle dynamic access of [semantics]. 2331 /// Handle dynamic access of [semantics].
2333 ResolutionResult handleDynamicAccessSemantics( 2332 ResolutionResult handleDynamicAccessSemantics(
2334 Send node, Name name, AccessSemantics semantics) { 2333 Send node, Name name, AccessSemantics semantics) {
2335 SendStructure sendStructure; 2334 SendStructure sendStructure;
2336 Selector selector; 2335 Selector selector;
2337 if (node.isCall) { 2336 if (node.isCall) {
2338 CallStructure callStructure = 2337 CallStructure callStructure =
2339 resolveArguments(node.argumentsNode).callStructure; 2338 resolveArguments(node.argumentsNode).callStructure;
2340 selector = new Selector.call(name, callStructure); 2339 selector = new Selector.call(name, callStructure);
2341 registry.registerDynamicUse( 2340 registry.registerDynamicUse(
2342 new UniverseSelector(selector, null)); 2341 new DynamicUse(selector, null));
2343 sendStructure = new InvokeStructure(semantics, selector); 2342 sendStructure = new InvokeStructure(semantics, selector);
2344 } else { 2343 } else {
2345 assert(invariant(node, node.isPropertyAccess)); 2344 assert(invariant(node, node.isPropertyAccess));
2346 selector = new Selector.getter(name); 2345 selector = new Selector.getter(name);
2347 registry.registerDynamicUse( 2346 registry.registerDynamicUse(
2348 new UniverseSelector(selector, null)); 2347 new DynamicUse(selector, null));
2349 sendStructure = new GetStructure(semantics); 2348 sendStructure = new GetStructure(semantics);
2350 } 2349 }
2351 registry.registerSendStructure(node, sendStructure); 2350 registry.registerSendStructure(node, sendStructure);
2352 // TODO(23998): Remove this when all information goes through 2351 // TODO(23998): Remove this when all information goes through
2353 // the [SendStructure]. 2352 // the [SendStructure].
2354 registry.setSelector(node, selector); 2353 registry.setSelector(node, selector);
2355 return const NoneResult(); 2354 return const NoneResult();
2356 } 2355 }
2357 2356
2358 /// Handle dynamic update of [semantics]. 2357 /// Handle dynamic update of [semantics].
2359 ResolutionResult handleDynamicUpdateSemantics( 2358 ResolutionResult handleDynamicUpdateSemantics(
2360 SendSet node, Name name, Element element, AccessSemantics semantics) { 2359 SendSet node, Name name, Element element, AccessSemantics semantics) {
2361 Selector getterSelector = new Selector.getter(name); 2360 Selector getterSelector = new Selector.getter(name);
2362 Selector setterSelector = new Selector.setter(name.setter); 2361 Selector setterSelector = new Selector.setter(name.setter);
2363 registry.registerDynamicUse( 2362 registry.registerDynamicUse(
2364 new UniverseSelector(setterSelector, null)); 2363 new DynamicUse(setterSelector, null));
2365 if (node.isComplex) { 2364 if (node.isComplex) {
2366 registry.registerDynamicUse( 2365 registry.registerDynamicUse(
2367 new UniverseSelector(getterSelector, null)); 2366 new DynamicUse(getterSelector, null));
2368 } 2367 }
2369 2368
2370 // TODO(23998): Remove these when elements are only accessed through the 2369 // TODO(23998): Remove these when elements are only accessed through the
2371 // send structure. 2370 // send structure.
2372 Element getter = element; 2371 Element getter = element;
2373 Element setter = element; 2372 Element setter = element;
2374 if (element != null && element.isAbstractField) { 2373 if (element != null && element.isAbstractField) {
2375 AbstractFieldElement abstractField = element; 2374 AbstractFieldElement abstractField = element;
2376 getter = abstractField.getter; 2375 getter = abstractField.getter;
2377 setter = abstractField.setter; 2376 setter = abstractField.setter;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
2477 2476
2478 /// Handle erroneous access of [element] of the given [semantics]. 2477 /// Handle erroneous access of [element] of the given [semantics].
2479 ResolutionResult handleErroneousAccess( 2478 ResolutionResult handleErroneousAccess(
2480 Send node, Name name, AccessSemantics semantics) { 2479 Send node, Name name, AccessSemantics semantics) {
2481 SendStructure sendStructure; 2480 SendStructure sendStructure;
2482 Selector selector; 2481 Selector selector;
2483 if (node.isCall) { 2482 if (node.isCall) {
2484 CallStructure callStructure = 2483 CallStructure callStructure =
2485 resolveArguments(node.argumentsNode).callStructure; 2484 resolveArguments(node.argumentsNode).callStructure;
2486 selector = new Selector.call(name, callStructure); 2485 selector = new Selector.call(name, callStructure);
2487 registry.registerDynamicUse(new UniverseSelector(selector, null)); 2486 registry.registerDynamicUse(new DynamicUse(selector, null));
2488 sendStructure = new InvokeStructure(semantics, selector); 2487 sendStructure = new InvokeStructure(semantics, selector);
2489 } else { 2488 } else {
2490 assert(invariant(node, node.isPropertyAccess)); 2489 assert(invariant(node, node.isPropertyAccess));
2491 selector = new Selector.getter(name); 2490 selector = new Selector.getter(name);
2492 registry.registerDynamicUse(new UniverseSelector(selector, null)); 2491 registry.registerDynamicUse(new DynamicUse(selector, null));
2493 sendStructure = new GetStructure(semantics); 2492 sendStructure = new GetStructure(semantics);
2494 } 2493 }
2495 // TODO(23998): Remove this when all information goes through 2494 // TODO(23998): Remove this when all information goes through
2496 // the [SendStructure]. 2495 // the [SendStructure].
2497 registry.setSelector(node, selector); 2496 registry.setSelector(node, selector);
2498 registry.useElement(node, semantics.element); 2497 registry.useElement(node, semantics.element);
2499 registry.registerSendStructure(node, sendStructure); 2498 registry.registerSendStructure(node, sendStructure);
2500 return const NoneResult(); 2499 return const NoneResult();
2501 } 2500 }
2502 2501
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 resolveArguments(node.argumentsNode).callStructure; 2559 resolveArguments(node.argumentsNode).callStructure;
2561 selector = new Selector.call(name, callStructure); 2560 selector = new Selector.call(name, callStructure);
2562 bool isIncompatibleInvoke = false; 2561 bool isIncompatibleInvoke = false;
2563 switch (semantics.kind) { 2562 switch (semantics.kind) {
2564 case AccessKind.LOCAL_FUNCTION: 2563 case AccessKind.LOCAL_FUNCTION:
2565 LocalFunctionElementX function = semantics.element; 2564 LocalFunctionElementX function = semantics.element;
2566 function.computeType(resolution); 2565 function.computeType(resolution);
2567 if (!callStructure.signatureApplies(function.functionSignature)) { 2566 if (!callStructure.signatureApplies(function.functionSignature)) {
2568 registry.registerThrowNoSuchMethod(); 2567 registry.registerThrowNoSuchMethod();
2569 registry.registerDynamicUse( 2568 registry.registerDynamicUse(
2570 new UniverseSelector(selector, null)); 2569 new DynamicUse(selector, null));
2571 isIncompatibleInvoke = true; 2570 isIncompatibleInvoke = true;
2572 } 2571 }
2573 break; 2572 break;
2574 case AccessKind.PARAMETER: 2573 case AccessKind.PARAMETER:
2575 case AccessKind.FINAL_PARAMETER: 2574 case AccessKind.FINAL_PARAMETER:
2576 case AccessKind.LOCAL_VARIABLE: 2575 case AccessKind.LOCAL_VARIABLE:
2577 case AccessKind.FINAL_LOCAL_VARIABLE: 2576 case AccessKind.FINAL_LOCAL_VARIABLE:
2578 selector = callStructure.callSelector; 2577 selector = callStructure.callSelector;
2579 registry.registerDynamicUse( 2578 registry.registerDynamicUse(
2580 new UniverseSelector(selector, null)); 2579 new DynamicUse(selector, null));
2581 break; 2580 break;
2582 default: 2581 default:
2583 reporter.internalError(node, 2582 reporter.internalError(node,
2584 "Unexpected local access $semantics."); 2583 "Unexpected local access $semantics.");
2585 break; 2584 break;
2586 } 2585 }
2587 registry.registerSendStructure(node, 2586 registry.registerSendStructure(node,
2588 isIncompatibleInvoke 2587 isIncompatibleInvoke
2589 ? new IncompatibleInvokeStructure(semantics, selector) 2588 ? new IncompatibleInvokeStructure(semantics, selector)
2590 : new InvokeStructure(semantics, selector)); 2589 : new InvokeStructure(semantics, selector));
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
2733 2732
2734 bool isIncompatibleInvoke = false; 2733 bool isIncompatibleInvoke = false;
2735 switch (semantics.kind) { 2734 switch (semantics.kind) {
2736 case AccessKind.STATIC_METHOD: 2735 case AccessKind.STATIC_METHOD:
2737 case AccessKind.TOPLEVEL_METHOD: 2736 case AccessKind.TOPLEVEL_METHOD:
2738 MethodElement method = semantics.element; 2737 MethodElement method = semantics.element;
2739 method.computeType(resolution); 2738 method.computeType(resolution);
2740 if (!callStructure.signatureApplies(method.functionSignature)) { 2739 if (!callStructure.signatureApplies(method.functionSignature)) {
2741 registry.registerThrowNoSuchMethod(); 2740 registry.registerThrowNoSuchMethod();
2742 registry.registerDynamicUse( 2741 registry.registerDynamicUse(
2743 new UniverseSelector(selector, null)); 2742 new DynamicUse(selector, null));
2744 isIncompatibleInvoke = true; 2743 isIncompatibleInvoke = true;
2745 } else { 2744 } else {
2746 registry.registerStaticUse( 2745 registry.registerStaticUse(
2747 new StaticUse.staticInvoke(semantics.element, callStructure)); 2746 new StaticUse.staticInvoke(semantics.element, callStructure));
2748 handleForeignCall(node, semantics.element, callStructure); 2747 handleForeignCall(node, semantics.element, callStructure);
2749 if (method == compiler.identicalFunction && 2748 if (method == compiler.identicalFunction &&
2750 argumentsResult.isValidAsConstant) { 2749 argumentsResult.isValidAsConstant) {
2751 result = new ConstantResult(node, 2750 result = new ConstantResult(node,
2752 new IdenticalConstantExpression( 2751 new IdenticalConstantExpression(
2753 argumentsResult.argumentResults[0].constant, 2752 argumentsResult.argumentResults[0].constant,
2754 argumentsResult.argumentResults[1].constant)); 2753 argumentsResult.argumentResults[1].constant));
2755 } 2754 }
2756 } 2755 }
2757 break; 2756 break;
2758 case AccessKind.STATIC_FIELD: 2757 case AccessKind.STATIC_FIELD:
2759 case AccessKind.FINAL_STATIC_FIELD: 2758 case AccessKind.FINAL_STATIC_FIELD:
2760 case AccessKind.STATIC_GETTER: 2759 case AccessKind.STATIC_GETTER:
2761 case AccessKind.TOPLEVEL_FIELD: 2760 case AccessKind.TOPLEVEL_FIELD:
2762 case AccessKind.FINAL_TOPLEVEL_FIELD: 2761 case AccessKind.FINAL_TOPLEVEL_FIELD:
2763 case AccessKind.TOPLEVEL_GETTER: 2762 case AccessKind.TOPLEVEL_GETTER:
2764 registry.registerStaticUse( 2763 registry.registerStaticUse(
2765 new StaticUse.staticGet(semantics.element)); 2764 new StaticUse.staticGet(semantics.element));
2766 selector = callStructure.callSelector; 2765 selector = callStructure.callSelector;
2767 registry.registerDynamicUse( 2766 registry.registerDynamicUse(
2768 new UniverseSelector(selector, null)); 2767 new DynamicUse(selector, null));
2769 break; 2768 break;
2770 case AccessKind.STATIC_SETTER: 2769 case AccessKind.STATIC_SETTER:
2771 case AccessKind.TOPLEVEL_SETTER: 2770 case AccessKind.TOPLEVEL_SETTER:
2772 case AccessKind.UNRESOLVED: 2771 case AccessKind.UNRESOLVED:
2773 registry.registerThrowNoSuchMethod(); 2772 registry.registerThrowNoSuchMethod();
2774 member = reportAndCreateErroneousElement( 2773 member = reportAndCreateErroneousElement(
2775 node.selector, name.text, 2774 node.selector, name.text,
2776 MessageKind.CANNOT_RESOLVE_GETTER, const {}); 2775 MessageKind.CANNOT_RESOLVE_GETTER, const {});
2777 break; 2776 break;
2778 default: 2777 default:
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
3138 Selector operatorSelector = 3137 Selector operatorSelector =
3139 new Selector.binaryOperator(operator.selectorName); 3138 new Selector.binaryOperator(operator.selectorName);
3140 3139
3141 // TODO(23998): Remove these when selectors are only accessed 3140 // TODO(23998): Remove these when selectors are only accessed
3142 // through the send structure. 3141 // through the send structure.
3143 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 3142 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3144 registry.setSelector(node, setterSelector); 3143 registry.setSelector(node, setterSelector);
3145 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 3144 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3146 3145
3147 registry.registerDynamicUse( 3146 registry.registerDynamicUse(
3148 new UniverseSelector(getterSelector, null)); 3147 new DynamicUse(getterSelector, null));
3149 registry.registerDynamicUse( 3148 registry.registerDynamicUse(
3150 new UniverseSelector(setterSelector, null)); 3149 new DynamicUse(setterSelector, null));
3151 registry.registerDynamicUse( 3150 registry.registerDynamicUse(
3152 new UniverseSelector(operatorSelector, null)); 3151 new DynamicUse(operatorSelector, null));
3153 3152
3154 SendStructure sendStructure = node.isPrefix 3153 SendStructure sendStructure = node.isPrefix
3155 ? new IndexPrefixStructure(semantics, operator) 3154 ? new IndexPrefixStructure(semantics, operator)
3156 : new IndexPostfixStructure(semantics, operator); 3155 : new IndexPostfixStructure(semantics, operator);
3157 registry.registerSendStructure(node, sendStructure); 3156 registry.registerSendStructure(node, sendStructure);
3158 return const NoneResult(); 3157 return const NoneResult();
3159 } else { 3158 } else {
3160 Node rhs = node.arguments.tail.head; 3159 Node rhs = node.arguments.tail.head;
3161 visitExpression(rhs); 3160 visitExpression(rhs);
3162 3161
3163 AssignmentOperator operator = AssignmentOperator.parse(operatorText); 3162 AssignmentOperator operator = AssignmentOperator.parse(operatorText);
3164 if (operator.kind == AssignmentOperatorKind.ASSIGN) { 3163 if (operator.kind == AssignmentOperatorKind.ASSIGN) {
3165 // `a[b] = c`. 3164 // `a[b] = c`.
3166 Selector setterSelector = new Selector.indexSet(); 3165 Selector setterSelector = new Selector.indexSet();
3167 3166
3168 // TODO(23998): Remove this when selectors are only accessed 3167 // TODO(23998): Remove this when selectors are only accessed
3169 // through the send structure. 3168 // through the send structure.
3170 registry.setSelector(node, setterSelector); 3169 registry.setSelector(node, setterSelector);
3171 registry.registerDynamicUse( 3170 registry.registerDynamicUse(
3172 new UniverseSelector(setterSelector, null)); 3171 new DynamicUse(setterSelector, null));
3173 3172
3174 SendStructure sendStructure = new IndexSetStructure(semantics); 3173 SendStructure sendStructure = new IndexSetStructure(semantics);
3175 registry.registerSendStructure(node, sendStructure); 3174 registry.registerSendStructure(node, sendStructure);
3176 return const NoneResult(); 3175 return const NoneResult();
3177 } else { 3176 } else {
3178 // `a[b] += c`. 3177 // `a[b] += c`.
3179 Selector getterSelector = new Selector.index(); 3178 Selector getterSelector = new Selector.index();
3180 Selector setterSelector = new Selector.indexSet(); 3179 Selector setterSelector = new Selector.indexSet();
3181 Selector operatorSelector = 3180 Selector operatorSelector =
3182 new Selector.binaryOperator(operator.selectorName); 3181 new Selector.binaryOperator(operator.selectorName);
3183 3182
3184 // TODO(23998): Remove these when selectors are only accessed 3183 // TODO(23998): Remove these when selectors are only accessed
3185 // through the send structure. 3184 // through the send structure.
3186 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 3185 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3187 registry.setSelector(node, setterSelector); 3186 registry.setSelector(node, setterSelector);
3188 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 3187 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3189 3188
3190 registry.registerDynamicUse( 3189 registry.registerDynamicUse(
3191 new UniverseSelector(getterSelector, null)); 3190 new DynamicUse(getterSelector, null));
3192 registry.registerDynamicUse( 3191 registry.registerDynamicUse(
3193 new UniverseSelector(setterSelector, null)); 3192 new DynamicUse(setterSelector, null));
3194 registry.registerDynamicUse( 3193 registry.registerDynamicUse(
3195 new UniverseSelector(operatorSelector, null)); 3194 new DynamicUse(operatorSelector, null));
3196 3195
3197 SendStructure sendStructure = 3196 SendStructure sendStructure =
3198 new CompoundIndexSetStructure(semantics, operator); 3197 new CompoundIndexSetStructure(semantics, operator);
3199 registry.registerSendStructure(node, sendStructure); 3198 registry.registerSendStructure(node, sendStructure);
3200 return const NoneResult(); 3199 return const NoneResult();
3201 } 3200 }
3202 } 3201 }
3203 } 3202 }
3204 3203
3205 /// Handle super index operations like `super[a] = b`, `super[a] += b`, and 3204 /// Handle super index operations like `super[a] = b`, `super[a] += b`, and
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3239 new StaticUse.superInvoke( 3238 new StaticUse.superInvoke(
3240 semantics.setter, setterSelector.callStructure)); 3239 semantics.setter, setterSelector.callStructure));
3241 } 3240 }
3242 3241
3243 // TODO(23998): Remove these when elements are only accessed 3242 // TODO(23998): Remove these when elements are only accessed
3244 // through the send structure. 3243 // through the send structure.
3245 registry.useElement(node, semantics.setter); 3244 registry.useElement(node, semantics.setter);
3246 registry.useElement(node.selector, semantics.getter); 3245 registry.useElement(node.selector, semantics.getter);
3247 } 3246 }
3248 registry.registerDynamicUse( 3247 registry.registerDynamicUse(
3249 new UniverseSelector(operatorSelector, null)); 3248 new DynamicUse(operatorSelector, null));
3250 3249
3251 SendStructure sendStructure = node.isPrefix 3250 SendStructure sendStructure = node.isPrefix
3252 ? new IndexPrefixStructure(semantics, operator) 3251 ? new IndexPrefixStructure(semantics, operator)
3253 : new IndexPostfixStructure(semantics, operator); 3252 : new IndexPostfixStructure(semantics, operator);
3254 registry.registerSendStructure(node, sendStructure); 3253 registry.registerSendStructure(node, sendStructure);
3255 return const NoneResult(); 3254 return const NoneResult();
3256 } else { 3255 } else {
3257 Node rhs = node.arguments.tail.head; 3256 Node rhs = node.arguments.tail.head;
3258 visitExpression(rhs); 3257 visitExpression(rhs);
3259 3258
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3309 registry.useElement(node.selector, semantics.getter); 3308 registry.useElement(node.selector, semantics.getter);
3310 } 3309 }
3311 3310
3312 // TODO(23998): Remove these when selectors are only accessed 3311 // TODO(23998): Remove these when selectors are only accessed
3313 // through the send structure. 3312 // through the send structure.
3314 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 3313 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3315 registry.setSelector(node, setterSelector); 3314 registry.setSelector(node, setterSelector);
3316 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 3315 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3317 3316
3318 registry.registerDynamicUse( 3317 registry.registerDynamicUse(
3319 new UniverseSelector(operatorSelector, null)); 3318 new DynamicUse(operatorSelector, null));
3320 3319
3321 SendStructure sendStructure = 3320 SendStructure sendStructure =
3322 new CompoundIndexSetStructure(semantics, operator); 3321 new CompoundIndexSetStructure(semantics, operator);
3323 registry.registerSendStructure(node, sendStructure); 3322 registry.registerSendStructure(node, sendStructure);
3324 return const NoneResult(); 3323 return const NoneResult();
3325 } 3324 }
3326 } 3325 }
3327 } 3326 }
3328 3327
3329 /// Handle super index operations like `super.a = b`, `super.a += b`, and 3328 /// Handle super index operations like `super.a = b`, `super.a += b`, and
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
3411 node, setterSelector, alternateName: name); 3410 node, setterSelector, alternateName: name);
3412 switch (semantics.kind) { 3411 switch (semantics.kind) {
3413 case AccessKind.SUPER_FINAL_FIELD: 3412 case AccessKind.SUPER_FINAL_FIELD:
3414 reporter.reportWarningMessage( 3413 reporter.reportWarningMessage(
3415 node, 3414 node,
3416 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, 3415 MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
3417 {'name': name, 3416 {'name': name,
3418 'superclassName': semantics.setter.enclosingClass.name}); 3417 'superclassName': semantics.setter.enclosingClass.name});
3419 // TODO(johnniwinther): This shouldn't be needed. 3418 // TODO(johnniwinther): This shouldn't be needed.
3420 registry.registerDynamicUse( 3419 registry.registerDynamicUse(
3421 new UniverseSelector(setterSelector, null)); 3420 new DynamicUse(setterSelector, null));
3422 registry.registerSuperNoSuchMethod(); 3421 registry.registerSuperNoSuchMethod();
3423 break; 3422 break;
3424 case AccessKind.SUPER_METHOD: 3423 case AccessKind.SUPER_METHOD:
3425 reporter.reportWarningMessage( 3424 reporter.reportWarningMessage(
3426 node, MessageKind.ASSIGNING_METHOD_IN_SUPER, 3425 node, MessageKind.ASSIGNING_METHOD_IN_SUPER,
3427 {'name': name, 3426 {'name': name,
3428 'superclassName': semantics.setter.enclosingClass.name}); 3427 'superclassName': semantics.setter.enclosingClass.name});
3429 // TODO(johnniwinther): This shouldn't be needed. 3428 // TODO(johnniwinther): This shouldn't be needed.
3430 registry.registerDynamicUse( 3429 registry.registerDynamicUse(
3431 new UniverseSelector(setterSelector, null)); 3430 new DynamicUse(setterSelector, null));
3432 registry.registerSuperNoSuchMethod(); 3431 registry.registerSuperNoSuchMethod();
3433 break; 3432 break;
3434 case AccessKind.SUPER_FIELD: 3433 case AccessKind.SUPER_FIELD:
3435 case AccessKind.SUPER_SETTER: 3434 case AccessKind.SUPER_SETTER:
3436 registry.registerStaticUse( 3435 registry.registerStaticUse(
3437 new StaticUse.superSet(semantics.setter)); 3436 new StaticUse.superSet(semantics.setter));
3438 break; 3437 break;
3439 default: 3438 default:
3440 break; 3439 break;
3441 } 3440 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3474 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 3473 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3475 registry.setSelector(node, setterSelector); 3474 registry.setSelector(node, setterSelector);
3476 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 3475 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3477 3476
3478 // TODO(23998): Remove these when elements are only accessed 3477 // TODO(23998): Remove these when elements are only accessed
3479 // through the send structure. 3478 // through the send structure.
3480 registry.useElement(node, semantics.setter); 3479 registry.useElement(node, semantics.setter);
3481 registry.useElement(node.selector, semantics.getter); 3480 registry.useElement(node.selector, semantics.getter);
3482 3481
3483 registry.registerDynamicUse( 3482 registry.registerDynamicUse(
3484 new UniverseSelector(operatorSelector, null)); 3483 new DynamicUse(operatorSelector, null));
3485 3484
3486 SendStructure sendStructure = node.isPrefix 3485 SendStructure sendStructure = node.isPrefix
3487 ? new PrefixStructure(semantics, operator) 3486 ? new PrefixStructure(semantics, operator)
3488 : new PostfixStructure(semantics, operator); 3487 : new PostfixStructure(semantics, operator);
3489 registry.registerSendStructure(node, sendStructure); 3488 registry.registerSendStructure(node, sendStructure);
3490 registry.registerIncDecOperation(); 3489 registry.registerIncDecOperation();
3491 } else { 3490 } else {
3492 Node rhs = node.arguments.head; 3491 Node rhs = node.arguments.head;
3493 visitExpression(rhs); 3492 visitExpression(rhs);
3494 3493
(...skipping 21 matching lines...) Expand all
3516 registry.useElement(node, semantics.setter); 3515 registry.useElement(node, semantics.setter);
3517 registry.useElement(node.selector, semantics.getter); 3516 registry.useElement(node.selector, semantics.getter);
3518 3517
3519 // TODO(23998): Remove these when selectors are only accessed 3518 // TODO(23998): Remove these when selectors are only accessed
3520 // through the send structure. 3519 // through the send structure.
3521 registry.setGetterSelectorInComplexSendSet(node, getterSelector); 3520 registry.setGetterSelectorInComplexSendSet(node, getterSelector);
3522 registry.setSelector(node, setterSelector); 3521 registry.setSelector(node, setterSelector);
3523 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector); 3522 registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
3524 3523
3525 registry.registerDynamicUse( 3524 registry.registerDynamicUse(
3526 new UniverseSelector(operatorSelector, null)); 3525 new DynamicUse(operatorSelector, null));
3527 3526
3528 SendStructure sendStructure; 3527 SendStructure sendStructure;
3529 if (operator.kind == AssignmentOperatorKind.IF_NULL) { 3528 if (operator.kind == AssignmentOperatorKind.IF_NULL) {
3530 sendStructure = new SetIfNullStructure(semantics); 3529 sendStructure = new SetIfNullStructure(semantics);
3531 } else { 3530 } else {
3532 sendStructure = new CompoundStructure(semantics, operator); 3531 sendStructure = new CompoundStructure(semantics, operator);
3533 } 3532 }
3534 registry.registerSendStructure(node, sendStructure); 3533 registry.registerSendStructure(node, sendStructure);
3535 } 3534 }
3536 } 3535 }
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
4242 node.target, MessageKind.INVALID_CONTINUE); 4241 node.target, MessageKind.INVALID_CONTINUE);
4243 } 4242 }
4244 label.setContinueTarget(); 4243 label.setContinueTarget();
4245 registry.useLabel(node, label); 4244 registry.useLabel(node, label);
4246 } 4245 }
4247 registry.registerTargetOf(node, target); 4246 registry.registerTargetOf(node, target);
4248 return const NoneResult(); 4247 return const NoneResult();
4249 } 4248 }
4250 4249
4251 registerImplicitInvocation(Selector selector) { 4250 registerImplicitInvocation(Selector selector) {
4252 registry.registerDynamicUse(new UniverseSelector(selector, null)); 4251 registry.registerDynamicUse(new DynamicUse(selector, null));
4253 } 4252 }
4254 4253
4255 ResolutionResult visitAsyncForIn(AsyncForIn node) { 4254 ResolutionResult visitAsyncForIn(AsyncForIn node) {
4256 registry.registerAsyncForIn(node); 4255 registry.registerAsyncForIn(node);
4257 registry.setCurrentSelector(node, Selectors.current); 4256 registry.setCurrentSelector(node, Selectors.current);
4258 registry.registerDynamicUse( 4257 registry.registerDynamicUse(
4259 new UniverseSelector(Selectors.current, null)); 4258 new DynamicUse(Selectors.current, null));
4260 registry.setMoveNextSelector(node, Selectors.moveNext); 4259 registry.setMoveNextSelector(node, Selectors.moveNext);
4261 registry.registerDynamicUse( 4260 registry.registerDynamicUse(
4262 new UniverseSelector(Selectors.moveNext, null)); 4261 new DynamicUse(Selectors.moveNext, null));
4263 4262
4264 visit(node.expression); 4263 visit(node.expression);
4265 4264
4266 Scope blockScope = new BlockScope(scope); 4265 Scope blockScope = new BlockScope(scope);
4267 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); 4266 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope);
4268 visitLoopBodyIn(node, node.body, blockScope); 4267 visitLoopBodyIn(node, node.body, blockScope);
4269 return const NoneResult(); 4268 return const NoneResult();
4270 } 4269 }
4271 4270
4272 ResolutionResult visitSyncForIn(SyncForIn node) { 4271 ResolutionResult visitSyncForIn(SyncForIn node) {
4273 registry.registerSyncForIn(node); 4272 registry.registerSyncForIn(node);
4274 registry.setIteratorSelector(node, Selectors.iterator); 4273 registry.setIteratorSelector(node, Selectors.iterator);
4275 registry.registerDynamicUse( 4274 registry.registerDynamicUse(
4276 new UniverseSelector(Selectors.iterator, null)); 4275 new DynamicUse(Selectors.iterator, null));
4277 registry.setCurrentSelector(node, Selectors.current); 4276 registry.setCurrentSelector(node, Selectors.current);
4278 registry.registerDynamicUse( 4277 registry.registerDynamicUse(
4279 new UniverseSelector(Selectors.current, null)); 4278 new DynamicUse(Selectors.current, null));
4280 registry.setMoveNextSelector(node, Selectors.moveNext); 4279 registry.setMoveNextSelector(node, Selectors.moveNext);
4281 registry.registerDynamicUse( 4280 registry.registerDynamicUse(
4282 new UniverseSelector(Selectors.moveNext, null)); 4281 new DynamicUse(Selectors.moveNext, null));
4283 4282
4284 visit(node.expression); 4283 visit(node.expression);
4285 4284
4286 Scope blockScope = new BlockScope(scope); 4285 Scope blockScope = new BlockScope(scope);
4287 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); 4286 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope);
4288 visitLoopBodyIn(node, node.body, blockScope); 4287 visitLoopBodyIn(node, node.body, blockScope);
4289 return const NoneResult(); 4288 return const NoneResult();
4290 } 4289 }
4291 4290
4292 void visitForInDeclaredIdentifierIn( 4291 void visitForInDeclaredIdentifierIn(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4336 loopVariable = registry.getDefinition(identifier); 4335 loopVariable = registry.getDefinition(identifier);
4337 } 4336 }
4338 } else { 4337 } else {
4339 reporter.reportErrorMessage( 4338 reporter.reportErrorMessage(
4340 declaration, MessageKind.INVALID_FOR_IN); 4339 declaration, MessageKind.INVALID_FOR_IN);
4341 } 4340 }
4342 if (loopVariableSelector != null) { 4341 if (loopVariableSelector != null) {
4343 registry.setSelector(declaration, loopVariableSelector); 4342 registry.setSelector(declaration, loopVariableSelector);
4344 if (loopVariable == null || loopVariable.isInstanceMember) { 4343 if (loopVariable == null || loopVariable.isInstanceMember) {
4345 registry.registerDynamicUse( 4344 registry.registerDynamicUse(
4346 new UniverseSelector(loopVariableSelector, null)); 4345 new DynamicUse(loopVariableSelector, null));
4347 } else if (loopVariable.isStatic || loopVariable.isTopLevel) { 4346 } else if (loopVariable.isStatic || loopVariable.isTopLevel) {
4348 registry.registerStaticUse( 4347 registry.registerStaticUse(
4349 new StaticUse.staticSet(loopVariable.declaration)); 4348 new StaticUse.staticSet(loopVariable.declaration));
4350 } 4349 }
4351 } else { 4350 } else {
4352 // The selector may only be null if we reported an error. 4351 // The selector may only be null if we reported an error.
4353 assert(invariant(declaration, compiler.compilationFailed)); 4352 assert(invariant(declaration, compiler.compilationFailed));
4354 } 4353 }
4355 if (loopVariable != null) { 4354 if (loopVariable != null) {
4356 // loopVariable may be null if it could not be resolved. 4355 // loopVariable may be null if it could not be resolved.
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
4759 } 4758 }
4760 return const NoneResult(); 4759 return const NoneResult();
4761 } 4760 }
4762 } 4761 }
4763 4762
4764 /// Looks up [name] in [scope] and unwraps the result. 4763 /// Looks up [name] in [scope] and unwraps the result.
4765 Element lookupInScope(DiagnosticReporter reporter, Node node, 4764 Element lookupInScope(DiagnosticReporter reporter, Node node,
4766 Scope scope, String name) { 4765 Scope scope, String name) {
4767 return Elements.unwrap(scope.lookup(name), reporter, node); 4766 return Elements.unwrap(scope.lookup(name), reporter, node);
4768 } 4767 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/js_backend.dart ('k') | pkg/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698