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 |