Chromium Code Reviews| 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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 | 211 |
| 212 @override | 212 @override |
| 213 Object visitMethodDeclaration(MethodDeclaration node) { | 213 Object visitMethodDeclaration(MethodDeclaration node) { |
| 214 // This was determined to not be a good hint, see: dartbug.com/16029 | 214 // This was determined to not be a good hint, see: dartbug.com/16029 |
| 215 //checkForOverridingPrivateMember(node); | 215 //checkForOverridingPrivateMember(node); |
| 216 _checkForMissingReturn(node.returnType, node.body); | 216 _checkForMissingReturn(node.returnType, node.body); |
| 217 return super.visitMethodDeclaration(node); | 217 return super.visitMethodDeclaration(node); |
| 218 } | 218 } |
| 219 | 219 |
| 220 @override | 220 @override |
| 221 Object visitMethodInvocation(MethodInvocation node) { | |
| 222 _checkForCanBeNullAfterNullAware(node.realTarget); | |
| 223 return super.visitMethodInvocation(node); | |
| 224 } | |
| 225 | |
| 226 @override | |
| 221 Object visitPostfixExpression(PostfixExpression node) { | 227 Object visitPostfixExpression(PostfixExpression node) { |
| 222 _checkForDeprecatedMemberUse(node.bestElement, node); | 228 _checkForDeprecatedMemberUse(node.bestElement, node); |
| 223 return super.visitPostfixExpression(node); | 229 return super.visitPostfixExpression(node); |
| 224 } | 230 } |
| 225 | 231 |
| 226 @override | 232 @override |
| 227 Object visitPrefixExpression(PrefixExpression node) { | 233 Object visitPrefixExpression(PrefixExpression node) { |
| 228 _checkForDeprecatedMemberUse(node.bestElement, node); | 234 _checkForDeprecatedMemberUse(node.bestElement, node); |
| 229 return super.visitPrefixExpression(node); | 235 return super.visitPrefixExpression(node); |
| 230 } | 236 } |
| 231 | 237 |
| 232 @override | 238 @override |
| 239 Object visitPropertyAccess(PropertyAccess node) { | |
| 240 _checkForCanBeNullAfterNullAware(node.realTarget); | |
| 241 return super.visitPropertyAccess(node); | |
| 242 } | |
| 243 | |
| 244 @override | |
| 233 Object visitRedirectingConstructorInvocation( | 245 Object visitRedirectingConstructorInvocation( |
| 234 RedirectingConstructorInvocation node) { | 246 RedirectingConstructorInvocation node) { |
| 235 _checkForDeprecatedMemberUse(node.staticElement, node); | 247 _checkForDeprecatedMemberUse(node.staticElement, node); |
| 236 return super.visitRedirectingConstructorInvocation(node); | 248 return super.visitRedirectingConstructorInvocation(node); |
| 237 } | 249 } |
| 238 | 250 |
| 239 @override | 251 @override |
| 240 Object visitSimpleIdentifier(SimpleIdentifier node) { | 252 Object visitSimpleIdentifier(SimpleIdentifier node) { |
| 241 _checkForDeprecatedMemberUseAtIdentifier(node); | 253 _checkForDeprecatedMemberUseAtIdentifier(node); |
| 242 return super.visitSimpleIdentifier(node); | 254 return super.visitSimpleIdentifier(node); |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 446 bool problemReported = false; | 458 bool problemReported = false; |
| 447 for (Expression argument in argumentList.arguments) { | 459 for (Expression argument in argumentList.arguments) { |
| 448 if (_checkForArgumentTypeNotAssignableForArgument(argument)) { | 460 if (_checkForArgumentTypeNotAssignableForArgument(argument)) { |
| 449 problemReported = true; | 461 problemReported = true; |
| 450 } | 462 } |
| 451 } | 463 } |
| 452 return problemReported; | 464 return problemReported; |
| 453 } | 465 } |
| 454 | 466 |
| 455 /** | 467 /** |
| 468 * Produce a hint if the given [expression] could have a value of `null`. | |
| 469 */ | |
| 470 void _checkForCanBeNullAfterNullAware(Expression expression) { | |
| 471 if (expression is ParenthesizedExpression) { | |
| 472 _checkForCanBeNullAfterNullAware(expression.expression); | |
| 473 } else if (expression is MethodInvocation) { | |
| 474 if (expression.operator?.type == TokenType.QUESTION_PERIOD) { | |
| 475 _errorReporter.reportErrorForNode( | |
| 476 HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, expression); | |
| 477 } | |
| 478 } else if (expression is PropertyAccess) { | |
| 479 if (expression.operator?.type == TokenType.QUESTION_PERIOD) { | |
|
Brian Wilkerson
2015/10/28 22:09:11
I don't think the operator for a property access c
scheglov
2015/10/28 23:45:09
Acknowledged.
| |
| 480 _errorReporter.reportErrorForNode( | |
| 481 HintCode.CAN_BE_NULL_AFTER_NULL_AWARE, expression); | |
| 482 } | |
| 483 } | |
| 484 } | |
| 485 | |
| 486 /** | |
| 456 * Given some [Element], look at the associated metadata and report the use of the member if | 487 * Given some [Element], look at the associated metadata and report the use of the member if |
| 457 * it is declared as deprecated. | 488 * it is declared as deprecated. |
| 458 * | 489 * |
| 459 * @param element some element to check for deprecated use of | 490 * @param element some element to check for deprecated use of |
| 460 * @param node the node use for the location of the error | 491 * @param node the node use for the location of the error |
| 461 * @return `true` if and only if a hint code is generated on the passed node | 492 * @return `true` if and only if a hint code is generated on the passed node |
| 462 * See [HintCode.DEPRECATED_MEMBER_USE]. | 493 * See [HintCode.DEPRECATED_MEMBER_USE]. |
| 463 */ | 494 */ |
| 464 bool _checkForDeprecatedMemberUse(Element element, AstNode node) { | 495 bool _checkForDeprecatedMemberUse(Element element, AstNode node) { |
| 465 if (element != null && element.isDeprecated) { | 496 if (element != null && element.isDeprecated) { |
| (...skipping 15598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16064 nonFields.add(node); | 16095 nonFields.add(node); |
| 16065 return null; | 16096 return null; |
| 16066 } | 16097 } |
| 16067 | 16098 |
| 16068 @override | 16099 @override |
| 16069 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 16100 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
| 16070 | 16101 |
| 16071 @override | 16102 @override |
| 16072 Object visitWithClause(WithClause node) => null; | 16103 Object visitWithClause(WithClause node) => null; |
| 16073 } | 16104 } |
| OLD | NEW |