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

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

Issue 2364733002: Issue 27300. Report HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE. (Closed)
Patch Set: Created 4 years, 2 months 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 analyzer.src.generated.resolver; 5 library analyzer.src.generated.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 _checkForMissingReturn(node.returnType, node.body); 276 _checkForMissingReturn(node.returnType, node.body);
277 _checkForUnnecessaryNoSuchMethod(node); 277 _checkForUnnecessaryNoSuchMethod(node);
278 return super.visitMethodDeclaration(node); 278 return super.visitMethodDeclaration(node);
279 } finally { 279 } finally {
280 inDeprecatedMember = wasInDeprecatedMember; 280 inDeprecatedMember = wasInDeprecatedMember;
281 } 281 }
282 } 282 }
283 283
284 @override 284 @override
285 Object visitMethodInvocation(MethodInvocation node) { 285 Object visitMethodInvocation(MethodInvocation node) {
286 Expression realTarget = node.realTarget;
287 _checkForAbstractSuperMemberReference(realTarget, node.methodName);
286 _checkForCanBeNullAfterNullAware( 288 _checkForCanBeNullAfterNullAware(
287 node.realTarget, node.operator, null, node.methodName); 289 realTarget, node.operator, null, node.methodName);
288 DartType staticInvokeType = node.staticInvokeType; 290 DartType staticInvokeType = node.staticInvokeType;
289 if (staticInvokeType is InterfaceType) { 291 if (staticInvokeType is InterfaceType) {
290 MethodElement methodElement = staticInvokeType.lookUpMethod( 292 MethodElement methodElement = staticInvokeType.lookUpMethod(
291 FunctionElement.CALL_METHOD_NAME, _currentLibrary); 293 FunctionElement.CALL_METHOD_NAME, _currentLibrary);
292 _checkForDeprecatedMemberUse(methodElement, node); 294 _checkForDeprecatedMemberUse(methodElement, node);
293 } 295 }
294 return super.visitMethodInvocation(node); 296 return super.visitMethodInvocation(node);
295 } 297 }
296 298
297 @override 299 @override
298 Object visitPostfixExpression(PostfixExpression node) { 300 Object visitPostfixExpression(PostfixExpression node) {
299 _checkForDeprecatedMemberUse(node.bestElement, node); 301 _checkForDeprecatedMemberUse(node.bestElement, node);
300 return super.visitPostfixExpression(node); 302 return super.visitPostfixExpression(node);
301 } 303 }
302 304
303 @override 305 @override
304 Object visitPrefixExpression(PrefixExpression node) { 306 Object visitPrefixExpression(PrefixExpression node) {
305 _checkForDeprecatedMemberUse(node.bestElement, node); 307 _checkForDeprecatedMemberUse(node.bestElement, node);
306 return super.visitPrefixExpression(node); 308 return super.visitPrefixExpression(node);
307 } 309 }
308 310
309 @override 311 @override
310 Object visitPropertyAccess(PropertyAccess node) { 312 Object visitPropertyAccess(PropertyAccess node) {
313 Expression realTarget = node.realTarget;
314 _checkForAbstractSuperMemberReference(realTarget, node.propertyName);
311 _checkForCanBeNullAfterNullAware( 315 _checkForCanBeNullAfterNullAware(
312 node.realTarget, node.operator, node.propertyName, null); 316 realTarget, node.operator, node.propertyName, null);
313 return super.visitPropertyAccess(node); 317 return super.visitPropertyAccess(node);
314 } 318 }
315 319
316 @override 320 @override
317 Object visitRedirectingConstructorInvocation( 321 Object visitRedirectingConstructorInvocation(
318 RedirectingConstructorInvocation node) { 322 RedirectingConstructorInvocation node) {
319 _checkForDeprecatedMemberUse(node.staticElement, node); 323 _checkForDeprecatedMemberUse(node.staticElement, node);
320 return super.visitRedirectingConstructorInvocation(node); 324 return super.visitRedirectingConstructorInvocation(node);
321 } 325 }
322 326
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 // the is not case 406 // the is not case
403 _errorReporter.reportErrorForNode( 407 _errorReporter.reportErrorForNode(
404 HintCode.TYPE_CHECK_IS_NOT_NULL, node); 408 HintCode.TYPE_CHECK_IS_NOT_NULL, node);
405 } 409 }
406 return true; 410 return true;
407 } 411 }
408 } 412 }
409 return false; 413 return false;
410 } 414 }
411 415
416 void _checkForAbstractSuperMemberReference(
417 Expression target, SimpleIdentifier name) {
418 if (target is SuperExpression) {
419 Element element = name.staticElement;
420 if (element is ExecutableElement && element.isAbstract) {
421 _errorReporter.reportTypeErrorForNode(
422 HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
423 name,
424 [element.kind.displayName, name.name]);
425 }
426 }
427 }
428
412 /** 429 /**
413 * This verifies that the passed expression can be assigned to its correspondi ng parameters. 430 * This verifies that the passed expression can be assigned to its correspondi ng parameters.
414 * 431 *
415 * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable. 432 * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable.
416 * 433 *
417 * TODO (jwren) In the ErrorVerifier there are other warnings that we could ha ve a corresponding 434 * TODO (jwren) In the ErrorVerifier there are other warnings that we could ha ve a corresponding
418 * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssigna ble(..). 435 * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssigna ble(..).
419 * 436 *
420 * @param expression the expression to evaluate 437 * @param expression the expression to evaluate
421 * @param expectedStaticType the expected static type of the parameter 438 * @param expectedStaticType the expected static type of the parameter
(...skipping 6854 matching lines...) Expand 10 before | Expand all | Expand 10 after
7276 DartType contextType = node.staticInvokeType; 7293 DartType contextType = node.staticInvokeType;
7277 if (contextType is FunctionType) { 7294 if (contextType is FunctionType) {
7278 DartType originalType = node.function.staticType; 7295 DartType originalType = node.function.staticType;
7279 DartType returnContextType = InferenceContext.getContext(node); 7296 DartType returnContextType = InferenceContext.getContext(node);
7280 TypeSystem ts = typeSystem; 7297 TypeSystem ts = typeSystem;
7281 if (returnContextType != null && 7298 if (returnContextType != null &&
7282 node.typeArguments == null && 7299 node.typeArguments == null &&
7283 originalType is FunctionType && 7300 originalType is FunctionType &&
7284 originalType.typeFormals.isNotEmpty && 7301 originalType.typeFormals.isNotEmpty &&
7285 ts is StrongTypeSystemImpl) { 7302 ts is StrongTypeSystemImpl) {
7286 contextType = ts.inferGenericFunctionCall(typeProvider, originalType, 7303 contextType = ts.inferGenericFunctionCall(
7287 DartType.EMPTY_LIST, DartType.EMPTY_LIST, originalType.returnType, r eturnContextType); 7304 typeProvider,
7305 originalType,
7306 DartType.EMPTY_LIST,
7307 DartType.EMPTY_LIST,
7308 originalType.returnType,
7309 returnContextType);
7288 } 7310 }
7289 7311
7290 InferenceContext.setType(node.argumentList, contextType); 7312 InferenceContext.setType(node.argumentList, contextType);
7291 } 7313 }
7292 } 7314 }
7293 7315
7294 void _inferFormalParameterList(FormalParameterList node, DartType type) { 7316 void _inferFormalParameterList(FormalParameterList node, DartType type) {
7295 if (typeAnalyzer.inferFormalParameterList(node, type)) { 7317 if (typeAnalyzer.inferFormalParameterList(node, type)) {
7296 // TODO(leafp): This gets dropped on the floor if we're in the field 7318 // TODO(leafp): This gets dropped on the floor if we're in the field
7297 // inference task. We should probably keep these infos. 7319 // inference task. We should probably keep these infos.
(...skipping 3894 matching lines...) Expand 10 before | Expand all | Expand 10 after
11192 return null; 11214 return null;
11193 } 11215 }
11194 if (identical(node.staticElement, variable)) { 11216 if (identical(node.staticElement, variable)) {
11195 if (node.inSetterContext()) { 11217 if (node.inSetterContext()) {
11196 result = true; 11218 result = true;
11197 } 11219 }
11198 } 11220 }
11199 return null; 11221 return null;
11200 } 11222 }
11201 } 11223 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698