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

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

Issue 1182053010: Revert "Split TypedSelector into Selector and TypeMask." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 months 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 part of resolution; 5 part of resolution;
6 6
7 /** 7 /**
8 * Core implementation of resolution. 8 * Core implementation of resolution.
9 * 9 *
10 * Do not subclass or instantiate this class outside this library 10 * Do not subclass or instantiate this class outside this library
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 target = currentClass.lookupSuperByName(selector.memberName); 567 target = currentClass.lookupSuperByName(selector.memberName);
568 // [target] may be null which means invoking noSuchMethod on 568 // [target] may be null which means invoking noSuchMethod on
569 // super. 569 // super.
570 if (target == null) { 570 if (target == null) {
571 target = reportAndCreateErroneousElement( 571 target = reportAndCreateErroneousElement(
572 node, name, MessageKind.NO_SUCH_SUPER_MEMBER, 572 node, name, MessageKind.NO_SUCH_SUPER_MEMBER,
573 {'className': currentClass.name, 'memberName': name}); 573 {'className': currentClass.name, 'memberName': name});
574 // We still need to register the invocation, because we might 574 // We still need to register the invocation, because we might
575 // call [:super.noSuchMethod:] which calls 575 // call [:super.noSuchMethod:] which calls
576 // [JSInvocationMirror._invokeOn]. 576 // [JSInvocationMirror._invokeOn].
577 registry.registerDynamicInvocation( 577 registry.registerDynamicInvocation(selector);
578 new UniverseSelector(selector, null));
579 registry.registerSuperNoSuchMethod(); 578 registry.registerSuperNoSuchMethod();
580 } 579 }
581 } else if (Elements.isUnresolved(resolvedReceiver.element)) { 580 } else if (Elements.isUnresolved(resolvedReceiver.element)) {
582 return const NoneResult(); 581 return const NoneResult();
583 } else if (resolvedReceiver.element.isClass) { 582 } else if (resolvedReceiver.element.isClass) {
584 ClassElement receiverClass = resolvedReceiver.element; 583 ClassElement receiverClass = resolvedReceiver.element;
585 receiverClass.ensureResolved(compiler); 584 receiverClass.ensureResolved(compiler);
586 if (node.isOperator) { 585 if (node.isOperator) {
587 // When the resolved receiver is a class, we can have two cases: 586 // When the resolved receiver is a class, we can have two cases:
588 // 1) a static send: C.foo, or 587 // 1) a static send: C.foo, or
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
943 {'className': currentClass.name, 'memberName': name}); 942 {'className': currentClass.name, 'memberName': name});
944 if (alternateName != null) { 943 if (alternateName != null) {
945 target = currentClass.lookupSuperByName(alternateName); 944 target = currentClass.lookupSuperByName(alternateName);
946 } 945 }
947 if (target == null) { 946 if (target == null) {
948 // If a setter wasn't resolved, use the [ErroneousElement]. 947 // If a setter wasn't resolved, use the [ErroneousElement].
949 target = error; 948 target = error;
950 } 949 }
951 // We still need to register the invocation, because we might 950 // We still need to register the invocation, because we might
952 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn]. 951 // call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
953 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 952 registry.registerDynamicInvocation(selector);
954 registry.registerSuperNoSuchMethod(); 953 registry.registerSuperNoSuchMethod();
955 } 954 }
956 return computeSuperAccessSemantics(node, target); 955 return computeSuperAccessSemantics(node, target);
957 } 956 }
958 957
959 /// Resolve [node] as a subexpression that is _not_ the prefix of a member 958 /// Resolve [node] as a subexpression that is _not_ the prefix of a member
960 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`. 959 /// access. For instance `a` in `a + b`, as opposed to `a` in `a.b`.
961 ResolutionResult visitExpression(Node node) { 960 ResolutionResult visitExpression(Node node) {
962 bool oldSendIsMemberAccess = sendIsMemberAccess; 961 bool oldSendIsMemberAccess = sendIsMemberAccess;
963 sendIsMemberAccess = false; 962 sendIsMemberAccess = false;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 if (semantics.kind == AccessKind.SUPER_METHOD) { 1070 if (semantics.kind == AccessKind.SUPER_METHOD) {
1072 registry.registerStaticUse(semantics.element.declaration); 1071 registry.registerStaticUse(semantics.element.declaration);
1073 } 1072 }
1074 // TODO(johnniwinther): Remove this when all information goes through 1073 // TODO(johnniwinther): Remove this when all information goes through
1075 // the [SendStructure]. 1074 // the [SendStructure].
1076 registry.useElement(node, semantics.element); 1075 registry.useElement(node, semantics.element);
1077 } 1076 }
1078 } else { 1077 } else {
1079 ResolutionResult expressionResult = visitExpression(expression); 1078 ResolutionResult expressionResult = visitExpression(expression);
1080 semantics = new DynamicAccess.dynamicProperty(expression); 1079 semantics = new DynamicAccess.dynamicProperty(expression);
1081 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1080 registry.registerDynamicInvocation(selector);
1082 1081
1083 if (expressionResult.isConstant) { 1082 if (expressionResult.isConstant) {
1084 bool isValidConstant; 1083 bool isValidConstant;
1085 ConstantExpression expressionConstant = expressionResult.constant; 1084 ConstantExpression expressionConstant = expressionResult.constant;
1086 DartType knownExpressionType = 1085 DartType knownExpressionType =
1087 expressionConstant.getKnownType(coreTypes); 1086 expressionConstant.getKnownType(coreTypes);
1088 switch (operator.kind) { 1087 switch (operator.kind) {
1089 case UnaryOperatorKind.COMPLEMENT: 1088 case UnaryOperatorKind.COMPLEMENT:
1090 isValidConstant = 1089 isValidConstant =
1091 knownExpressionType == coreTypes.intType; 1090 knownExpressionType == coreTypes.intType;
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 registry.registerStaticUse(semantics.element.declaration); 1245 registry.registerStaticUse(semantics.element.declaration);
1247 } 1246 }
1248 // TODO(johnniwinther): Remove this when all information goes through 1247 // TODO(johnniwinther): Remove this when all information goes through
1249 // the [SendStructure]. 1248 // the [SendStructure].
1250 registry.useElement(node, semantics.element); 1249 registry.useElement(node, semantics.element);
1251 } 1250 }
1252 visitExpression(right); 1251 visitExpression(right);
1253 } else { 1252 } else {
1254 ResolutionResult leftResult = visitExpression(left); 1253 ResolutionResult leftResult = visitExpression(left);
1255 ResolutionResult rightResult = visitExpression(right); 1254 ResolutionResult rightResult = visitExpression(right);
1256 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1255 registry.registerDynamicInvocation(selector);
1257 semantics = new DynamicAccess.dynamicProperty(left); 1256 semantics = new DynamicAccess.dynamicProperty(left);
1258 1257
1259 if (leftResult.isConstant && rightResult.isConstant) { 1258 if (leftResult.isConstant && rightResult.isConstant) {
1260 bool isValidConstant; 1259 bool isValidConstant;
1261 ConstantExpression leftConstant = leftResult.constant; 1260 ConstantExpression leftConstant = leftResult.constant;
1262 ConstantExpression rightConstant = leftResult.constant; 1261 ConstantExpression rightConstant = leftResult.constant;
1263 DartType knownLeftType = leftConstant.getKnownType(coreTypes); 1262 DartType knownLeftType = leftConstant.getKnownType(coreTypes);
1264 DartType knownRightType = rightConstant.getKnownType(coreTypes); 1263 DartType knownRightType = rightConstant.getKnownType(coreTypes);
1265 switch (operator.kind) { 1264 switch (operator.kind) {
1266 case BinaryOperatorKind.EQ: 1265 case BinaryOperatorKind.EQ:
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1378 ResolutionResult handleExpressionInvoke(Send node) { 1377 ResolutionResult handleExpressionInvoke(Send node) {
1379 assert(invariant(node, node.isCall, 1378 assert(invariant(node, node.isCall,
1380 message: "Unexpected expression: $node")); 1379 message: "Unexpected expression: $node"));
1381 Node expression = node.selector; 1380 Node expression = node.selector;
1382 visitExpression(expression); 1381 visitExpression(expression);
1383 CallStructure callStructure = resolveArguments(node.argumentsNode); 1382 CallStructure callStructure = resolveArguments(node.argumentsNode);
1384 Selector selector = callStructure.callSelector; 1383 Selector selector = callStructure.callSelector;
1385 // TODO(johnniwinther): Remove this when all information goes through the 1384 // TODO(johnniwinther): Remove this when all information goes through the
1386 // [SendStructure]. 1385 // [SendStructure].
1387 registry.setSelector(node, selector); 1386 registry.setSelector(node, selector);
1388 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 1387 registry.registerDynamicInvocation(selector);
1389 registry.registerSendStructure(node, 1388 registry.registerSendStructure(node,
1390 new InvokeStructure(new AccessSemantics.expression(), selector)); 1389 new InvokeStructure(new AccessSemantics.expression(), selector));
1391 return const NoneResult(); 1390 return const NoneResult();
1392 } 1391 }
1393 1392
1394 /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`. 1393 /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`.
1395 ResolutionResult handleAssert(Send node) { 1394 ResolutionResult handleAssert(Send node) {
1396 assert(invariant(node, node.isCall, 1395 assert(invariant(node, node.isCall,
1397 message: "Unexpected assert: $node")); 1396 message: "Unexpected assert: $node"));
1398 // If this send is of the form "assert(expr);", then 1397 // If this send is of the form "assert(expr);", then
(...skipping 29 matching lines...) Expand all
1428 /// Handle access on `this`, like `this()` and `this` when it is parsed as a 1427 /// Handle access on `this`, like `this()` and `this` when it is parsed as a
1429 /// [Send] node. 1428 /// [Send] node.
1430 ResolutionResult handleThisAccess(Send node) { 1429 ResolutionResult handleThisAccess(Send node) {
1431 AccessSemantics accessSemantics = new AccessSemantics.thisAccess(); 1430 AccessSemantics accessSemantics = new AccessSemantics.thisAccess();
1432 if (node.isCall) { 1431 if (node.isCall) {
1433 CallStructure callStructure = resolveArguments(node.argumentsNode); 1432 CallStructure callStructure = resolveArguments(node.argumentsNode);
1434 Selector selector = callStructure.callSelector; 1433 Selector selector = callStructure.callSelector;
1435 // TODO(johnniwinther): Handle invalid this access as an 1434 // TODO(johnniwinther): Handle invalid this access as an
1436 // [AccessSemantics]. 1435 // [AccessSemantics].
1437 if (checkThisAccess(node)) { 1436 if (checkThisAccess(node)) {
1438 registry.registerDynamicInvocation( 1437 registry.registerDynamicInvocation(selector);
1439 new UniverseSelector(selector, null));
1440 registry.registerSendStructure(node, 1438 registry.registerSendStructure(node,
1441 new InvokeStructure(accessSemantics, selector)); 1439 new InvokeStructure(accessSemantics, selector));
1442 } 1440 }
1443 // TODO(johnniwinther): Remove this when all information goes through 1441 // TODO(johnniwinther): Remove this when all information goes through
1444 // the [SendStructure]. 1442 // the [SendStructure].
1445 registry.setSelector(node, selector); 1443 registry.setSelector(node, selector);
1446 } else { 1444 } else {
1447 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node. 1445 // TODO(johnniwinther): Handle get of `this` when it is a [Send] node.
1448 internalError(node, "Unexpected node '$node'."); 1446 internalError(node, "Unexpected node '$node'.");
1449 } 1447 }
(...skipping 15 matching lines...) Expand all
1465 AccessSemantics semantics = computeSuperAccessSemanticsForSelector( 1463 AccessSemantics semantics = computeSuperAccessSemanticsForSelector(
1466 node, selector, alternateName: name.setter); 1464 node, selector, alternateName: name.setter);
1467 if (node.isCall) { 1465 if (node.isCall) {
1468 bool isIncompatibleInvoke = false; 1466 bool isIncompatibleInvoke = false;
1469 switch (semantics.kind) { 1467 switch (semantics.kind) {
1470 case AccessKind.SUPER_METHOD: 1468 case AccessKind.SUPER_METHOD:
1471 MethodElementX superMethod = semantics.element; 1469 MethodElementX superMethod = semantics.element;
1472 superMethod.computeSignature(compiler); 1470 superMethod.computeSignature(compiler);
1473 if (!callStructure.signatureApplies(superMethod)) { 1471 if (!callStructure.signatureApplies(superMethod)) {
1474 registry.registerThrowNoSuchMethod(); 1472 registry.registerThrowNoSuchMethod();
1475 registry.registerDynamicInvocation( 1473 registry.registerDynamicInvocation(selector);
1476 new UniverseSelector(selector, null));
1477 registry.registerSuperNoSuchMethod(); 1474 registry.registerSuperNoSuchMethod();
1478 isIncompatibleInvoke = true; 1475 isIncompatibleInvoke = true;
1479 } else { 1476 } else {
1480 registry.registerStaticInvocation(semantics.element); 1477 registry.registerStaticInvocation(semantics.element);
1481 } 1478 }
1482 break; 1479 break;
1483 case AccessKind.SUPER_FIELD: 1480 case AccessKind.SUPER_FIELD:
1484 case AccessKind.SUPER_FINAL_FIELD: 1481 case AccessKind.SUPER_FINAL_FIELD:
1485 case AccessKind.SUPER_GETTER: 1482 case AccessKind.SUPER_GETTER:
1486 registry.registerStaticUse(semantics.element); 1483 registry.registerStaticUse(semantics.element);
1487 selector = callStructure.callSelector; 1484 selector = callStructure.callSelector;
1488 registry.registerDynamicInvocation( 1485 registry.registerDynamicInvocation(selector);
1489 new UniverseSelector(selector, null));
1490 break; 1486 break;
1491 case AccessKind.SUPER_SETTER: 1487 case AccessKind.SUPER_SETTER:
1492 case AccessKind.UNRESOLVED_SUPER: 1488 case AccessKind.UNRESOLVED_SUPER:
1493 // NoSuchMethod registered in [computeSuperSemantics]. 1489 // NoSuchMethod registered in [computeSuperSemantics].
1494 break; 1490 break;
1495 default: 1491 default:
1496 internalError(node, "Unexpected super property access $semantics."); 1492 internalError(node, "Unexpected super property access $semantics.");
1497 break; 1493 break;
1498 } 1494 }
1499 registry.registerSendStructure(node, 1495 registry.registerSendStructure(node,
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 } 1701 }
1706 1702
1707 /// Handle dynamic access of [semantics]. 1703 /// Handle dynamic access of [semantics].
1708 ResolutionResult handleDynamicAccessSemantics( 1704 ResolutionResult handleDynamicAccessSemantics(
1709 Send node, Name name, AccessSemantics semantics) { 1705 Send node, Name name, AccessSemantics semantics) {
1710 SendStructure sendStructure; 1706 SendStructure sendStructure;
1711 Selector selector; 1707 Selector selector;
1712 if (node.isCall) { 1708 if (node.isCall) {
1713 CallStructure callStructure = resolveArguments(node.argumentsNode); 1709 CallStructure callStructure = resolveArguments(node.argumentsNode);
1714 selector = new Selector(SelectorKind.CALL, name, callStructure); 1710 selector = new Selector(SelectorKind.CALL, name, callStructure);
1715 registry.registerDynamicInvocation( 1711 registry.registerDynamicInvocation(selector);
1716 new UniverseSelector(selector, null));
1717 sendStructure = new InvokeStructure(semantics, selector); 1712 sendStructure = new InvokeStructure(semantics, selector);
1718 } else { 1713 } else {
1719 assert(invariant(node, node.isPropertyAccess)); 1714 assert(invariant(node, node.isPropertyAccess));
1720 selector = new Selector( 1715 selector = new Selector(
1721 SelectorKind.GETTER, name, CallStructure.NO_ARGS); 1716 SelectorKind.GETTER, name, CallStructure.NO_ARGS);
1722 registry.registerDynamicGetter( 1717 registry.registerDynamicGetter(selector);
1723 new UniverseSelector(selector, null));
1724 sendStructure = new GetStructure(semantics, selector); 1718 sendStructure = new GetStructure(semantics, selector);
1725 } 1719 }
1726 registry.registerSendStructure(node, sendStructure); 1720 registry.registerSendStructure(node, sendStructure);
1727 // TODO(johnniwinther): Remove this when all information goes through 1721 // TODO(johnniwinther): Remove this when all information goes through
1728 // the [SendStructure]. 1722 // the [SendStructure].
1729 registry.setSelector(node, selector); 1723 registry.setSelector(node, selector);
1730 return const NoneResult(); 1724 return const NoneResult();
1731 } 1725 }
1732 1726
1733 /// Handle dynamic property access, like `a.b` or `a.b()` where `a` is not a 1727 /// Handle dynamic property access, like `a.b` or `a.b()` where `a` is not a
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1797 } 1791 }
1798 1792
1799 /// Handle erroneous access of [element] of the given [accessSemantics]. 1793 /// Handle erroneous access of [element] of the given [accessSemantics].
1800 ResolutionResult handleErroneousAccess( 1794 ResolutionResult handleErroneousAccess(
1801 Send node, Name name, Element element, AccessSemantics accessSemantics) { 1795 Send node, Name name, Element element, AccessSemantics accessSemantics) {
1802 SendStructure sendStructure; 1796 SendStructure sendStructure;
1803 Selector selector; 1797 Selector selector;
1804 if (node.isCall) { 1798 if (node.isCall) {
1805 CallStructure callStructure = resolveArguments(node.argumentsNode); 1799 CallStructure callStructure = resolveArguments(node.argumentsNode);
1806 selector = new Selector(SelectorKind.CALL, name, callStructure); 1800 selector = new Selector(SelectorKind.CALL, name, callStructure);
1807 registry.registerDynamicInvocation( 1801 registry.registerDynamicInvocation(selector);
1808 new UniverseSelector(selector, null));
1809 sendStructure = new InvokeStructure(accessSemantics, selector); 1802 sendStructure = new InvokeStructure(accessSemantics, selector);
1810 } else { 1803 } else {
1811 assert(invariant(node, node.isPropertyAccess)); 1804 assert(invariant(node, node.isPropertyAccess));
1812 selector = new Selector( 1805 selector = new Selector(
1813 SelectorKind.GETTER, name, CallStructure.NO_ARGS); 1806 SelectorKind.GETTER, name, CallStructure.NO_ARGS);
1814 registry.registerDynamicGetter( 1807 registry.registerDynamicGetter(selector);
1815 new UniverseSelector(selector, null));
1816 sendStructure = new GetStructure(accessSemantics, selector); 1808 sendStructure = new GetStructure(accessSemantics, selector);
1817 } 1809 }
1818 // TODO(johnniwinther): Remove this when all information goes through 1810 // TODO(johnniwinther): Remove this when all information goes through
1819 // the [SendStructure]. 1811 // the [SendStructure].
1820 registry.setSelector(node, selector); 1812 registry.setSelector(node, selector);
1821 registry.useElement(node, element); 1813 registry.useElement(node, element);
1822 registry.registerSendStructure(node, sendStructure); 1814 registry.registerSendStructure(node, sendStructure);
1823 return const NoneResult(); 1815 return const NoneResult();
1824 } 1816 }
1825 1817
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1873 selector = new Selector(SelectorKind.GETTER, name, callStructure); 1865 selector = new Selector(SelectorKind.GETTER, name, callStructure);
1874 } 1866 }
1875 if (node.isCall) { 1867 if (node.isCall) {
1876 bool isIncompatibleInvoke = false; 1868 bool isIncompatibleInvoke = false;
1877 switch (semantics.kind) { 1869 switch (semantics.kind) {
1878 case AccessKind.LOCAL_FUNCTION: 1870 case AccessKind.LOCAL_FUNCTION:
1879 LocalFunctionElementX function = semantics.element; 1871 LocalFunctionElementX function = semantics.element;
1880 function.computeSignature(compiler); 1872 function.computeSignature(compiler);
1881 if (!callStructure.signatureApplies(function)) { 1873 if (!callStructure.signatureApplies(function)) {
1882 registry.registerThrowNoSuchMethod(); 1874 registry.registerThrowNoSuchMethod();
1883 registry.registerDynamicInvocation( 1875 registry.registerDynamicInvocation(selector);
1884 new UniverseSelector(selector, null));
1885 isIncompatibleInvoke = true; 1876 isIncompatibleInvoke = true;
1886 } 1877 }
1887 break; 1878 break;
1888 case AccessKind.PARAMETER: 1879 case AccessKind.PARAMETER:
1889 case AccessKind.FINAL_PARAMETER: 1880 case AccessKind.FINAL_PARAMETER:
1890 case AccessKind.LOCAL_VARIABLE: 1881 case AccessKind.LOCAL_VARIABLE:
1891 case AccessKind.FINAL_LOCAL_VARIABLE: 1882 case AccessKind.FINAL_LOCAL_VARIABLE:
1892 selector = callStructure.callSelector; 1883 selector = callStructure.callSelector;
1893 registry.registerDynamicInvocation( 1884 registry.registerDynamicInvocation(selector);
1894 new UniverseSelector(selector, null));
1895 break; 1885 break;
1896 default: 1886 default:
1897 internalError(node, 1887 internalError(node,
1898 "Unexpected local access $semantics."); 1888 "Unexpected local access $semantics.");
1899 break; 1889 break;
1900 } 1890 }
1901 registry.registerSendStructure(node, 1891 registry.registerSendStructure(node,
1902 isIncompatibleInvoke 1892 isIncompatibleInvoke
1903 ? new IncompatibleInvokeStructure(semantics, selector) 1893 ? new IncompatibleInvokeStructure(semantics, selector)
1904 : new InvokeStructure(semantics, selector)); 1894 : new InvokeStructure(semantics, selector));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 computeStaticOrTopLevelAccessSemantics(node, member); 1939 computeStaticOrTopLevelAccessSemantics(node, member);
1950 if (node.isCall) { 1940 if (node.isCall) {
1951 bool isIncompatibleInvoke = false; 1941 bool isIncompatibleInvoke = false;
1952 switch (semantics.kind) { 1942 switch (semantics.kind) {
1953 case AccessKind.STATIC_METHOD: 1943 case AccessKind.STATIC_METHOD:
1954 case AccessKind.TOPLEVEL_METHOD: 1944 case AccessKind.TOPLEVEL_METHOD:
1955 MethodElementX method = semantics.element; 1945 MethodElementX method = semantics.element;
1956 method.computeSignature(compiler); 1946 method.computeSignature(compiler);
1957 if (!callStructure.signatureApplies(method)) { 1947 if (!callStructure.signatureApplies(method)) {
1958 registry.registerThrowNoSuchMethod(); 1948 registry.registerThrowNoSuchMethod();
1959 registry.registerDynamicInvocation( 1949 registry.registerDynamicInvocation(selector);
1960 new UniverseSelector(selector, null));
1961 isIncompatibleInvoke = true; 1950 isIncompatibleInvoke = true;
1962 } else { 1951 } else {
1963 registry.registerStaticUse(semantics.element); 1952 registry.registerStaticUse(semantics.element);
1964 handleForeignCall(node, semantics.element, selector); 1953 handleForeignCall(node, semantics.element, selector);
1965 } 1954 }
1966 break; 1955 break;
1967 case AccessKind.STATIC_FIELD: 1956 case AccessKind.STATIC_FIELD:
1968 case AccessKind.FINAL_STATIC_FIELD: 1957 case AccessKind.FINAL_STATIC_FIELD:
1969 case AccessKind.STATIC_GETTER: 1958 case AccessKind.STATIC_GETTER:
1970 case AccessKind.TOPLEVEL_FIELD: 1959 case AccessKind.TOPLEVEL_FIELD:
1971 case AccessKind.FINAL_TOPLEVEL_FIELD: 1960 case AccessKind.FINAL_TOPLEVEL_FIELD:
1972 case AccessKind.TOPLEVEL_GETTER: 1961 case AccessKind.TOPLEVEL_GETTER:
1973 registry.registerStaticUse(semantics.element); 1962 registry.registerStaticUse(semantics.element);
1974 selector = callStructure.callSelector; 1963 selector = callStructure.callSelector;
1975 registry.registerDynamicInvocation( 1964 registry.registerDynamicInvocation(selector);
1976 new UniverseSelector(selector, null));
1977 break; 1965 break;
1978 case AccessKind.STATIC_SETTER: 1966 case AccessKind.STATIC_SETTER:
1979 case AccessKind.TOPLEVEL_SETTER: 1967 case AccessKind.TOPLEVEL_SETTER:
1980 case AccessKind.UNRESOLVED: 1968 case AccessKind.UNRESOLVED:
1981 registry.registerThrowNoSuchMethod(); 1969 registry.registerThrowNoSuchMethod();
1982 member = reportAndCreateErroneousElement( 1970 member = reportAndCreateErroneousElement(
1983 node.selector, name.text, 1971 node.selector, name.text,
1984 MessageKind.CANNOT_RESOLVE_GETTER, const {}); 1972 MessageKind.CANNOT_RESOLVE_GETTER, const {});
1985 break; 1973 break;
1986 default: 1974 default:
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 2177
2190 if (node.isCall) { 2178 if (node.isCall) {
2191 if (Elements.isUnresolved(target) || 2179 if (Elements.isUnresolved(target) ||
2192 target.isGetter || 2180 target.isGetter ||
2193 target.isField || 2181 target.isField ||
2194 Elements.isClosureSend(node, target)) { 2182 Elements.isClosureSend(node, target)) {
2195 // If we don't know what we're calling or if we are calling a getter, 2183 // If we don't know what we're calling or if we are calling a getter,
2196 // we need to register that fact that we may be calling a closure 2184 // we need to register that fact that we may be calling a closure
2197 // with the same arguments. 2185 // with the same arguments.
2198 Selector call = new Selector.callClosureFrom(selector); 2186 Selector call = new Selector.callClosureFrom(selector);
2199 registry.registerDynamicInvocation( 2187 registry.registerDynamicInvocation(call);
2200 new UniverseSelector(selector, null));
2201 } else if (target.impliesType) { 2188 } else if (target.impliesType) {
2202 // We call 'call()' on a Type instance returned from the reference to a 2189 // We call 'call()' on a Type instance returned from the reference to a
2203 // class or typedef literal. We do not need to register this call as a 2190 // class or typedef literal. We do not need to register this call as a
2204 // dynamic invocation, because we statically know what the target is. 2191 // dynamic invocation, because we statically know what the target is.
2205 } else { 2192 } else {
2206 if (target is FunctionElement) { 2193 if (target is FunctionElement) {
2207 FunctionElement function = target; 2194 FunctionElement function = target;
2208 function.computeType(compiler); 2195 function.computeType(compiler);
2209 } 2196 }
2210 if (!selector.applies(target, compiler.world)) { 2197 if (!selector.applies(target, compiler.world)) {
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2365 {'className': currentClass.name, 'memberName': selector.name}); 2352 {'className': currentClass.name, 'memberName': selector.name});
2366 registry.registerSuperNoSuchMethod(); 2353 registry.registerSuperNoSuchMethod();
2367 } 2354 }
2368 } 2355 }
2369 registry.useElement(node.selector, getter); 2356 registry.useElement(node.selector, getter);
2370 2357
2371 // Make sure we include the + and - operators if we are using 2358 // Make sure we include the + and - operators if we are using
2372 // the ++ and -- ones. Also, if op= form is used, include op itself. 2359 // the ++ and -- ones. Also, if op= form is used, include op itself.
2373 void registerBinaryOperator(String name) { 2360 void registerBinaryOperator(String name) {
2374 Selector binop = new Selector.binaryOperator(name); 2361 Selector binop = new Selector.binaryOperator(name);
2375 registry.registerDynamicInvocation( 2362 registry.registerDynamicInvocation(binop);
2376 new UniverseSelector(binop, null));
2377 registry.setOperatorSelectorInComplexSendSet(node, binop); 2363 registry.setOperatorSelectorInComplexSendSet(node, binop);
2378 } 2364 }
2379 if (identical(source, '++')) { 2365 if (identical(source, '++')) {
2380 registerBinaryOperator('+'); 2366 registerBinaryOperator('+');
2381 registry.registerInstantiatedClass(compiler.intClass); 2367 registry.registerInstantiatedClass(compiler.intClass);
2382 } else if (identical(source, '--')) { 2368 } else if (identical(source, '--')) {
2383 registerBinaryOperator('-'); 2369 registerBinaryOperator('-');
2384 registry.registerInstantiatedClass(compiler.intClass); 2370 registry.registerInstantiatedClass(compiler.intClass);
2385 } else if (source.endsWith('=')) { 2371 } else if (source.endsWith('=')) {
2386 registerBinaryOperator(Elements.mapToUserOperator(operatorName)); 2372 registerBinaryOperator(Elements.mapToUserOperator(operatorName));
2387 } 2373 }
2388 } 2374 }
2389 2375
2390 registerSend(selector, setter); 2376 registerSend(selector, setter);
2391 return new ResolutionResult.forElement(registry.useElement(node, setter)); 2377 return new ResolutionResult.forElement(registry.useElement(node, setter));
2392 } 2378 }
2393 2379
2394 void registerSend(Selector selector, Element target) { 2380 void registerSend(Selector selector, Element target) {
2395 if (target == null || target.isInstanceMember) { 2381 if (target == null || target.isInstanceMember) {
2396 if (selector.isGetter) { 2382 if (selector.isGetter) {
2397 registry.registerDynamicGetter( 2383 registry.registerDynamicGetter(selector);
2398 new UniverseSelector(selector, null));
2399 } else if (selector.isSetter) { 2384 } else if (selector.isSetter) {
2400 registry.registerDynamicSetter( 2385 registry.registerDynamicSetter(selector);
2401 new UniverseSelector(selector, null));
2402 } else { 2386 } else {
2403 registry.registerDynamicInvocation( 2387 registry.registerDynamicInvocation(selector);
2404 new UniverseSelector(selector, null));
2405 } 2388 }
2406 } else if (Elements.isStaticOrTopLevel(target)) { 2389 } else if (Elements.isStaticOrTopLevel(target)) {
2407 // Avoid registration of type variables since they are not analyzable but 2390 // Avoid registration of type variables since they are not analyzable but
2408 // instead resolved through their enclosing type declaration. 2391 // instead resolved through their enclosing type declaration.
2409 if (!target.isTypeVariable) { 2392 if (!target.isTypeVariable) {
2410 // [target] might be the implementation element and only declaration 2393 // [target] might be the implementation element and only declaration
2411 // elements may be registered. 2394 // elements may be registered.
2412 registry.registerStaticUse(target.declaration); 2395 registry.registerStaticUse(target.declaration);
2413 } 2396 }
2414 } 2397 }
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
3021 } 3004 }
3022 label.setContinueTarget(); 3005 label.setContinueTarget();
3023 registry.useLabel(node, label); 3006 registry.useLabel(node, label);
3024 } 3007 }
3025 registry.registerTargetOf(node, target); 3008 registry.registerTargetOf(node, target);
3026 return const NoneResult(); 3009 return const NoneResult();
3027 } 3010 }
3028 3011
3029 registerImplicitInvocation(String name, int arity) { 3012 registerImplicitInvocation(String name, int arity) {
3030 Selector selector = new Selector.call(name, null, arity); 3013 Selector selector = new Selector.call(name, null, arity);
3031 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); 3014 registry.registerDynamicInvocation(selector);
3032 } 3015 }
3033 3016
3034 ResolutionResult visitAsyncForIn(AsyncForIn node) { 3017 ResolutionResult visitAsyncForIn(AsyncForIn node) {
3035 registry.registerAsyncForIn(node); 3018 registry.registerAsyncForIn(node);
3036 registry.setCurrentSelector(node, compiler.currentSelector); 3019 registry.setCurrentSelector(node, compiler.currentSelector);
3037 registry.registerDynamicGetter( 3020 registry.registerDynamicGetter(compiler.currentSelector);
3038 new UniverseSelector(compiler.currentSelector, null));
3039 registry.setMoveNextSelector(node, compiler.moveNextSelector); 3021 registry.setMoveNextSelector(node, compiler.moveNextSelector);
3040 registry.registerDynamicInvocation( 3022 registry.registerDynamicInvocation(compiler.moveNextSelector);
3041 new UniverseSelector(compiler.moveNextSelector, null));
3042 3023
3043 visit(node.expression); 3024 visit(node.expression);
3044 3025
3045 Scope blockScope = new BlockScope(scope); 3026 Scope blockScope = new BlockScope(scope);
3046 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); 3027 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope);
3047 visitLoopBodyIn(node, node.body, blockScope); 3028 visitLoopBodyIn(node, node.body, blockScope);
3048 return const NoneResult(); 3029 return const NoneResult();
3049 } 3030 }
3050 3031
3051 ResolutionResult visitSyncForIn(SyncForIn node) { 3032 ResolutionResult visitSyncForIn(SyncForIn node) {
3052 registry.registerSyncForIn(node); 3033 registry.registerSyncForIn(node);
3053 registry.setIteratorSelector(node, compiler.iteratorSelector); 3034 registry.setIteratorSelector(node, compiler.iteratorSelector);
3054 registry.registerDynamicGetter( 3035 registry.registerDynamicGetter(compiler.iteratorSelector);
3055 new UniverseSelector(compiler.iteratorSelector, null));
3056 registry.setCurrentSelector(node, compiler.currentSelector); 3036 registry.setCurrentSelector(node, compiler.currentSelector);
3057 registry.registerDynamicGetter( 3037 registry.registerDynamicGetter(compiler.currentSelector);
3058 new UniverseSelector(compiler.currentSelector, null));
3059 registry.setMoveNextSelector(node, compiler.moveNextSelector); 3038 registry.setMoveNextSelector(node, compiler.moveNextSelector);
3060 registry.registerDynamicInvocation( 3039 registry.registerDynamicInvocation(compiler.moveNextSelector);
3061 new UniverseSelector(compiler.moveNextSelector, null));
3062 3040
3063 visit(node.expression); 3041 visit(node.expression);
3064 3042
3065 Scope blockScope = new BlockScope(scope); 3043 Scope blockScope = new BlockScope(scope);
3066 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope); 3044 visitForInDeclaredIdentifierIn(node.declaredIdentifier, node, blockScope);
3067 visitLoopBodyIn(node, node.body, blockScope); 3045 visitLoopBodyIn(node, node.body, blockScope);
3068 return const NoneResult(); 3046 return const NoneResult();
3069 } 3047 }
3070 3048
3071 void visitForInDeclaredIdentifierIn( 3049 void visitForInDeclaredIdentifierIn(
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
3483 } 3461 }
3484 return const NoneResult(); 3462 return const NoneResult();
3485 } 3463 }
3486 } 3464 }
3487 3465
3488 /// Looks up [name] in [scope] and unwraps the result. 3466 /// Looks up [name] in [scope] and unwraps the result.
3489 Element lookupInScope(Compiler compiler, Node node, 3467 Element lookupInScope(Compiler compiler, Node node,
3490 Scope scope, String name) { 3468 Scope scope, String name) {
3491 return Elements.unwrap(scope.lookup(name), compiler, node); 3469 return Elements.unwrap(scope.lookup(name), compiler, node);
3492 } 3470 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/program_builder.dart ('k') | pkg/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698