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

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

Issue 2366963002: Issue 27300. Report HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE. (Land again) (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « pkg/analyzer/lib/src/error/codes.dart ('k') | pkg/analyzer/lib/src/generated/resolver.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.error_verifier; 5 library analyzer.src.generated.error_verifier;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 2638 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 if (method.isGetter) { 2649 if (method.isGetter) {
2650 overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter( 2650 overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(
2651 memberName, _currentLibrary); 2651 memberName, _currentLibrary);
2652 } else if (method.isSetter) { 2652 } else if (method.isSetter) {
2653 overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter( 2653 overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(
2654 memberName, _currentLibrary); 2654 memberName, _currentLibrary);
2655 } else { 2655 } else {
2656 overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod( 2656 overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(
2657 memberName, _currentLibrary); 2657 memberName, _currentLibrary);
2658 } 2658 }
2659 if (overriddenMember == null && !_hasNoSuchMethod(_enclosingClass)) { 2659 if (overriddenMember == null && !_enclosingClass.hasNoSuchMethod) {
2660 _errorReporter.reportErrorForNode( 2660 _errorReporter.reportErrorForNode(
2661 StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 2661 StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
2662 nameNode, 2662 nameNode,
2663 [memberName, _enclosingClass.displayName]); 2663 [memberName, _enclosingClass.displayName]);
2664 } 2664 }
2665 } 2665 }
2666 } 2666 }
2667 2667
2668 /** 2668 /**
2669 * Verify all possible conflicts of the given [constructor]'s name with other 2669 * Verify all possible conflicts of the given [constructor]'s name with other
(...skipping 2294 matching lines...) Expand 10 before | Expand all | Expand 10 after
4964 * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], 4964 * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE],
4965 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO], 4965 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO],
4966 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE], 4966 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE],
4967 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR], and 4967 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR], and
4968 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS]. 4968 * [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS].
4969 */ 4969 */
4970 void _checkForNonAbstractClassInheritsAbstractMember( 4970 void _checkForNonAbstractClassInheritsAbstractMember(
4971 SimpleIdentifier classNameNode) { 4971 SimpleIdentifier classNameNode) {
4972 if (_enclosingClass.isAbstract) { 4972 if (_enclosingClass.isAbstract) {
4973 return; 4973 return;
4974 } else if (_hasNoSuchMethod(_enclosingClass)) { 4974 } else if (_enclosingClass.hasNoSuchMethod) {
4975 return; 4975 return;
4976 } 4976 }
4977 // 4977 //
4978 // Store in local sets the set of all method and accessor names 4978 // Store in local sets the set of all method and accessor names
4979 // 4979 //
4980 HashSet<ExecutableElement> missingOverrides = 4980 HashSet<ExecutableElement> missingOverrides =
4981 new HashSet<ExecutableElement>(); 4981 new HashSet<ExecutableElement>();
4982 // 4982 //
4983 // Loop through the set of all executable elements declared in the implicit 4983 // Loop through the set of all executable elements declared in the implicit
4984 // interface. 4984 // interface.
(...skipping 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after
6091 ClassElement classElement = declaration.element; 6091 ClassElement classElement = declaration.element;
6092 if (classElement == null) { 6092 if (classElement == null) {
6093 return; 6093 return;
6094 } 6094 }
6095 if (!_typeSystem.isSubtypeOf( 6095 if (!_typeSystem.isSubtypeOf(
6096 classElement.type, _typeProvider.functionType)) { 6096 classElement.type, _typeProvider.functionType)) {
6097 return; 6097 return;
6098 } 6098 }
6099 // If there is a noSuchMethod method, then don't report the warning, 6099 // If there is a noSuchMethod method, then don't report the warning,
6100 // see dartbug.com/16078 6100 // see dartbug.com/16078
6101 if (_hasNoSuchMethod(classElement)) { 6101 if (_enclosingClass.hasNoSuchMethod) {
6102 return; 6102 return;
6103 } 6103 }
6104 ExecutableElement callMethod = _inheritanceManager.lookupMember( 6104 ExecutableElement callMethod = _inheritanceManager.lookupMember(
6105 classElement, FunctionElement.CALL_METHOD_NAME); 6105 classElement, FunctionElement.CALL_METHOD_NAME);
6106 if (callMethod == null || 6106 if (callMethod == null ||
6107 callMethod is! MethodElement || 6107 callMethod is! MethodElement ||
6108 (callMethod as MethodElement).isAbstract) { 6108 (callMethod as MethodElement).isAbstract) {
6109 _errorReporter.reportErrorForNode( 6109 _errorReporter.reportErrorForNode(
6110 StaticWarningCode.FUNCTION_WITHOUT_CALL, declaration.name); 6110 StaticWarningCode.FUNCTION_WITHOUT_CALL, declaration.name);
6111 } 6111 }
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
6388 // Get the parameters for MethodDeclaration or FunctionDeclaration 6388 // Get the parameters for MethodDeclaration or FunctionDeclaration
6389 List<ParameterElement> setterParameters = setter.parameters; 6389 List<ParameterElement> setterParameters = setter.parameters;
6390 // If there are no setter parameters, return no type. 6390 // If there are no setter parameters, return no type.
6391 if (setterParameters.length == 0) { 6391 if (setterParameters.length == 0) {
6392 return null; 6392 return null;
6393 } 6393 }
6394 return setterParameters[0].type; 6394 return setterParameters[0].type;
6395 } 6395 }
6396 6396
6397 /** 6397 /**
6398 * Return `true` if the given [classElement] has a noSuchMethod() method
6399 * distinct from the one declared in class Object, as per the Dart Language
6400 * Specification (section 10.4).
6401 */
6402 bool _hasNoSuchMethod(ClassElement classElement) {
6403 MethodElement method = classElement.lookUpMethod(
6404 FunctionElement.NO_SUCH_METHOD_METHOD_NAME, classElement.library);
6405 if (method == null) {
6406 return false;
6407 }
6408 ClassElement definingClass =
6409 method.getAncestor((Element element) => element is ClassElement);
6410 return definingClass != null && !definingClass.type.isObject;
6411 }
6412
6413 /**
6414 * Return `true` if the given [constructor] redirects to itself, directly or 6398 * Return `true` if the given [constructor] redirects to itself, directly or
6415 * indirectly. 6399 * indirectly.
6416 */ 6400 */
6417 bool _hasRedirectingFactoryConstructorCycle(ConstructorElement constructor) { 6401 bool _hasRedirectingFactoryConstructorCycle(ConstructorElement constructor) {
6418 ConstructorElement nonMember(ConstructorElement constructor) { 6402 ConstructorElement nonMember(ConstructorElement constructor) {
6419 return constructor is ConstructorMember 6403 return constructor is ConstructorMember
6420 ? constructor.baseElement 6404 ? constructor.baseElement
6421 : constructor; 6405 : constructor;
6422 } 6406 }
6423 6407
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
6911 class _InvocationCollector extends RecursiveAstVisitor { 6895 class _InvocationCollector extends RecursiveAstVisitor {
6912 final List<String> superCalls = <String>[]; 6896 final List<String> superCalls = <String>[];
6913 6897
6914 @override 6898 @override
6915 visitMethodInvocation(MethodInvocation node) { 6899 visitMethodInvocation(MethodInvocation node) {
6916 if (node.target is SuperExpression) { 6900 if (node.target is SuperExpression) {
6917 superCalls.add(node.methodName.name); 6901 superCalls.add(node.methodName.name);
6918 } 6902 }
6919 } 6903 }
6920 } 6904 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/error/codes.dart ('k') | pkg/analyzer/lib/src/generated/resolver.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698