| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 engine.resolver; | 5 library engine.resolver; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'ast.dart'; | 9 import 'ast.dart'; |
| 10 import 'constant.dart'; | 10 import 'constant.dart'; |
| (...skipping 1503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1514 @override | 1514 @override |
| 1515 Object visitBinaryExpression(BinaryExpression node) { | 1515 Object visitBinaryExpression(BinaryExpression node) { |
| 1516 sc.Token operator = node.operator; | 1516 sc.Token operator = node.operator; |
| 1517 bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND; | 1517 bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND; |
| 1518 bool isBarBar = operator.type == sc.TokenType.BAR_BAR; | 1518 bool isBarBar = operator.type == sc.TokenType.BAR_BAR; |
| 1519 if (isAmpAmp || isBarBar) { | 1519 if (isAmpAmp || isBarBar) { |
| 1520 Expression lhsCondition = node.leftOperand; | 1520 Expression lhsCondition = node.leftOperand; |
| 1521 if (!_isDebugConstant(lhsCondition)) { | 1521 if (!_isDebugConstant(lhsCondition)) { |
| 1522 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); | 1522 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); |
| 1523 if (lhsResult != null) { | 1523 if (lhsResult != null) { |
| 1524 if (lhsResult.value.isTrue && isBarBar) { | 1524 if (lhsResult.value.toBoolValue() == true && isBarBar) { |
| 1525 // report error on else block: true || !e! | 1525 // report error on else block: true || !e! |
| 1526 _errorReporter.reportErrorForNode( | 1526 _errorReporter.reportErrorForNode( |
| 1527 HintCode.DEAD_CODE, node.rightOperand); | 1527 HintCode.DEAD_CODE, node.rightOperand); |
| 1528 // only visit the LHS: | 1528 // only visit the LHS: |
| 1529 _safelyVisit(lhsCondition); | 1529 _safelyVisit(lhsCondition); |
| 1530 return null; | 1530 return null; |
| 1531 } else if (lhsResult.value.isFalse && isAmpAmp) { | 1531 } else if (lhsResult.value.toBoolValue() == false && isAmpAmp) { |
| 1532 // report error on if block: false && !e! | 1532 // report error on if block: false && !e! |
| 1533 _errorReporter.reportErrorForNode( | 1533 _errorReporter.reportErrorForNode( |
| 1534 HintCode.DEAD_CODE, node.rightOperand); | 1534 HintCode.DEAD_CODE, node.rightOperand); |
| 1535 // only visit the LHS: | 1535 // only visit the LHS: |
| 1536 _safelyVisit(lhsCondition); | 1536 _safelyVisit(lhsCondition); |
| 1537 return null; | 1537 return null; |
| 1538 } | 1538 } |
| 1539 } | 1539 } |
| 1540 } | 1540 } |
| 1541 // How do we want to handle the RHS? It isn't dead code, but "pointless" | 1541 // How do we want to handle the RHS? It isn't dead code, but "pointless" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1575 } | 1575 } |
| 1576 | 1576 |
| 1577 @override | 1577 @override |
| 1578 Object visitConditionalExpression(ConditionalExpression node) { | 1578 Object visitConditionalExpression(ConditionalExpression node) { |
| 1579 Expression conditionExpression = node.condition; | 1579 Expression conditionExpression = node.condition; |
| 1580 _safelyVisit(conditionExpression); | 1580 _safelyVisit(conditionExpression); |
| 1581 if (!_isDebugConstant(conditionExpression)) { | 1581 if (!_isDebugConstant(conditionExpression)) { |
| 1582 EvaluationResultImpl result = | 1582 EvaluationResultImpl result = |
| 1583 _getConstantBooleanValue(conditionExpression); | 1583 _getConstantBooleanValue(conditionExpression); |
| 1584 if (result != null) { | 1584 if (result != null) { |
| 1585 if (result.value.isTrue) { | 1585 if (result.value.toBoolValue() == true) { |
| 1586 // report error on else block: true ? 1 : !2! | 1586 // report error on else block: true ? 1 : !2! |
| 1587 _errorReporter.reportErrorForNode( | 1587 _errorReporter.reportErrorForNode( |
| 1588 HintCode.DEAD_CODE, node.elseExpression); | 1588 HintCode.DEAD_CODE, node.elseExpression); |
| 1589 _safelyVisit(node.thenExpression); | 1589 _safelyVisit(node.thenExpression); |
| 1590 return null; | 1590 return null; |
| 1591 } else { | 1591 } else { |
| 1592 // report error on if block: false ? !1! : 2 | 1592 // report error on if block: false ? !1! : 2 |
| 1593 _errorReporter.reportErrorForNode( | 1593 _errorReporter.reportErrorForNode( |
| 1594 HintCode.DEAD_CODE, node.thenExpression); | 1594 HintCode.DEAD_CODE, node.thenExpression); |
| 1595 _safelyVisit(node.elseExpression); | 1595 _safelyVisit(node.elseExpression); |
| 1596 return null; | 1596 return null; |
| 1597 } | 1597 } |
| 1598 } | 1598 } |
| 1599 } | 1599 } |
| 1600 return super.visitConditionalExpression(node); | 1600 return super.visitConditionalExpression(node); |
| 1601 } | 1601 } |
| 1602 | 1602 |
| 1603 @override | 1603 @override |
| 1604 Object visitIfStatement(IfStatement node) { | 1604 Object visitIfStatement(IfStatement node) { |
| 1605 Expression conditionExpression = node.condition; | 1605 Expression conditionExpression = node.condition; |
| 1606 _safelyVisit(conditionExpression); | 1606 _safelyVisit(conditionExpression); |
| 1607 if (!_isDebugConstant(conditionExpression)) { | 1607 if (!_isDebugConstant(conditionExpression)) { |
| 1608 EvaluationResultImpl result = | 1608 EvaluationResultImpl result = |
| 1609 _getConstantBooleanValue(conditionExpression); | 1609 _getConstantBooleanValue(conditionExpression); |
| 1610 if (result != null) { | 1610 if (result != null) { |
| 1611 if (result.value.isTrue) { | 1611 if (result.value.toBoolValue() == true) { |
| 1612 // report error on else block: if(true) {} else {!} | 1612 // report error on else block: if(true) {} else {!} |
| 1613 Statement elseStatement = node.elseStatement; | 1613 Statement elseStatement = node.elseStatement; |
| 1614 if (elseStatement != null) { | 1614 if (elseStatement != null) { |
| 1615 _errorReporter.reportErrorForNode( | 1615 _errorReporter.reportErrorForNode( |
| 1616 HintCode.DEAD_CODE, elseStatement); | 1616 HintCode.DEAD_CODE, elseStatement); |
| 1617 _safelyVisit(node.thenStatement); | 1617 _safelyVisit(node.thenStatement); |
| 1618 return null; | 1618 return null; |
| 1619 } | 1619 } |
| 1620 } else { | 1620 } else { |
| 1621 // report error on if block: if (false) {!} else {} | 1621 // report error on if block: if (false) {!} else {} |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 } | 1710 } |
| 1711 | 1711 |
| 1712 @override | 1712 @override |
| 1713 Object visitWhileStatement(WhileStatement node) { | 1713 Object visitWhileStatement(WhileStatement node) { |
| 1714 Expression conditionExpression = node.condition; | 1714 Expression conditionExpression = node.condition; |
| 1715 _safelyVisit(conditionExpression); | 1715 _safelyVisit(conditionExpression); |
| 1716 if (!_isDebugConstant(conditionExpression)) { | 1716 if (!_isDebugConstant(conditionExpression)) { |
| 1717 EvaluationResultImpl result = | 1717 EvaluationResultImpl result = |
| 1718 _getConstantBooleanValue(conditionExpression); | 1718 _getConstantBooleanValue(conditionExpression); |
| 1719 if (result != null) { | 1719 if (result != null) { |
| 1720 if (result.value.isFalse) { | 1720 if (result.value.toBoolValue() == false) { |
| 1721 // report error on if block: while (false) {!} | 1721 // report error on if block: while (false) {!} |
| 1722 _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body); | 1722 _errorReporter.reportErrorForNode(HintCode.DEAD_CODE, node.body); |
| 1723 return null; | 1723 return null; |
| 1724 } | 1724 } |
| 1725 } | 1725 } |
| 1726 } | 1726 } |
| 1727 _safelyVisit(node.body); | 1727 _safelyVisit(node.body); |
| 1728 return null; | 1728 return null; |
| 1729 } | 1729 } |
| 1730 | 1730 |
| (...skipping 13984 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15715 ExecutableElement outerFunction = _enclosingFunction; | 15715 ExecutableElement outerFunction = _enclosingFunction; |
| 15716 try { | 15716 try { |
| 15717 _enclosingFunction = node.element; | 15717 _enclosingFunction = node.element; |
| 15718 return super.visitMethodDeclaration(node); | 15718 return super.visitMethodDeclaration(node); |
| 15719 } finally { | 15719 } finally { |
| 15720 _enclosingFunction = outerFunction; | 15720 _enclosingFunction = outerFunction; |
| 15721 } | 15721 } |
| 15722 } | 15722 } |
| 15723 | 15723 |
| 15724 @override | 15724 @override |
| 15725 Object visitTypeName(TypeName node) { | |
| 15726 return null; | |
| 15727 } | |
| 15728 | |
| 15729 @override | |
| 15730 Object visitSimpleIdentifier(SimpleIdentifier node) { | 15725 Object visitSimpleIdentifier(SimpleIdentifier node) { |
| 15731 // Ignore if already resolved - declaration or type. | 15726 // Ignore if already resolved - declaration or type. |
| 15732 if (node.inDeclarationContext()) { | 15727 if (node.inDeclarationContext()) { |
| 15733 return null; | 15728 return null; |
| 15734 } | 15729 } |
| 15735 // Ignore if it cannot be a reference to a local variable. | 15730 // Ignore if it cannot be a reference to a local variable. |
| 15736 AstNode parent = node.parent; | 15731 AstNode parent = node.parent; |
| 15737 if (parent is FieldFormalParameter) { | 15732 if (parent is FieldFormalParameter) { |
| 15738 return null; | 15733 return null; |
| 15739 } else if (parent is ConstructorDeclaration && parent.returnType == node) { | 15734 } else if (parent is ConstructorDeclaration && parent.returnType == node) { |
| 15740 return null; | 15735 return null; |
| 15741 } else if (parent is ConstructorFieldInitializer && parent.fieldName == node
) { | 15736 } else if (parent is ConstructorFieldInitializer && |
| 15737 parent.fieldName == node) { |
| 15742 return null; | 15738 return null; |
| 15743 } | 15739 } |
| 15744 // Ignore if qualified. | 15740 // Ignore if qualified. |
| 15745 if (parent is PrefixedIdentifier && identical(parent.identifier, node)) { | 15741 if (parent is PrefixedIdentifier && identical(parent.identifier, node)) { |
| 15746 return null; | 15742 return null; |
| 15747 } | 15743 } |
| 15748 if (parent is PropertyAccess && identical(parent.propertyName, node)) { | 15744 if (parent is PropertyAccess && identical(parent.propertyName, node)) { |
| 15749 return null; | 15745 return null; |
| 15750 } | 15746 } |
| 15751 if (parent is MethodInvocation && | 15747 if (parent is MethodInvocation && |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15784 // If we are in some closure, check if it is not the same as where | 15780 // If we are in some closure, check if it is not the same as where |
| 15785 // variable is declared. | 15781 // variable is declared. |
| 15786 if (_enclosingFunction != null && | 15782 if (_enclosingFunction != null && |
| 15787 (element.enclosingElement != _enclosingFunction)) { | 15783 (element.enclosingElement != _enclosingFunction)) { |
| 15788 parameterImpl.markPotentiallyMutatedInClosure(); | 15784 parameterImpl.markPotentiallyMutatedInClosure(); |
| 15789 } | 15785 } |
| 15790 } | 15786 } |
| 15791 } | 15787 } |
| 15792 return null; | 15788 return null; |
| 15793 } | 15789 } |
| 15790 |
| 15791 @override |
| 15792 Object visitTypeName(TypeName node) { |
| 15793 return null; |
| 15794 } |
| 15794 } | 15795 } |
| 15795 | 15796 |
| 15796 class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor { | 15797 class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor { |
| 15797 final ConstantVerifier verifier; | 15798 final ConstantVerifier verifier; |
| 15798 | 15799 |
| 15799 List<ParameterElement> parameterElements; | 15800 List<ParameterElement> parameterElements; |
| 15800 | 15801 |
| 15801 TypeSystem _typeSystem; | 15802 TypeSystem _typeSystem; |
| 15802 | 15803 |
| 15803 _ConstantVerifier_validateInitializerExpression( | 15804 _ConstantVerifier_validateInitializerExpression( |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15962 nonFields.add(node); | 15963 nonFields.add(node); |
| 15963 return null; | 15964 return null; |
| 15964 } | 15965 } |
| 15965 | 15966 |
| 15966 @override | 15967 @override |
| 15967 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 15968 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
| 15968 | 15969 |
| 15969 @override | 15970 @override |
| 15970 Object visitWithClause(WithClause node) => null; | 15971 Object visitWithClause(WithClause node) => null; |
| 15971 } | 15972 } |
| OLD | NEW |