OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 simple_types_inferrer; | 5 library simple_types_inferrer; |
6 | 6 |
7 import '../closure.dart' show | 7 import '../closure.dart' show |
8 ClosureClassMap, | 8 ClosureClassMap, |
9 ClosureScope; | 9 ClosureScope; |
10 import '../common/names.dart' show | 10 import '../common/names.dart' show |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 bool isIncrementOrDecrement = op == '++' || op == '--'; | 843 bool isIncrementOrDecrement = op == '++' || op == '--'; |
844 | 844 |
845 T receiverType; | 845 T receiverType; |
846 bool isCallOnThis = false; | 846 bool isCallOnThis = false; |
847 if (node.receiver == null) { | 847 if (node.receiver == null) { |
848 if (treatAsInstanceMember(element)) { | 848 if (treatAsInstanceMember(element)) { |
849 receiverType = thisType; | 849 receiverType = thisType; |
850 isCallOnThis = true; | 850 isCallOnThis = true; |
851 } | 851 } |
852 } else { | 852 } else { |
853 receiverType = visit(node.receiver); | 853 if (node.receiver != null && elements[node.receiver] is! PrefixElement) { |
| 854 // TODO(johnniwinther): Avoid blindly recursing on the receiver. |
| 855 receiverType = visit(node.receiver); |
| 856 } |
854 isCallOnThis = isThisOrSuper(node.receiver); | 857 isCallOnThis = isThisOrSuper(node.receiver); |
855 } | 858 } |
856 | 859 |
857 T rhsType; | 860 T rhsType; |
858 | 861 |
859 if (isIncrementOrDecrement) { | 862 if (isIncrementOrDecrement) { |
860 rhsType = types.uint31Type; | 863 rhsType = types.uint31Type; |
861 if (node.isIndex) visit(node.arguments.head); | 864 if (node.isIndex) visit(node.arguments.head); |
862 } else if (node.isIndex) { | 865 } else if (node.isIndex) { |
863 visit(node.arguments.head); | 866 visit(node.arguments.head); |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1350 Element element) { | 1353 Element element) { |
1351 // TODO(herhut): We could do better here if we knew what we | 1354 // TODO(herhut): We could do better here if we knew what we |
1352 // are calling does not expose this. | 1355 // are calling does not expose this. |
1353 isThisExposed = true; | 1356 isThisExposed = true; |
1354 Selector selector = elements.getSelector(node); | 1357 Selector selector = elements.getSelector(node); |
1355 TypeMask mask = elements.getTypeMask(node); | 1358 TypeMask mask = elements.getTypeMask(node); |
1356 return handleStaticSend( | 1359 return handleStaticSend( |
1357 node, selector, mask, element, null); | 1360 node, selector, mask, element, null); |
1358 } | 1361 } |
1359 | 1362 |
1360 /// Handle super constructor invocation. | |
1361 @override | |
1362 T handleSuperConstructorInvoke(ast.Send node) { | |
1363 Element element = elements[node]; | |
1364 ArgumentsTypes arguments = analyzeArguments(node.arguments); | |
1365 assert(visitingInitializers); | |
1366 seenSuperConstructorCall = true; | |
1367 analyzeSuperConstructorCall(element, arguments); | |
1368 Selector selector = elements.getSelector(node); | |
1369 TypeMask mask = elements.getTypeMask(node); | |
1370 return handleStaticSend( | |
1371 node, selector, mask, element, arguments); | |
1372 } | |
1373 | |
1374 @override | 1363 @override |
1375 T visitUnresolvedSuperIndex( | 1364 T visitUnresolvedSuperIndex( |
1376 ast.Send node, | 1365 ast.Send node, |
1377 Element element, | 1366 Element element, |
1378 ast.Node index, | 1367 ast.Node index, |
1379 _) { | 1368 _) { |
1380 return handleErroneousSuperSend(node); | 1369 return handleErroneousSuperSend(node); |
1381 } | 1370 } |
1382 | 1371 |
1383 @override | 1372 @override |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1474 ast.Send node, | 1463 ast.Send node, |
1475 MethodElement method, | 1464 MethodElement method, |
1476 ast.NodeList arguments, | 1465 ast.NodeList arguments, |
1477 CallStructure callStructure, | 1466 CallStructure callStructure, |
1478 _) { | 1467 _) { |
1479 return handleSuperMethodInvoke( | 1468 return handleSuperMethodInvoke( |
1480 node, method, analyzeArguments(arguments.nodes)); | 1469 node, method, analyzeArguments(arguments.nodes)); |
1481 } | 1470 } |
1482 | 1471 |
1483 @override | 1472 @override |
| 1473 T visitSuperSetterInvoke( |
| 1474 ast.Send node, |
| 1475 FunctionElement setter, |
| 1476 ast.NodeList arguments, |
| 1477 CallStructure callStructure, |
| 1478 _) { |
| 1479 return handleErroneousSuperSend(node); |
| 1480 } |
| 1481 |
| 1482 @override |
1484 T visitSuperIndex( | 1483 T visitSuperIndex( |
1485 ast.Send node, | 1484 ast.Send node, |
1486 MethodElement method, | 1485 MethodElement method, |
1487 ast.Node index, | 1486 ast.Node index, |
1488 _) { | 1487 _) { |
1489 return handleSuperMethodInvoke( | 1488 return handleSuperMethodInvoke( |
1490 node, method, analyzeArguments(node.arguments)); | 1489 node, method, analyzeArguments(node.arguments)); |
1491 } | 1490 } |
1492 | 1491 |
1493 @override | 1492 @override |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1656 constructor.enclosingClass.lookupMember('[]')); | 1655 constructor.enclosingClass.lookupMember('[]')); |
1657 return inferrer.concreteTypes.putIfAbsent( | 1656 return inferrer.concreteTypes.putIfAbsent( |
1658 node, () => types.allocateList( | 1657 node, () => types.allocateList( |
1659 types.nonNullExact(constructor.enclosingClass), node, | 1658 types.nonNullExact(constructor.enclosingClass), node, |
1660 outermostElement, elementType, length)); | 1659 outermostElement, elementType, length)); |
1661 } else { | 1660 } else { |
1662 return returnType; | 1661 return returnType; |
1663 } | 1662 } |
1664 } | 1663 } |
1665 | 1664 |
1666 T handleNewExpression(ast.NewExpression node) { | 1665 @override |
| 1666 T bulkHandleNew(ast.NewExpression node, _) { |
1667 Element element = elements[node.send]; | 1667 Element element = elements[node.send]; |
1668 return handleConstructorSend(node.send, element); | 1668 return handleConstructorSend(node.send, element); |
1669 } | 1669 } |
1670 | 1670 |
1671 /// Handle invocation of a top level or static field or getter [element]. | 1671 /// Handle invocation of a top level or static field or getter [element]. |
1672 T handleStaticFieldOrGetterInvoke(ast.Send node, Element element) { | 1672 T handleStaticFieldOrGetterInvoke(ast.Send node, Element element) { |
1673 ArgumentsTypes arguments = analyzeArguments(node.arguments); | 1673 ArgumentsTypes arguments = analyzeArguments(node.arguments); |
1674 Selector selector = elements.getSelector(node); | 1674 Selector selector = elements.getSelector(node); |
1675 TypeMask mask = elements.getTypeMask(node); | 1675 TypeMask mask = elements.getTypeMask(node); |
1676 handleStaticSend(node, selector, mask, element, arguments); | 1676 handleStaticSend(node, selector, mask, element, arguments); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1838 } else { | 1838 } else { |
1839 positional.add(argument.accept(this)); | 1839 positional.add(argument.accept(this)); |
1840 } | 1840 } |
1841 // TODO(ngeoffray): We could do better here if we knew what we | 1841 // TODO(ngeoffray): We could do better here if we knew what we |
1842 // are calling does not expose this. | 1842 // are calling does not expose this. |
1843 isThisExposed = isThisExposed || argument.isThis(); | 1843 isThisExposed = isThisExposed || argument.isThis(); |
1844 } | 1844 } |
1845 return new ArgumentsTypes<T>(positional, named); | 1845 return new ArgumentsTypes<T>(positional, named); |
1846 } | 1846 } |
1847 | 1847 |
1848 T visitGetterSend(ast.Send node) { | |
1849 if (elements[node] is! PrefixElement) { | |
1850 // TODO(johnniwinther): Remove this when no longer called from | |
1851 // [handleSendSet]. | |
1852 internalError(node, "Unexpected visitGetterSend"); | |
1853 } | |
1854 return null; | |
1855 } | |
1856 | |
1857 /// Read a local variable, function or parameter. | 1848 /// Read a local variable, function or parameter. |
1858 T handleLocalGet(ast.Send node, LocalElement local) { | 1849 T handleLocalGet(ast.Send node, LocalElement local) { |
1859 assert(locals.use(local) != null); | 1850 assert(locals.use(local) != null); |
1860 return locals.use(local); | 1851 return locals.use(local); |
1861 } | 1852 } |
1862 | 1853 |
1863 /// Read a static or top level field. | 1854 /// Read a static or top level field. |
1864 T handleStaticFieldGet(ast.Send node, FieldElement field) { | 1855 T handleStaticFieldGet(ast.Send node, FieldElement field) { |
1865 Selector selector = elements.getSelector(node); | 1856 Selector selector = elements.getSelector(node); |
1866 TypeMask mask = elements.getTypeMask(node); | 1857 TypeMask mask = elements.getTypeMask(node); |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2313 TypeMask moveNextMask = elements.getMoveNextTypeMask(node); | 2304 TypeMask moveNextMask = elements.getMoveNextTypeMask(node); |
2314 | 2305 |
2315 T iteratorType = handleDynamicSend( | 2306 T iteratorType = handleDynamicSend( |
2316 node, iteratorSelector, iteratorMask, expressionType, | 2307 node, iteratorSelector, iteratorMask, expressionType, |
2317 new ArgumentsTypes<T>.empty()); | 2308 new ArgumentsTypes<T>.empty()); |
2318 | 2309 |
2319 return handleForInLoop(node, iteratorType, currentSelector, currentMask, | 2310 return handleForInLoop(node, iteratorType, currentSelector, currentMask, |
2320 moveNextSelector, moveNextMask); | 2311 moveNextSelector, moveNextMask); |
2321 } | 2312 } |
2322 } | 2313 } |
OLD | NEW |