| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 /// This file declares a "shadow hierarchy" of concrete classes which extend | 5 /// This file declares a "shadow hierarchy" of concrete classes which extend |
| 6 /// the kernel class hierarchy, adding methods and fields needed by the | 6 /// the kernel class hierarchy, adding methods and fields needed by the |
| 7 /// BodyBuilder. | 7 /// BodyBuilder. |
| 8 /// | 8 /// |
| 9 /// Instances of these classes may be created using the factory methods in | 9 /// Instances of these classes may be created using the factory methods in |
| 10 /// `ast_factory.dart`. | 10 /// `ast_factory.dart`. |
| (...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 } | 571 } |
| 572 | 572 |
| 573 @override | 573 @override |
| 574 DartType _inferExpression( | 574 DartType _inferExpression( |
| 575 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 575 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 576 // TODO(scheglov): implement. | 576 // TODO(scheglov): implement. |
| 577 return typeNeeded ? const DynamicType() : null; | 577 return typeNeeded ? const DynamicType() : null; |
| 578 } | 578 } |
| 579 } | 579 } |
| 580 | 580 |
| 581 /// Shadow object for [DirectPropertySet]. | |
| 582 class KernelDirectPropertySet extends DirectPropertySet | |
| 583 implements KernelExpression { | |
| 584 KernelDirectPropertySet(Expression receiver, Member target, Expression value) | |
| 585 : super(receiver, target, value); | |
| 586 | |
| 587 KernelDirectPropertySet.byReference( | |
| 588 Expression receiver, Reference targetReference, Expression value) | |
| 589 : super.byReference(receiver, targetReference, value); | |
| 590 | |
| 591 @override | |
| 592 void _collectDependencies(KernelDependencyCollector collector) { | |
| 593 // Assignment expressions are not immediately evident expressions. | |
| 594 collector.recordNotImmediatelyEvident(fileOffset); | |
| 595 } | |
| 596 | |
| 597 @override | |
| 598 DartType _inferExpression( | |
| 599 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | |
| 600 // TODO(scheglov): implement. | |
| 601 return typeNeeded ? const DynamicType() : null; | |
| 602 } | |
| 603 } | |
| 604 | |
| 605 /// Concrete shadow object representing a double literal in kernel form. | 581 /// Concrete shadow object representing a double literal in kernel form. |
| 606 class KernelDoubleLiteral extends DoubleLiteral implements KernelExpression { | 582 class KernelDoubleLiteral extends DoubleLiteral implements KernelExpression { |
| 607 KernelDoubleLiteral(double value) : super(value); | 583 KernelDoubleLiteral(double value) : super(value); |
| 608 | 584 |
| 609 @override | 585 @override |
| 610 void _collectDependencies(KernelDependencyCollector collector) { | 586 void _collectDependencies(KernelDependencyCollector collector) { |
| 611 // No inference dependencies. | 587 // No inference dependencies. |
| 612 } | 588 } |
| 613 | 589 |
| 614 @override | 590 @override |
| (...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1486 } | 1462 } |
| 1487 interfaceTarget = interfaceMember; | 1463 interfaceTarget = interfaceMember; |
| 1488 var inferredType = | 1464 var inferredType = |
| 1489 inferrer.getCalleeType(interfaceMember, receiverType, name); | 1465 inferrer.getCalleeType(interfaceMember, receiverType, name); |
| 1490 // TODO(paulberry): Infer tear-off type arguments if appropriate. | 1466 // TODO(paulberry): Infer tear-off type arguments if appropriate. |
| 1491 inferrer.listener.propertyGetExit(this, inferredType); | 1467 inferrer.listener.propertyGetExit(this, inferredType); |
| 1492 return typeNeeded ? inferredType : null; | 1468 return typeNeeded ? inferredType : null; |
| 1493 } | 1469 } |
| 1494 } | 1470 } |
| 1495 | 1471 |
| 1496 /// Shadow object for [PropertyGet]. | |
| 1497 class KernelPropertySet extends PropertySet implements KernelExpression { | |
| 1498 KernelPropertySet(Expression receiver, Name name, Expression value, | |
| 1499 [Member interfaceTarget]) | |
| 1500 : super(receiver, name, value, interfaceTarget); | |
| 1501 | |
| 1502 KernelPropertySet.byReference(Expression receiver, Name name, | |
| 1503 Expression value, Reference interfaceTargetReference) | |
| 1504 : super.byReference(receiver, name, value, interfaceTargetReference); | |
| 1505 | |
| 1506 @override | |
| 1507 void _collectDependencies(KernelDependencyCollector collector) { | |
| 1508 // Assignment expressions are not immediately evident expressions. | |
| 1509 collector.recordNotImmediatelyEvident(fileOffset); | |
| 1510 } | |
| 1511 | |
| 1512 @override | |
| 1513 DartType _inferExpression( | |
| 1514 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | |
| 1515 typeNeeded = | |
| 1516 inferrer.listener.propertySetEnter(this, typeContext) || typeNeeded; | |
| 1517 // First infer the receiver so we can look up the setter that was invoked. | |
| 1518 var receiverType = inferrer.inferExpression(receiver, null, true); | |
| 1519 Member interfaceMember = inferrer | |
| 1520 .findInterfaceMember(receiverType, name, fileOffset, setter: true); | |
| 1521 interfaceTarget = interfaceMember; | |
| 1522 var setterType = inferrer.getSetterType(interfaceMember, receiverType); | |
| 1523 var inferredType = inferrer.inferExpression(value, setterType, typeNeeded); | |
| 1524 inferrer.listener.propertySetExit(this, inferredType); | |
| 1525 return typeNeeded ? inferredType : null; | |
| 1526 } | |
| 1527 } | |
| 1528 | |
| 1529 /// Concrete shadow object representing a redirecting initializer in kernel | 1472 /// Concrete shadow object representing a redirecting initializer in kernel |
| 1530 /// form. | 1473 /// form. |
| 1531 class KernelRedirectingInitializer extends RedirectingInitializer | 1474 class KernelRedirectingInitializer extends RedirectingInitializer |
| 1532 implements KernelInitializer { | 1475 implements KernelInitializer { |
| 1533 KernelRedirectingInitializer(Constructor target, Arguments arguments) | 1476 KernelRedirectingInitializer(Constructor target, Arguments arguments) |
| 1534 : super(target, arguments); | 1477 : super(target, arguments); |
| 1535 | 1478 |
| 1536 @override | 1479 @override |
| 1537 _inferInitializer(KernelTypeInferrer inferrer) { | 1480 _inferInitializer(KernelTypeInferrer inferrer) { |
| 1538 inferrer.listener.redirectingInitializerEnter(this); | 1481 inferrer.listener.redirectingInitializerEnter(this); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1689 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) || | 1632 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) || |
| 1690 typeNeeded; | 1633 typeNeeded; |
| 1691 var calleeType = target.function.functionType; | 1634 var calleeType = target.function.functionType; |
| 1692 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded, | 1635 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded, |
| 1693 fileOffset, calleeType, calleeType.returnType, arguments); | 1636 fileOffset, calleeType, calleeType.returnType, arguments); |
| 1694 inferrer.listener.staticInvocationExit(this, inferredType); | 1637 inferrer.listener.staticInvocationExit(this, inferredType); |
| 1695 return inferredType; | 1638 return inferredType; |
| 1696 } | 1639 } |
| 1697 } | 1640 } |
| 1698 | 1641 |
| 1699 /// Shadow object for [StaticSet]. | |
| 1700 class KernelStaticSet extends StaticSet implements KernelExpression { | |
| 1701 KernelStaticSet(Member target, Expression value) : super(target, value); | |
| 1702 | |
| 1703 KernelStaticSet.byReference(Reference targetReference, Expression value) | |
| 1704 : super.byReference(targetReference, value); | |
| 1705 | |
| 1706 @override | |
| 1707 void _collectDependencies(KernelDependencyCollector collector) { | |
| 1708 // Assignment expressions are not immediately evident expressions. | |
| 1709 collector.recordNotImmediatelyEvident(fileOffset); | |
| 1710 } | |
| 1711 | |
| 1712 @override | |
| 1713 DartType _inferExpression( | |
| 1714 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | |
| 1715 // TODO(scheglov): implement. | |
| 1716 return typeNeeded ? const DynamicType() : null; | |
| 1717 } | |
| 1718 } | |
| 1719 | |
| 1720 /// Concrete shadow object representing a string concatenation in kernel form. | 1642 /// Concrete shadow object representing a string concatenation in kernel form. |
| 1721 class KernelStringConcatenation extends StringConcatenation | 1643 class KernelStringConcatenation extends StringConcatenation |
| 1722 implements KernelExpression { | 1644 implements KernelExpression { |
| 1723 KernelStringConcatenation(List<Expression> expressions) : super(expressions); | 1645 KernelStringConcatenation(List<Expression> expressions) : super(expressions); |
| 1724 | 1646 |
| 1725 @override | 1647 @override |
| 1726 void _collectDependencies(KernelDependencyCollector collector) { | 1648 void _collectDependencies(KernelDependencyCollector collector) { |
| 1727 // No inference dependencies. | 1649 // No inference dependencies. |
| 1728 } | 1650 } |
| 1729 | 1651 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1810 } | 1732 } |
| 1811 | 1733 |
| 1812 @override | 1734 @override |
| 1813 DartType _inferExpression( | 1735 DartType _inferExpression( |
| 1814 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1736 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1815 // TODO(scheglov): implement. | 1737 // TODO(scheglov): implement. |
| 1816 return typeNeeded ? const DynamicType() : null; | 1738 return typeNeeded ? const DynamicType() : null; |
| 1817 } | 1739 } |
| 1818 } | 1740 } |
| 1819 | 1741 |
| 1820 /// Shadow object for [SuperPropertySet]. | |
| 1821 class KernelSuperPropertySet extends SuperPropertySet | |
| 1822 implements KernelExpression { | |
| 1823 KernelSuperPropertySet(Name name, Expression value, Member interfaceTarget) | |
| 1824 : super(name, value, interfaceTarget); | |
| 1825 | |
| 1826 KernelSuperPropertySet.byReference( | |
| 1827 Name name, Expression value, Reference interfaceTargetReference) | |
| 1828 : super.byReference(name, value, interfaceTargetReference); | |
| 1829 | |
| 1830 @override | |
| 1831 void _collectDependencies(KernelDependencyCollector collector) { | |
| 1832 // Assignment expressions are not immediately evident expressions. | |
| 1833 collector.recordNotImmediatelyEvident(fileOffset); | |
| 1834 } | |
| 1835 | |
| 1836 @override | |
| 1837 DartType _inferExpression( | |
| 1838 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | |
| 1839 // TODO(scheglov): implement. | |
| 1840 return typeNeeded ? const DynamicType() : null; | |
| 1841 } | |
| 1842 } | |
| 1843 | |
| 1844 /// Shadow object for [SymbolLiteral]. | 1742 /// Shadow object for [SymbolLiteral]. |
| 1845 class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression { | 1743 class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression { |
| 1846 KernelSymbolLiteral(String value) : super(value); | 1744 KernelSymbolLiteral(String value) : super(value); |
| 1847 | 1745 |
| 1848 @override | 1746 @override |
| 1849 void _collectDependencies(KernelDependencyCollector collector) { | 1747 void _collectDependencies(KernelDependencyCollector collector) { |
| 1850 // No inference dependencies. | 1748 // No inference dependencies. |
| 1851 } | 1749 } |
| 1852 | 1750 |
| 1853 @override | 1751 @override |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2218 'promotedType', new InstrumentationValueForType(promotedType)); | 2116 'promotedType', new InstrumentationValueForType(promotedType)); |
| 2219 } | 2117 } |
| 2220 this.promotedType = promotedType; | 2118 this.promotedType = promotedType; |
| 2221 var inferredType = | 2119 var inferredType = |
| 2222 typeNeeded ? (promotedType ?? declaredOrInferredType) : null; | 2120 typeNeeded ? (promotedType ?? declaredOrInferredType) : null; |
| 2223 inferrer.listener.variableGetExit(this, inferredType); | 2121 inferrer.listener.variableGetExit(this, inferredType); |
| 2224 return inferredType; | 2122 return inferredType; |
| 2225 } | 2123 } |
| 2226 } | 2124 } |
| 2227 | 2125 |
| 2228 /// Concrete shadow object representing a write to a variable in kernel form. | |
| 2229 class KernelVariableSet extends VariableSet implements KernelExpression { | |
| 2230 KernelVariableSet(VariableDeclaration variable, Expression value) | |
| 2231 : super(variable, value); | |
| 2232 | |
| 2233 @override | |
| 2234 void _collectDependencies(KernelDependencyCollector collector) { | |
| 2235 // Assignment expressions are not immediately evident expressions. | |
| 2236 collector.recordNotImmediatelyEvident(fileOffset); | |
| 2237 } | |
| 2238 | |
| 2239 @override | |
| 2240 DartType _inferExpression( | |
| 2241 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | |
| 2242 var variable = this.variable as KernelVariableDeclaration; | |
| 2243 typeNeeded = | |
| 2244 inferrer.listener.variableSetEnter(this, typeContext) || typeNeeded; | |
| 2245 var inferredType = | |
| 2246 inferrer.inferExpression(value, variable.type, typeNeeded); | |
| 2247 inferrer.listener.variableSetExit(this, inferredType); | |
| 2248 return inferredType; | |
| 2249 } | |
| 2250 } | |
| 2251 | |
| 2252 /// Concrete shadow object representing a yield statement in kernel form. | 2126 /// Concrete shadow object representing a yield statement in kernel form. |
| 2253 class KernelYieldStatement extends YieldStatement implements KernelStatement { | 2127 class KernelYieldStatement extends YieldStatement implements KernelStatement { |
| 2254 KernelYieldStatement(Expression expression, {bool isYieldStar: false}) | 2128 KernelYieldStatement(Expression expression, {bool isYieldStar: false}) |
| 2255 : super(expression, isYieldStar: isYieldStar); | 2129 : super(expression, isYieldStar: isYieldStar); |
| 2256 | 2130 |
| 2257 @override | 2131 @override |
| 2258 void _inferStatement(KernelTypeInferrer inferrer) { | 2132 void _inferStatement(KernelTypeInferrer inferrer) { |
| 2259 inferrer.listener.yieldStatementEnter(this); | 2133 inferrer.listener.yieldStatementEnter(this); |
| 2260 var closureContext = inferrer.closureContext; | 2134 var closureContext = inferrer.closureContext; |
| 2261 var typeContext = | 2135 var typeContext = |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2287 } | 2161 } |
| 2288 | 2162 |
| 2289 transformChildren(v) { | 2163 transformChildren(v) { |
| 2290 return internalError("Internal error: Unsupported operation."); | 2164 return internalError("Internal error: Unsupported operation."); |
| 2291 } | 2165 } |
| 2292 | 2166 |
| 2293 visitChildren(v) { | 2167 visitChildren(v) { |
| 2294 return internalError("Internal error: Unsupported operation."); | 2168 return internalError("Internal error: Unsupported operation."); |
| 2295 } | 2169 } |
| 2296 } | 2170 } |
| OLD | NEW |