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 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 // static String _HASHCODE_GETTER_NAME = "hashCode"; | 45 // static String _HASHCODE_GETTER_NAME = "hashCode"; |
46 | 46 |
47 static String _NULL_TYPE_NAME = "Null"; | 47 static String _NULL_TYPE_NAME = "Null"; |
48 | 48 |
49 static String _TO_INT_METHOD_NAME = "toInt"; | 49 static String _TO_INT_METHOD_NAME = "toInt"; |
50 | 50 |
51 /** | 51 /** |
52 * The class containing the AST nodes being visited, or `null` if we are not i
n the scope of | 52 * The class containing the AST nodes being visited, or `null` if we are not i
n the scope of |
53 * a class. | 53 * a class. |
54 */ | 54 */ |
55 ClassElement _enclosingClass; | 55 ClassElementImpl _enclosingClass; |
56 | 56 |
57 /** | 57 /** |
58 * A flag indicating whether a surrounding member (compilation unit or class) | 58 * A flag indicating whether a surrounding member (compilation unit or class) |
59 * is deprecated. | 59 * is deprecated. |
60 */ | 60 */ |
61 bool inDeprecatedMember; | 61 bool inDeprecatedMember; |
62 | 62 |
63 /** | 63 /** |
64 * The error reporter by which errors will be reported. | 64 * The error reporter by which errors will be reported. |
65 */ | 65 */ |
(...skipping 14 matching lines...) Expand all Loading... |
80 * The type system primitives | 80 * The type system primitives |
81 */ | 81 */ |
82 TypeSystem _typeSystem; | 82 TypeSystem _typeSystem; |
83 | 83 |
84 /** | 84 /** |
85 * The current library | 85 * The current library |
86 */ | 86 */ |
87 LibraryElement _currentLibrary; | 87 LibraryElement _currentLibrary; |
88 | 88 |
89 /** | 89 /** |
| 90 * The inheritance manager used to find overridden methods. |
| 91 */ |
| 92 InheritanceManager _manager; |
| 93 |
| 94 /** |
90 * Create a new instance of the [BestPracticesVerifier]. | 95 * Create a new instance of the [BestPracticesVerifier]. |
91 * | 96 * |
92 * @param errorReporter the error reporter | 97 * @param errorReporter the error reporter |
93 */ | 98 */ |
94 BestPracticesVerifier( | 99 BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider, |
95 this._errorReporter, TypeProvider typeProvider, this._currentLibrary, | 100 this._currentLibrary, this._manager, |
96 {TypeSystem typeSystem}) | 101 {TypeSystem typeSystem}) |
97 : _nullType = typeProvider.nullType, | 102 : _nullType = typeProvider.nullType, |
98 _futureNullType = typeProvider.futureNullType, | 103 _futureNullType = typeProvider.futureNullType, |
99 _typeSystem = typeSystem ?? new TypeSystemImpl() { | 104 _typeSystem = typeSystem ?? new TypeSystemImpl() { |
100 inDeprecatedMember = _currentLibrary.isDeprecated; | 105 inDeprecatedMember = _currentLibrary.isDeprecated; |
101 } | 106 } |
102 | 107 |
103 @override | 108 @override |
104 Object visitAnnotation(Annotation node) { | 109 Object visitAnnotation(Annotation node) { |
105 if (node.elementAnnotation?.isFactory == true) { | 110 if (node.elementAnnotation?.isFactory == true) { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 | 157 |
153 @override | 158 @override |
154 Object visitBinaryExpression(BinaryExpression node) { | 159 Object visitBinaryExpression(BinaryExpression node) { |
155 _checkForDivisionOptimizationHint(node); | 160 _checkForDivisionOptimizationHint(node); |
156 _checkForDeprecatedMemberUse(node.bestElement, node); | 161 _checkForDeprecatedMemberUse(node.bestElement, node); |
157 return super.visitBinaryExpression(node); | 162 return super.visitBinaryExpression(node); |
158 } | 163 } |
159 | 164 |
160 @override | 165 @override |
161 Object visitClassDeclaration(ClassDeclaration node) { | 166 Object visitClassDeclaration(ClassDeclaration node) { |
162 ClassElement outerClass = _enclosingClass; | 167 ClassElementImpl outerClass = _enclosingClass; |
163 bool wasInDeprecatedMember = inDeprecatedMember; | 168 bool wasInDeprecatedMember = inDeprecatedMember; |
164 ClassElement element = node.element; | 169 ClassElement element = AbstractClassElementImpl.getImpl(node.element); |
165 if (element != null && element.isDeprecated) { | 170 if (element != null && element.isDeprecated) { |
166 inDeprecatedMember = true; | 171 inDeprecatedMember = true; |
167 } | 172 } |
168 try { | 173 try { |
169 _enclosingClass = element; | 174 _enclosingClass = element; |
170 // Commented out until we decide that we want this hint in the analyzer | 175 // Commented out until we decide that we want this hint in the analyzer |
171 // checkForOverrideEqualsButNotHashCode(node); | 176 // checkForOverrideEqualsButNotHashCode(node); |
172 return super.visitClassDeclaration(node); | 177 return super.visitClassDeclaration(node); |
173 } finally { | 178 } finally { |
174 _enclosingClass = outerClass; | 179 _enclosingClass = outerClass; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 _checkForMissingReturn(node.returnType, node.body); | 281 _checkForMissingReturn(node.returnType, node.body); |
277 _checkForUnnecessaryNoSuchMethod(node); | 282 _checkForUnnecessaryNoSuchMethod(node); |
278 return super.visitMethodDeclaration(node); | 283 return super.visitMethodDeclaration(node); |
279 } finally { | 284 } finally { |
280 inDeprecatedMember = wasInDeprecatedMember; | 285 inDeprecatedMember = wasInDeprecatedMember; |
281 } | 286 } |
282 } | 287 } |
283 | 288 |
284 @override | 289 @override |
285 Object visitMethodInvocation(MethodInvocation node) { | 290 Object visitMethodInvocation(MethodInvocation node) { |
| 291 Expression realTarget = node.realTarget; |
| 292 _checkForAbstractSuperMemberReference(realTarget, node.methodName); |
286 _checkForCanBeNullAfterNullAware( | 293 _checkForCanBeNullAfterNullAware( |
287 node.realTarget, node.operator, null, node.methodName); | 294 realTarget, node.operator, null, node.methodName); |
288 DartType staticInvokeType = node.staticInvokeType; | 295 DartType staticInvokeType = node.staticInvokeType; |
289 if (staticInvokeType is InterfaceType) { | 296 if (staticInvokeType is InterfaceType) { |
290 MethodElement methodElement = staticInvokeType.lookUpMethod( | 297 MethodElement methodElement = staticInvokeType.lookUpMethod( |
291 FunctionElement.CALL_METHOD_NAME, _currentLibrary); | 298 FunctionElement.CALL_METHOD_NAME, _currentLibrary); |
292 _checkForDeprecatedMemberUse(methodElement, node); | 299 _checkForDeprecatedMemberUse(methodElement, node); |
293 } | 300 } |
294 return super.visitMethodInvocation(node); | 301 return super.visitMethodInvocation(node); |
295 } | 302 } |
296 | 303 |
297 @override | 304 @override |
298 Object visitPostfixExpression(PostfixExpression node) { | 305 Object visitPostfixExpression(PostfixExpression node) { |
299 _checkForDeprecatedMemberUse(node.bestElement, node); | 306 _checkForDeprecatedMemberUse(node.bestElement, node); |
300 return super.visitPostfixExpression(node); | 307 return super.visitPostfixExpression(node); |
301 } | 308 } |
302 | 309 |
303 @override | 310 @override |
304 Object visitPrefixExpression(PrefixExpression node) { | 311 Object visitPrefixExpression(PrefixExpression node) { |
305 _checkForDeprecatedMemberUse(node.bestElement, node); | 312 _checkForDeprecatedMemberUse(node.bestElement, node); |
306 return super.visitPrefixExpression(node); | 313 return super.visitPrefixExpression(node); |
307 } | 314 } |
308 | 315 |
309 @override | 316 @override |
310 Object visitPropertyAccess(PropertyAccess node) { | 317 Object visitPropertyAccess(PropertyAccess node) { |
| 318 Expression realTarget = node.realTarget; |
| 319 _checkForAbstractSuperMemberReference(realTarget, node.propertyName); |
311 _checkForCanBeNullAfterNullAware( | 320 _checkForCanBeNullAfterNullAware( |
312 node.realTarget, node.operator, node.propertyName, null); | 321 realTarget, node.operator, node.propertyName, null); |
313 return super.visitPropertyAccess(node); | 322 return super.visitPropertyAccess(node); |
314 } | 323 } |
315 | 324 |
316 @override | 325 @override |
317 Object visitRedirectingConstructorInvocation( | 326 Object visitRedirectingConstructorInvocation( |
318 RedirectingConstructorInvocation node) { | 327 RedirectingConstructorInvocation node) { |
319 _checkForDeprecatedMemberUse(node.staticElement, node); | 328 _checkForDeprecatedMemberUse(node.staticElement, node); |
320 return super.visitRedirectingConstructorInvocation(node); | 329 return super.visitRedirectingConstructorInvocation(node); |
321 } | 330 } |
322 | 331 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 // the is not case | 411 // the is not case |
403 _errorReporter.reportErrorForNode( | 412 _errorReporter.reportErrorForNode( |
404 HintCode.TYPE_CHECK_IS_NOT_NULL, node); | 413 HintCode.TYPE_CHECK_IS_NOT_NULL, node); |
405 } | 414 } |
406 return true; | 415 return true; |
407 } | 416 } |
408 } | 417 } |
409 return false; | 418 return false; |
410 } | 419 } |
411 | 420 |
| 421 void _checkForAbstractSuperMemberReference( |
| 422 Expression target, SimpleIdentifier name) { |
| 423 if (target is SuperExpression) { |
| 424 Element element = name.staticElement; |
| 425 if (element is ExecutableElement && element.isAbstract) { |
| 426 if (!_enclosingClass.hasNoSuchMethod) { |
| 427 ExecutableElement concrete = null; |
| 428 if (element.kind == ElementKind.METHOD) { |
| 429 concrete = _enclosingClass.lookUpInheritedConcreteMethod( |
| 430 element.displayName, _currentLibrary); |
| 431 } else if (element.kind == ElementKind.GETTER) { |
| 432 concrete = _enclosingClass.lookUpInheritedConcreteGetter( |
| 433 element.displayName, _currentLibrary); |
| 434 } else if (element.kind == ElementKind.SETTER) { |
| 435 concrete = _enclosingClass.lookUpInheritedConcreteSetter( |
| 436 element.displayName, _currentLibrary); |
| 437 } |
| 438 if (concrete == null) { |
| 439 _errorReporter.reportTypeErrorForNode( |
| 440 HintCode.ABSTRACT_SUPER_MEMBER_REFERENCE, |
| 441 name, |
| 442 [element.kind.displayName, name.name]); |
| 443 } |
| 444 } |
| 445 } |
| 446 } |
| 447 } |
| 448 |
412 /** | 449 /** |
413 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. | 450 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. |
414 * | 451 * |
415 * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable. | 452 * This method corresponds to ErrorVerifier.checkForArgumentTypeNotAssignable. |
416 * | 453 * |
417 * TODO (jwren) In the ErrorVerifier there are other warnings that we could ha
ve a corresponding | 454 * 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(..). | 455 * hint for: see other callers of ErrorVerifier.checkForArgumentTypeNotAssigna
ble(..). |
419 * | 456 * |
420 * @param expression the expression to evaluate | 457 * @param expression the expression to evaluate |
421 * @param expectedStaticType the expected static type of the parameter | 458 * @param expectedStaticType the expected static type of the parameter |
(...skipping 3862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4284 // dead code analysis | 4321 // dead code analysis |
4285 unit.accept( | 4322 unit.accept( |
4286 new DeadCodeVerifier(errorReporter, typeSystem: _context.typeSystem)); | 4323 new DeadCodeVerifier(errorReporter, typeSystem: _context.typeSystem)); |
4287 unit.accept(_usedLocalElementsVisitor); | 4324 unit.accept(_usedLocalElementsVisitor); |
4288 // dart2js analysis | 4325 // dart2js analysis |
4289 if (_enableDart2JSHints) { | 4326 if (_enableDart2JSHints) { |
4290 unit.accept(new Dart2JSVerifier(errorReporter)); | 4327 unit.accept(new Dart2JSVerifier(errorReporter)); |
4291 } | 4328 } |
4292 // Dart best practices | 4329 // Dart best practices |
4293 unit.accept(new BestPracticesVerifier( | 4330 unit.accept(new BestPracticesVerifier( |
4294 errorReporter, _context.typeProvider, _library, | 4331 errorReporter, _context.typeProvider, _library, _manager, |
4295 typeSystem: _context.typeSystem)); | 4332 typeSystem: _context.typeSystem)); |
4296 unit.accept(new OverrideVerifier(errorReporter, _manager)); | 4333 unit.accept(new OverrideVerifier(errorReporter, _manager)); |
4297 // Find to-do comments | 4334 // Find to-do comments |
4298 new ToDoFinder(errorReporter).findIn(unit); | 4335 new ToDoFinder(errorReporter).findIn(unit); |
4299 // pub analysis | 4336 // pub analysis |
4300 // TODO(danrubel/jwren) Commented out until bugs in the pub verifier are | 4337 // TODO(danrubel/jwren) Commented out until bugs in the pub verifier are |
4301 // fixed | 4338 // fixed |
4302 // unit.accept(new PubVerifier(context, errorReporter)); | 4339 // unit.accept(new PubVerifier(context, errorReporter)); |
4303 } | 4340 } |
4304 } | 4341 } |
(...skipping 2971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7276 DartType contextType = node.staticInvokeType; | 7313 DartType contextType = node.staticInvokeType; |
7277 if (contextType is FunctionType) { | 7314 if (contextType is FunctionType) { |
7278 DartType originalType = node.function.staticType; | 7315 DartType originalType = node.function.staticType; |
7279 DartType returnContextType = InferenceContext.getContext(node); | 7316 DartType returnContextType = InferenceContext.getContext(node); |
7280 TypeSystem ts = typeSystem; | 7317 TypeSystem ts = typeSystem; |
7281 if (returnContextType != null && | 7318 if (returnContextType != null && |
7282 node.typeArguments == null && | 7319 node.typeArguments == null && |
7283 originalType is FunctionType && | 7320 originalType is FunctionType && |
7284 originalType.typeFormals.isNotEmpty && | 7321 originalType.typeFormals.isNotEmpty && |
7285 ts is StrongTypeSystemImpl) { | 7322 ts is StrongTypeSystemImpl) { |
7286 contextType = ts.inferGenericFunctionCall(typeProvider, originalType, | 7323 contextType = ts.inferGenericFunctionCall( |
7287 DartType.EMPTY_LIST, DartType.EMPTY_LIST, originalType.returnType, r
eturnContextType); | 7324 typeProvider, |
| 7325 originalType, |
| 7326 DartType.EMPTY_LIST, |
| 7327 DartType.EMPTY_LIST, |
| 7328 originalType.returnType, |
| 7329 returnContextType); |
7288 } | 7330 } |
7289 | 7331 |
7290 InferenceContext.setType(node.argumentList, contextType); | 7332 InferenceContext.setType(node.argumentList, contextType); |
7291 } | 7333 } |
7292 } | 7334 } |
7293 | 7335 |
7294 void _inferFormalParameterList(FormalParameterList node, DartType type) { | 7336 void _inferFormalParameterList(FormalParameterList node, DartType type) { |
7295 if (typeAnalyzer.inferFormalParameterList(node, type)) { | 7337 if (typeAnalyzer.inferFormalParameterList(node, type)) { |
7296 // TODO(leafp): This gets dropped on the floor if we're in the field | 7338 // TODO(leafp): This gets dropped on the floor if we're in the field |
7297 // inference task. We should probably keep these infos. | 7339 // inference task. We should probably keep these infos. |
(...skipping 3894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11192 return null; | 11234 return null; |
11193 } | 11235 } |
11194 if (identical(node.staticElement, variable)) { | 11236 if (identical(node.staticElement, variable)) { |
11195 if (node.inSetterContext()) { | 11237 if (node.inSetterContext()) { |
11196 result = true; | 11238 result = true; |
11197 } | 11239 } |
11198 } | 11240 } |
11199 return null; | 11241 return null; |
11200 } | 11242 } |
11201 } | 11243 } |
OLD | NEW |