Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 1423623005: Report hint when target of an invocation uses '?.', so can be null. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/error.dart ('k') | pkg/analyzer/test/generated/resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698