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 'package:analyzer/src/generated/scanner.dart'; | 9 import 'package:analyzer/src/generated/scanner.dart'; |
10 | 10 |
(...skipping 647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 | 658 |
659 /** | 659 /** |
660 * Produce a hint if the given [condition] could have a value of `null`. | 660 * Produce a hint if the given [condition] could have a value of `null`. |
661 */ | 661 */ |
662 void _checkForPossibleNullCondition(Expression condition) { | 662 void _checkForPossibleNullCondition(Expression condition) { |
663 while (condition is ParenthesizedExpression) { | 663 while (condition is ParenthesizedExpression) { |
664 condition = (condition as ParenthesizedExpression).expression; | 664 condition = (condition as ParenthesizedExpression).expression; |
665 } | 665 } |
666 if (condition is BinaryExpression) { | 666 if (condition is BinaryExpression) { |
667 _checkForPossibleNullConditionInBinaryExpression(condition); | 667 _checkForPossibleNullConditionInBinaryExpression(condition); |
| 668 } else if (condition is PrefixExpression) { |
| 669 _checkForPossibleNullConditionInPrefixExpression(condition); |
668 } else { | 670 } else { |
669 _checkForPossibleNullConditionInSimpleExpression(condition); | 671 _checkForPossibleNullConditionInSimpleExpression(condition); |
670 } | 672 } |
671 } | 673 } |
672 | 674 |
673 /** | 675 /** |
674 * Produce a hint if any of the parts of the given binary [condition] could | 676 * Produce a hint if any of the parts of the given binary [condition] could |
675 * have a value of `null`. | 677 * have a value of `null`. |
676 */ | 678 */ |
677 void _checkForPossibleNullConditionInBinaryExpression( | 679 void _checkForPossibleNullConditionInBinaryExpression( |
678 BinaryExpression condition) { | 680 BinaryExpression condition) { |
679 Token operator = condition.operator; | 681 Token operator = condition.operator; |
680 if (operator != null && | 682 if (operator != null && |
681 (operator.type == TokenType.AMPERSAND_AMPERSAND || | 683 (operator.type == TokenType.AMPERSAND_AMPERSAND || |
682 operator.type == TokenType.BAR_BAR)) { | 684 operator.type == TokenType.BAR_BAR)) { |
683 _checkForPossibleNullCondition(condition.leftOperand); | 685 _checkForPossibleNullCondition(condition.leftOperand); |
684 _checkForPossibleNullCondition(condition.rightOperand); | 686 _checkForPossibleNullCondition(condition.rightOperand); |
685 } | 687 } |
686 } | 688 } |
687 | 689 |
688 /** | 690 /** |
| 691 * Produce a hint if the operand of the given prefix [condition] could |
| 692 * have a value of `null`. |
| 693 */ |
| 694 void _checkForPossibleNullConditionInPrefixExpression( |
| 695 PrefixExpression condition) { |
| 696 if (condition.operator?.type == TokenType.BANG) { |
| 697 _checkForPossibleNullCondition(condition.operand); |
| 698 } |
| 699 } |
| 700 |
| 701 /** |
689 * Produce a hint if the given [condition] could have a value of `null`. | 702 * Produce a hint if the given [condition] could have a value of `null`. |
690 */ | 703 */ |
691 void _checkForPossibleNullConditionInSimpleExpression(Expression condition) { | 704 void _checkForPossibleNullConditionInSimpleExpression(Expression condition) { |
692 if (condition is MethodInvocation) { | 705 if (condition is MethodInvocation) { |
693 Token operator = condition.operator; | 706 Token operator = condition.operator; |
694 if (operator != null && operator.type == TokenType.QUESTION_PERIOD) { | 707 if (operator != null && operator.type == TokenType.QUESTION_PERIOD) { |
695 _errorReporter.reportErrorForNode( | 708 _errorReporter.reportErrorForNode( |
696 HintCode.NULL_AWARE_IN_CONDITION, condition); | 709 HintCode.NULL_AWARE_IN_CONDITION, condition); |
697 } | 710 } |
698 } else if (condition is PropertyAccess) { | 711 } else if (condition is PropertyAccess) { |
(...skipping 15352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16051 nonFields.add(node); | 16064 nonFields.add(node); |
16052 return null; | 16065 return null; |
16053 } | 16066 } |
16054 | 16067 |
16055 @override | 16068 @override |
16056 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 16069 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
16057 | 16070 |
16058 @override | 16071 @override |
16059 Object visitWithClause(WithClause node) => null; | 16072 Object visitWithClause(WithClause node) => null; |
16060 } | 16073 } |
OLD | NEW |