| 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:math" as math; | 7 import "dart:math" as math; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analyzer/src/generated/utilities_collection.dart'; | 10 import 'package:analyzer/src/generated/utilities_collection.dart'; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 /** | 28 /** |
| 29 * Callback signature used by ImplicitConstructorBuilder to register | 29 * Callback signature used by ImplicitConstructorBuilder to register |
| 30 * computations to be performed, and their dependencies. A call to this | 30 * computations to be performed, and their dependencies. A call to this |
| 31 * callback indicates that [computation] may be used to compute implicit | 31 * callback indicates that [computation] may be used to compute implicit |
| 32 * constructors for [classElement], but that the computation may not be invoked | 32 * constructors for [classElement], but that the computation may not be invoked |
| 33 * until after implicit constructors have been built for [superclassElement]. | 33 * until after implicit constructors have been built for [superclassElement]. |
| 34 */ | 34 */ |
| 35 typedef void ImplicitConstructorBuilderCallback(ClassElement classElement, | 35 typedef void ImplicitConstructorBuilderCallback(ClassElement classElement, |
| 36 ClassElement superclassElement, void computation()); | 36 ClassElement superclassElement, void computation()); |
| 37 | 37 |
| 38 typedef ResolverVisitor ResolverVisitorFactory(Library library, Source source, | 38 typedef ResolverVisitor ResolverVisitorFactory( |
| 39 TypeProvider typeProvider); | 39 Library library, Source source, TypeProvider typeProvider); |
| 40 | 40 |
| 41 typedef StaticTypeAnalyzer StaticTypeAnalyzerFactory(ResolverVisitor visitor); | 41 typedef StaticTypeAnalyzer StaticTypeAnalyzerFactory(ResolverVisitor visitor); |
| 42 | 42 |
| 43 typedef TypeResolverVisitor TypeResolverVisitorFactory(Library library, | 43 typedef TypeResolverVisitor TypeResolverVisitorFactory( |
| 44 Source source, TypeProvider typeProvider); | 44 Library library, Source source, TypeProvider typeProvider); |
| 45 | 45 |
| 46 typedef void VoidFunction(); | 46 typedef void VoidFunction(); |
| 47 | 47 |
| 48 /** | 48 /** |
| 49 * Instances of the class `BestPracticesVerifier` traverse an AST structure look
ing for | 49 * Instances of the class `BestPracticesVerifier` traverse an AST structure look
ing for |
| 50 * violations of Dart best practices. | 50 * violations of Dart best practices. |
| 51 */ | 51 */ |
| 52 class BestPracticesVerifier extends RecursiveAstVisitor<Object> { | 52 class BestPracticesVerifier extends RecursiveAstVisitor<Object> { |
| 53 // static String _HASHCODE_GETTER_NAME = "hashCode"; | 53 // static String _HASHCODE_GETTER_NAME = "hashCode"; |
| 54 | 54 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 return super.visitPostfixExpression(node); | 181 return super.visitPostfixExpression(node); |
| 182 } | 182 } |
| 183 | 183 |
| 184 @override | 184 @override |
| 185 Object visitPrefixExpression(PrefixExpression node) { | 185 Object visitPrefixExpression(PrefixExpression node) { |
| 186 _checkForDeprecatedMemberUse(node.bestElement, node); | 186 _checkForDeprecatedMemberUse(node.bestElement, node); |
| 187 return super.visitPrefixExpression(node); | 187 return super.visitPrefixExpression(node); |
| 188 } | 188 } |
| 189 | 189 |
| 190 @override | 190 @override |
| 191 Object | 191 Object visitRedirectingConstructorInvocation( |
| 192 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 192 RedirectingConstructorInvocation node) { |
| 193 _checkForDeprecatedMemberUse(node.staticElement, node); | 193 _checkForDeprecatedMemberUse(node.staticElement, node); |
| 194 return super.visitRedirectingConstructorInvocation(node); | 194 return super.visitRedirectingConstructorInvocation(node); |
| 195 } | 195 } |
| 196 | 196 |
| 197 @override | 197 @override |
| 198 Object visitSimpleIdentifier(SimpleIdentifier node) { | 198 Object visitSimpleIdentifier(SimpleIdentifier node) { |
| 199 _checkForDeprecatedMemberUseAtIdentifier(node); | 199 _checkForDeprecatedMemberUseAtIdentifier(node); |
| 200 return super.visitSimpleIdentifier(node); | 200 return super.visitSimpleIdentifier(node); |
| 201 } | 201 } |
| 202 | 202 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 230 DartType rhsType = typeName.type; | 230 DartType rhsType = typeName.type; |
| 231 if (lhsType == null || rhsType == null) { | 231 if (lhsType == null || rhsType == null) { |
| 232 return false; | 232 return false; |
| 233 } | 233 } |
| 234 String rhsNameStr = typeName.name.name; | 234 String rhsNameStr = typeName.name.name; |
| 235 // if x is dynamic | 235 // if x is dynamic |
| 236 if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) { | 236 if (rhsType.isDynamic && rhsNameStr == sc.Keyword.DYNAMIC.syntax) { |
| 237 if (node.notOperator == null) { | 237 if (node.notOperator == null) { |
| 238 // the is case | 238 // the is case |
| 239 _errorReporter.reportErrorForNode( | 239 _errorReporter.reportErrorForNode( |
| 240 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, | 240 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node); |
| 241 node); | |
| 242 } else { | 241 } else { |
| 243 // the is not case | 242 // the is not case |
| 244 _errorReporter.reportErrorForNode( | 243 _errorReporter |
| 245 HintCode.UNNECESSARY_TYPE_CHECK_FALSE, | 244 .reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node); |
| 246 node); | |
| 247 } | 245 } |
| 248 return true; | 246 return true; |
| 249 } | 247 } |
| 250 Element rhsElement = rhsType.element; | 248 Element rhsElement = rhsType.element; |
| 251 LibraryElement libraryElement = | 249 LibraryElement libraryElement = |
| 252 rhsElement != null ? rhsElement.library : null; | 250 rhsElement != null ? rhsElement.library : null; |
| 253 if (libraryElement != null && libraryElement.isDartCore) { | 251 if (libraryElement != null && libraryElement.isDartCore) { |
| 254 // if x is Object or null is Null | 252 // if x is Object or null is Null |
| 255 if (rhsType.isObject || | 253 if (rhsType.isObject || |
| 256 (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) { | 254 (expression is NullLiteral && rhsNameStr == _NULL_TYPE_NAME)) { |
| 257 if (node.notOperator == null) { | 255 if (node.notOperator == null) { |
| 258 // the is case | 256 // the is case |
| 259 _errorReporter.reportErrorForNode( | 257 _errorReporter.reportErrorForNode( |
| 260 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, | 258 HintCode.UNNECESSARY_TYPE_CHECK_TRUE, node); |
| 261 node); | |
| 262 } else { | 259 } else { |
| 263 // the is not case | 260 // the is not case |
| 264 _errorReporter.reportErrorForNode( | 261 _errorReporter |
| 265 HintCode.UNNECESSARY_TYPE_CHECK_FALSE, | 262 .reportErrorForNode(HintCode.UNNECESSARY_TYPE_CHECK_FALSE, node); |
| 266 node); | |
| 267 } | 263 } |
| 268 return true; | 264 return true; |
| 269 } else if (rhsNameStr == _NULL_TYPE_NAME) { | 265 } else if (rhsNameStr == _NULL_TYPE_NAME) { |
| 270 if (node.notOperator == null) { | 266 if (node.notOperator == null) { |
| 271 // the is case | 267 // the is case |
| 272 _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node); | 268 _errorReporter.reportErrorForNode(HintCode.TYPE_CHECK_IS_NULL, node); |
| 273 } else { | 269 } else { |
| 274 // the is not case | 270 // the is not case |
| 275 _errorReporter.reportErrorForNode( | 271 _errorReporter |
| 276 HintCode.TYPE_CHECK_IS_NOT_NULL, | 272 .reportErrorForNode(HintCode.TYPE_CHECK_IS_NOT_NULL, node); |
| 277 node); | |
| 278 } | 273 } |
| 279 return true; | 274 return true; |
| 280 } | 275 } |
| 281 } | 276 } |
| 282 return false; | 277 return false; |
| 283 } | 278 } |
| 284 | 279 |
| 285 /** | 280 /** |
| 286 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. | 281 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. |
| 287 * | 282 * |
| (...skipping 22 matching lines...) Expand all Loading... |
| 310 if (!actualStaticType.isAssignableTo(expectedStaticType)) { | 305 if (!actualStaticType.isAssignableTo(expectedStaticType)) { |
| 311 // A warning was created in the ErrorVerifier, return false, don't | 306 // A warning was created in the ErrorVerifier, return false, don't |
| 312 // create a hint when a warning has already been created. | 307 // create a hint when a warning has already been created. |
| 313 return false; | 308 return false; |
| 314 } | 309 } |
| 315 } | 310 } |
| 316 // | 311 // |
| 317 // Hint case: test propagated type information | 312 // Hint case: test propagated type information |
| 318 // | 313 // |
| 319 // Compute the best types to use. | 314 // Compute the best types to use. |
| 320 DartType expectedBestType = | 315 DartType expectedBestType = expectedPropagatedType != null |
| 321 expectedPropagatedType != null ? expectedPropagatedType : expectedStatic
Type; | 316 ? expectedPropagatedType |
| 317 : expectedStaticType; |
| 322 DartType actualBestType = | 318 DartType actualBestType = |
| 323 actualPropagatedType != null ? actualPropagatedType : actualStaticType; | 319 actualPropagatedType != null ? actualPropagatedType : actualStaticType; |
| 324 if (actualBestType != null && expectedBestType != null) { | 320 if (actualBestType != null && expectedBestType != null) { |
| 325 if (!actualBestType.isAssignableTo(expectedBestType)) { | 321 if (!actualBestType.isAssignableTo(expectedBestType)) { |
| 326 _errorReporter.reportTypeErrorForNode( | 322 _errorReporter.reportTypeErrorForNode( |
| 327 hintCode, | 323 hintCode, expression, [actualBestType, expectedBestType]); |
| 328 expression, | |
| 329 [actualBestType, expectedBestType]); | |
| 330 return true; | 324 return true; |
| 331 } | 325 } |
| 332 } | 326 } |
| 333 return false; | 327 return false; |
| 334 } | 328 } |
| 335 | 329 |
| 336 /** | 330 /** |
| 337 * This verifies that the passed argument can be assigned to its corresponding
parameter. | 331 * This verifies that the passed argument can be assigned to its corresponding
parameter. |
| 338 * | 332 * |
| 339 * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableForAr
gument. | 333 * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableForAr
gument. |
| 340 * | 334 * |
| 341 * @param argument the argument to evaluate | 335 * @param argument the argument to evaluate |
| 342 * @return `true` if and only if an hint code is generated on the passed node | 336 * @return `true` if and only if an hint code is generated on the passed node |
| 343 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. | 337 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. |
| 344 */ | 338 */ |
| 345 bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) { | 339 bool _checkForArgumentTypeNotAssignableForArgument(Expression argument) { |
| 346 if (argument == null) { | 340 if (argument == null) { |
| 347 return false; | 341 return false; |
| 348 } | 342 } |
| 349 ParameterElement staticParameterElement = argument.staticParameterElement; | 343 ParameterElement staticParameterElement = argument.staticParameterElement; |
| 350 DartType staticParameterType = | 344 DartType staticParameterType = |
| 351 staticParameterElement == null ? null : staticParameterElement.type; | 345 staticParameterElement == null ? null : staticParameterElement.type; |
| 352 ParameterElement propagatedParameterElement = | 346 ParameterElement propagatedParameterElement = |
| 353 argument.propagatedParameterElement; | 347 argument.propagatedParameterElement; |
| 354 DartType propagatedParameterType = | 348 DartType propagatedParameterType = propagatedParameterElement == null |
| 355 propagatedParameterElement == null ? null : propagatedParameterElement.t
ype; | 349 ? null |
| 356 return _checkForArgumentTypeNotAssignableWithExpectedTypes( | 350 : propagatedParameterElement.type; |
| 357 argument, | 351 return _checkForArgumentTypeNotAssignableWithExpectedTypes(argument, |
| 358 staticParameterType, | 352 staticParameterType, propagatedParameterType, |
| 359 propagatedParameterType, | |
| 360 HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE); | 353 HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE); |
| 361 } | 354 } |
| 362 | 355 |
| 363 /** | 356 /** |
| 364 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. | 357 * This verifies that the passed expression can be assigned to its correspondi
ng parameters. |
| 365 * | 358 * |
| 366 * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableWithE
xpectedTypes. | 359 * This method corresponds to ErrorCode.checkForArgumentTypeNotAssignableWithE
xpectedTypes. |
| 367 * | 360 * |
| 368 * @param expression the expression to evaluate | 361 * @param expression the expression to evaluate |
| 369 * @param expectedStaticType the expected static type | 362 * @param expectedStaticType the expected static type |
| 370 * @param expectedPropagatedType the expected propagated type, may be `null` | 363 * @param expectedPropagatedType the expected propagated type, may be `null` |
| 371 * @return `true` if and only if an hint code is generated on the passed node | 364 * @return `true` if and only if an hint code is generated on the passed node |
| 372 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. | 365 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. |
| 373 */ | 366 */ |
| 374 bool | 367 bool _checkForArgumentTypeNotAssignableWithExpectedTypes( |
| 375 _checkForArgumentTypeNotAssignableWithExpectedTypes(Expression expression, | 368 Expression expression, DartType expectedStaticType, |
| 376 DartType expectedStaticType, DartType expectedPropagatedType, | 369 DartType expectedPropagatedType, ErrorCode errorCode) => |
| 377 ErrorCode errorCode) => | 370 _checkForArgumentTypeNotAssignable(expression, expectedStaticType, |
| 378 _checkForArgumentTypeNotAssignable( | 371 expression.staticType, expectedPropagatedType, |
| 379 expression, | 372 expression.propagatedType, errorCode); |
| 380 expectedStaticType, | |
| 381 expression.staticType, | |
| 382 expectedPropagatedType, | |
| 383 expression.propagatedType, | |
| 384 errorCode); | |
| 385 | 373 |
| 386 /** | 374 /** |
| 387 * This verifies that the passed arguments can be assigned to their correspond
ing parameters. | 375 * This verifies that the passed arguments can be assigned to their correspond
ing parameters. |
| 388 * | 376 * |
| 389 * This method corresponds to ErrorCode.checkForArgumentTypesNotAssignableInLi
st. | 377 * This method corresponds to ErrorCode.checkForArgumentTypesNotAssignableInLi
st. |
| 390 * | 378 * |
| 391 * @param node the arguments to evaluate | 379 * @param node the arguments to evaluate |
| 392 * @return `true` if and only if an hint code is generated on the passed node | 380 * @return `true` if and only if an hint code is generated on the passed node |
| 393 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. | 381 * See [HintCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. |
| 394 */ | 382 */ |
| (...skipping 26 matching lines...) Expand all Loading... |
| 421 // TODO(jwren) We should modify ConstructorElement.getDisplayName(), | 409 // TODO(jwren) We should modify ConstructorElement.getDisplayName(), |
| 422 // or have the logic centralized elsewhere, instead of doing this logic | 410 // or have the logic centralized elsewhere, instead of doing this logic |
| 423 // here. | 411 // here. |
| 424 ConstructorElement constructorElement = element; | 412 ConstructorElement constructorElement = element; |
| 425 displayName = constructorElement.enclosingElement.displayName; | 413 displayName = constructorElement.enclosingElement.displayName; |
| 426 if (!constructorElement.displayName.isEmpty) { | 414 if (!constructorElement.displayName.isEmpty) { |
| 427 displayName = "$displayName.${constructorElement.displayName}"; | 415 displayName = "$displayName.${constructorElement.displayName}"; |
| 428 } | 416 } |
| 429 } | 417 } |
| 430 _errorReporter.reportErrorForNode( | 418 _errorReporter.reportErrorForNode( |
| 431 HintCode.DEPRECATED_MEMBER_USE, | 419 HintCode.DEPRECATED_MEMBER_USE, node, [displayName]); |
| 432 node, | |
| 433 [displayName]); | |
| 434 return true; | 420 return true; |
| 435 } | 421 } |
| 436 return false; | 422 return false; |
| 437 } | 423 } |
| 438 | 424 |
| 439 /** | 425 /** |
| 440 * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse] | 426 * For [SimpleIdentifier]s, only call [checkForDeprecatedMemberUse] |
| 441 * if the node is not in a declaration context. | 427 * if the node is not in a declaration context. |
| 442 * | 428 * |
| 443 * Also, if the identifier is a constructor name in a constructor invocation,
then calls to the | 429 * Also, if the identifier is a constructor name in a constructor invocation,
then calls to the |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 // Report error if the (x/y) has toInt() invoked on it | 475 // Report error if the (x/y) has toInt() invoked on it |
| 490 if (node.parent is ParenthesizedExpression) { | 476 if (node.parent is ParenthesizedExpression) { |
| 491 ParenthesizedExpression parenthesizedExpression = | 477 ParenthesizedExpression parenthesizedExpression = |
| 492 _wrapParenthesizedExpression(node.parent as ParenthesizedExpression); | 478 _wrapParenthesizedExpression(node.parent as ParenthesizedExpression); |
| 493 if (parenthesizedExpression.parent is MethodInvocation) { | 479 if (parenthesizedExpression.parent is MethodInvocation) { |
| 494 MethodInvocation methodInvocation = | 480 MethodInvocation methodInvocation = |
| 495 parenthesizedExpression.parent as MethodInvocation; | 481 parenthesizedExpression.parent as MethodInvocation; |
| 496 if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && | 482 if (_TO_INT_METHOD_NAME == methodInvocation.methodName.name && |
| 497 methodInvocation.argumentList.arguments.isEmpty) { | 483 methodInvocation.argumentList.arguments.isEmpty) { |
| 498 _errorReporter.reportErrorForNode( | 484 _errorReporter.reportErrorForNode( |
| 499 HintCode.DIVISION_OPTIMIZATION, | 485 HintCode.DIVISION_OPTIMIZATION, methodInvocation); |
| 500 methodInvocation); | |
| 501 return true; | 486 return true; |
| 502 } | 487 } |
| 503 } | 488 } |
| 504 } | 489 } |
| 505 return false; | 490 return false; |
| 506 } | 491 } |
| 507 | 492 |
| 508 /** | 493 /** |
| 509 * This verifies that the passed left hand side and right hand side represent
a valid assignment. | 494 * This verifies that the passed left hand side and right hand side represent
a valid assignment. |
| 510 * | 495 * |
| 511 * This method corresponds to ErrorVerifier.checkForInvalidAssignment. | 496 * This method corresponds to ErrorVerifier.checkForInvalidAssignment. |
| 512 * | 497 * |
| 513 * @param lhs the left hand side expression | 498 * @param lhs the left hand side expression |
| 514 * @param rhs the right hand side expression | 499 * @param rhs the right hand side expression |
| 515 * @return `true` if and only if an error code is generated on the passed node | 500 * @return `true` if and only if an error code is generated on the passed node |
| 516 * See [HintCode.INVALID_ASSIGNMENT]. | 501 * See [HintCode.INVALID_ASSIGNMENT]. |
| 517 */ | 502 */ |
| 518 bool _checkForInvalidAssignment(Expression lhs, Expression rhs) { | 503 bool _checkForInvalidAssignment(Expression lhs, Expression rhs) { |
| 519 if (lhs == null || rhs == null) { | 504 if (lhs == null || rhs == null) { |
| 520 return false; | 505 return false; |
| 521 } | 506 } |
| 522 VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs); | 507 VariableElement leftVariableElement = ErrorVerifier.getVariableElement(lhs); |
| 523 DartType leftType = (leftVariableElement == null) ? | 508 DartType leftType = (leftVariableElement == null) |
| 524 ErrorVerifier.getStaticType(lhs) : | 509 ? ErrorVerifier.getStaticType(lhs) |
| 525 leftVariableElement.type; | 510 : leftVariableElement.type; |
| 526 DartType staticRightType = ErrorVerifier.getStaticType(rhs); | 511 DartType staticRightType = ErrorVerifier.getStaticType(rhs); |
| 527 if (!staticRightType.isAssignableTo(leftType)) { | 512 if (!staticRightType.isAssignableTo(leftType)) { |
| 528 // The warning was generated on this rhs | 513 // The warning was generated on this rhs |
| 529 return false; | 514 return false; |
| 530 } | 515 } |
| 531 // Test for, and then generate the hint | 516 // Test for, and then generate the hint |
| 532 DartType bestRightType = rhs.bestType; | 517 DartType bestRightType = rhs.bestType; |
| 533 if (leftType != null && bestRightType != null) { | 518 if (leftType != null && bestRightType != null) { |
| 534 if (!bestRightType.isAssignableTo(leftType)) { | 519 if (!bestRightType.isAssignableTo(leftType)) { |
| 535 _errorReporter.reportTypeErrorForNode( | 520 _errorReporter.reportTypeErrorForNode( |
| 536 HintCode.INVALID_ASSIGNMENT, | 521 HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]); |
| 537 rhs, | |
| 538 [bestRightType, leftType]); | |
| 539 return true; | 522 return true; |
| 540 } | 523 } |
| 541 } | 524 } |
| 542 return false; | 525 return false; |
| 543 } | 526 } |
| 544 | 527 |
| 545 /** | 528 /** |
| 546 * Check that the imported library does not define a loadLibrary function. The
import has already | 529 * Check that the imported library does not define a loadLibrary function. The
import has already |
| 547 * been determined to be deferred when this is called. | 530 * been determined to be deferred when this is called. |
| 548 * | 531 * |
| 549 * @param node the import directive to evaluate | 532 * @param node the import directive to evaluate |
| 550 * @param importElement the [ImportElement] retrieved from the node | 533 * @param importElement the [ImportElement] retrieved from the node |
| 551 * @return `true` if and only if an error code is generated on the passed node | 534 * @return `true` if and only if an error code is generated on the passed node |
| 552 * See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]. | 535 * See [CompileTimeErrorCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]. |
| 553 */ | 536 */ |
| 554 bool _checkForLoadLibraryFunction(ImportDirective node, | 537 bool _checkForLoadLibraryFunction( |
| 555 ImportElement importElement) { | 538 ImportDirective node, ImportElement importElement) { |
| 556 LibraryElement importedLibrary = importElement.importedLibrary; | 539 LibraryElement importedLibrary = importElement.importedLibrary; |
| 557 if (importedLibrary == null) { | 540 if (importedLibrary == null) { |
| 558 return false; | 541 return false; |
| 559 } | 542 } |
| 560 if (importedLibrary.hasLoadLibraryFunction) { | 543 if (importedLibrary.hasLoadLibraryFunction) { |
| 561 _errorReporter.reportErrorForNode( | 544 _errorReporter.reportErrorForNode( |
| 562 HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, | 545 HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION, node, [ |
| 563 node, | 546 importedLibrary.name |
| 564 [importedLibrary.name]); | 547 ]); |
| 565 return true; | 548 return true; |
| 566 } | 549 } |
| 567 return false; | 550 return false; |
| 568 } | 551 } |
| 569 | 552 |
| 570 /** | 553 /** |
| 571 * Generate a hint for functions or methods that have a return type, but do no
t have a return | 554 * Generate a hint for functions or methods that have a return type, but do no
t have a return |
| 572 * statement on all branches. At the end of blocks with no return, Dart implic
itly returns | 555 * statement on all branches. At the end of blocks with no return, Dart implic
itly returns |
| 573 * `null`, avoiding these implicit returns is considered a best practice. | 556 * `null`, avoiding these implicit returns is considered a best practice. |
| 574 * | 557 * |
| (...skipping 25 matching lines...) Expand all Loading... |
| 600 } | 583 } |
| 601 // For async, give no hint if Future<Null> is assignable to the return | 584 // For async, give no hint if Future<Null> is assignable to the return |
| 602 // type. | 585 // type. |
| 603 if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) { | 586 if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) { |
| 604 return false; | 587 return false; |
| 605 } | 588 } |
| 606 // Check the block for a return statement, if not, create the hint | 589 // Check the block for a return statement, if not, create the hint |
| 607 BlockFunctionBody blockFunctionBody = body as BlockFunctionBody; | 590 BlockFunctionBody blockFunctionBody = body as BlockFunctionBody; |
| 608 if (!ExitDetector.exits(blockFunctionBody)) { | 591 if (!ExitDetector.exits(blockFunctionBody)) { |
| 609 _errorReporter.reportErrorForNode( | 592 _errorReporter.reportErrorForNode( |
| 610 HintCode.MISSING_RETURN, | 593 HintCode.MISSING_RETURN, returnType, [returnTypeType.displayName]); |
| 611 returnType, | |
| 612 [returnTypeType.displayName]); | |
| 613 return true; | 594 return true; |
| 614 } | 595 } |
| 615 return false; | 596 return false; |
| 616 } | 597 } |
| 617 | 598 |
| 618 /** | 599 /** |
| 619 * Check for the passed class declaration for the | 600 * Check for the passed class declaration for the |
| 620 * [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code. | 601 * [HintCode.OVERRIDE_EQUALS_BUT_NOT_HASH_CODE] hint code. |
| 621 * | 602 * |
| 622 * @param node the class declaration to check | 603 * @param node the class declaration to check |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 705 * See [HintCode.USE_OF_VOID_RESULT]. | 686 * See [HintCode.USE_OF_VOID_RESULT]. |
| 706 */ | 687 */ |
| 707 bool _checkForUseOfVoidResult(Expression expression) { | 688 bool _checkForUseOfVoidResult(Expression expression) { |
| 708 if (expression == null || expression is! MethodInvocation) { | 689 if (expression == null || expression is! MethodInvocation) { |
| 709 return false; | 690 return false; |
| 710 } | 691 } |
| 711 MethodInvocation methodInvocation = expression as MethodInvocation; | 692 MethodInvocation methodInvocation = expression as MethodInvocation; |
| 712 if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) { | 693 if (identical(methodInvocation.staticType, VoidTypeImpl.instance)) { |
| 713 SimpleIdentifier methodName = methodInvocation.methodName; | 694 SimpleIdentifier methodName = methodInvocation.methodName; |
| 714 _errorReporter.reportErrorForNode( | 695 _errorReporter.reportErrorForNode( |
| 715 HintCode.USE_OF_VOID_RESULT, | 696 HintCode.USE_OF_VOID_RESULT, methodName, [methodName.name]); |
| 716 methodName, | |
| 717 [methodName.name]); | |
| 718 return true; | 697 return true; |
| 719 } | 698 } |
| 720 return false; | 699 return false; |
| 721 } | 700 } |
| 722 | 701 |
| 723 /** | 702 /** |
| 724 * Given a parenthesized expression, this returns the parent (or recursively g
rand-parent) of the | 703 * Given a parenthesized expression, this returns the parent (or recursively g
rand-parent) of the |
| 725 * expression that is a parenthesized expression, but whose parent is not a pa
renthesized | 704 * expression that is a parenthesized expression, but whose parent is not a pa
renthesized |
| 726 * expression. | 705 * expression. |
| 727 * | 706 * |
| 728 * For example given the code `(((e)))`: `(e) -> (((e)))`. | 707 * For example given the code `(((e)))`: `(e) -> (((e)))`. |
| 729 * | 708 * |
| 730 * @param parenthesizedExpression some expression whose parent is a parenthesi
zed expression | 709 * @param parenthesizedExpression some expression whose parent is a parenthesi
zed expression |
| 731 * @return the first parent or grand-parent that is a parenthesized expression
, that does not have | 710 * @return the first parent or grand-parent that is a parenthesized expression
, that does not have |
| 732 * a parenthesized expression parent | 711 * a parenthesized expression parent |
| 733 */ | 712 */ |
| 734 static ParenthesizedExpression | 713 static ParenthesizedExpression _wrapParenthesizedExpression( |
| 735 _wrapParenthesizedExpression(ParenthesizedExpression parenthesizedExpressi
on) { | 714 ParenthesizedExpression parenthesizedExpression) { |
| 736 if (parenthesizedExpression.parent is ParenthesizedExpression) { | 715 if (parenthesizedExpression.parent is ParenthesizedExpression) { |
| 737 return _wrapParenthesizedExpression( | 716 return _wrapParenthesizedExpression( |
| 738 parenthesizedExpression.parent as ParenthesizedExpression); | 717 parenthesizedExpression.parent as ParenthesizedExpression); |
| 739 } | 718 } |
| 740 return parenthesizedExpression; | 719 return parenthesizedExpression; |
| 741 } | 720 } |
| 742 } | 721 } |
| 743 | 722 |
| 744 /** | 723 /** |
| 745 * Instances of the class `ClassScope` implement the scope defined by a class. | 724 * Instances of the class `ClassScope` implement the scope defined by a class. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 756 if (typeElement == null) { | 735 if (typeElement == null) { |
| 757 throw new IllegalArgumentException("class element cannot be null"); | 736 throw new IllegalArgumentException("class element cannot be null"); |
| 758 } | 737 } |
| 759 _defineMembers(typeElement); | 738 _defineMembers(typeElement); |
| 760 } | 739 } |
| 761 | 740 |
| 762 @override | 741 @override |
| 763 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { | 742 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { |
| 764 if (existing is PropertyAccessorElement && duplicate is MethodElement) { | 743 if (existing is PropertyAccessorElement && duplicate is MethodElement) { |
| 765 if (existing.nameOffset < duplicate.nameOffset) { | 744 if (existing.nameOffset < duplicate.nameOffset) { |
| 766 return new AnalysisError.con2( | 745 return new AnalysisError.con2(duplicate.source, duplicate.nameOffset, |
| 767 duplicate.source, | |
| 768 duplicate.nameOffset, | |
| 769 duplicate.displayName.length, | 746 duplicate.displayName.length, |
| 770 CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, | 747 CompileTimeErrorCode.METHOD_AND_GETTER_WITH_SAME_NAME, [ |
| 771 [existing.displayName]); | 748 existing.displayName |
| 749 ]); |
| 772 } else { | 750 } else { |
| 773 return new AnalysisError.con2( | 751 return new AnalysisError.con2(existing.source, existing.nameOffset, |
| 774 existing.source, | |
| 775 existing.nameOffset, | |
| 776 existing.displayName.length, | 752 existing.displayName.length, |
| 777 CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, | 753 CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME, [ |
| 778 [existing.displayName]); | 754 existing.displayName |
| 755 ]); |
| 779 } | 756 } |
| 780 } | 757 } |
| 781 return super.getErrorForDuplicate(existing, duplicate); | 758 return super.getErrorForDuplicate(existing, duplicate); |
| 782 } | 759 } |
| 783 | 760 |
| 784 /** | 761 /** |
| 785 * Define the instance members defined by the class. | 762 * Define the instance members defined by the class. |
| 786 * | 763 * |
| 787 * @param typeElement the element representing the type represented by this sc
ope | 764 * @param typeElement the element representing the type represented by this sc
ope |
| 788 */ | 765 */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 799 /** | 776 /** |
| 800 * A `CompilationUnitBuilder` builds an element model for a single compilation | 777 * A `CompilationUnitBuilder` builds an element model for a single compilation |
| 801 * unit. | 778 * unit. |
| 802 */ | 779 */ |
| 803 class CompilationUnitBuilder { | 780 class CompilationUnitBuilder { |
| 804 /** | 781 /** |
| 805 * Build the compilation unit element for the given [source] based on the | 782 * Build the compilation unit element for the given [source] based on the |
| 806 * compilation [unit] associated with the source. Throw an AnalysisException | 783 * compilation [unit] associated with the source. Throw an AnalysisException |
| 807 * if the element could not be built. | 784 * if the element could not be built. |
| 808 */ | 785 */ |
| 809 CompilationUnitElementImpl buildCompilationUnit(Source source, | 786 CompilationUnitElementImpl buildCompilationUnit( |
| 810 CompilationUnit unit) { | 787 Source source, CompilationUnit unit) { |
| 811 return PerformanceStatistics.resolve.makeCurrentWhile(() { | 788 return PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 812 if (unit == null) { | 789 if (unit == null) { |
| 813 return null; | 790 return null; |
| 814 } | 791 } |
| 815 ElementHolder holder = new ElementHolder(); | 792 ElementHolder holder = new ElementHolder(); |
| 816 ElementBuilder builder = new ElementBuilder(holder); | 793 ElementBuilder builder = new ElementBuilder(holder); |
| 817 unit.accept(builder); | 794 unit.accept(builder); |
| 818 CompilationUnitElementImpl element = | 795 CompilationUnitElementImpl element = |
| 819 new CompilationUnitElementImpl(source.shortName); | 796 new CompilationUnitElementImpl(source.shortName); |
| 820 element.accessors = holder.accessors; | 797 element.accessors = holder.accessors; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 /** | 847 /** |
| 871 * The current library that is being analyzed. | 848 * The current library that is being analyzed. |
| 872 */ | 849 */ |
| 873 final LibraryElement _currentLibrary; | 850 final LibraryElement _currentLibrary; |
| 874 | 851 |
| 875 /** | 852 /** |
| 876 * Initialize a newly created constant verifier. | 853 * Initialize a newly created constant verifier. |
| 877 * | 854 * |
| 878 * @param errorReporter the error reporter by which errors will be reported | 855 * @param errorReporter the error reporter by which errors will be reported |
| 879 */ | 856 */ |
| 880 ConstantVerifier(this._errorReporter, this._currentLibrary, | 857 ConstantVerifier( |
| 881 this._typeProvider) { | 858 this._errorReporter, this._currentLibrary, this._typeProvider) { |
| 882 this._boolType = _typeProvider.boolType; | 859 this._boolType = _typeProvider.boolType; |
| 883 this._intType = _typeProvider.intType; | 860 this._intType = _typeProvider.intType; |
| 884 this._numType = _typeProvider.numType; | 861 this._numType = _typeProvider.numType; |
| 885 this._stringType = _typeProvider.stringType; | 862 this._stringType = _typeProvider.stringType; |
| 886 } | 863 } |
| 887 | 864 |
| 888 @override | 865 @override |
| 889 Object visitAnnotation(Annotation node) { | 866 Object visitAnnotation(Annotation node) { |
| 890 super.visitAnnotation(node); | 867 super.visitAnnotation(node); |
| 891 // check annotation creation | 868 // check annotation creation |
| 892 Element element = node.element; | 869 Element element = node.element; |
| 893 if (element is ConstructorElement) { | 870 if (element is ConstructorElement) { |
| 894 ConstructorElement constructorElement = element; | 871 ConstructorElement constructorElement = element; |
| 895 // should 'const' constructor | 872 // should 'const' constructor |
| 896 if (!constructorElement.isConst) { | 873 if (!constructorElement.isConst) { |
| 897 _errorReporter.reportErrorForNode( | 874 _errorReporter.reportErrorForNode( |
| 898 CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, | 875 CompileTimeErrorCode.NON_CONSTANT_ANNOTATION_CONSTRUCTOR, node); |
| 899 node); | |
| 900 return null; | 876 return null; |
| 901 } | 877 } |
| 902 // should have arguments | 878 // should have arguments |
| 903 ArgumentList argumentList = node.arguments; | 879 ArgumentList argumentList = node.arguments; |
| 904 if (argumentList == null) { | 880 if (argumentList == null) { |
| 905 _errorReporter.reportErrorForNode( | 881 _errorReporter.reportErrorForNode( |
| 906 CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, | 882 CompileTimeErrorCode.NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS, node); |
| 907 node); | |
| 908 return null; | 883 return null; |
| 909 } | 884 } |
| 910 // arguments should be constants | 885 // arguments should be constants |
| 911 _validateConstantArguments(argumentList); | 886 _validateConstantArguments(argumentList); |
| 912 } | 887 } |
| 913 return null; | 888 return null; |
| 914 } | 889 } |
| 915 | 890 |
| 916 @override | 891 @override |
| 917 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 892 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 946 | 921 |
| 947 @override | 922 @override |
| 948 Object visitListLiteral(ListLiteral node) { | 923 Object visitListLiteral(ListLiteral node) { |
| 949 super.visitListLiteral(node); | 924 super.visitListLiteral(node); |
| 950 if (node.constKeyword != null) { | 925 if (node.constKeyword != null) { |
| 951 DartObjectImpl result; | 926 DartObjectImpl result; |
| 952 for (Expression element in node.elements) { | 927 for (Expression element in node.elements) { |
| 953 result = | 928 result = |
| 954 _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); | 929 _validate(element, CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT); |
| 955 if (result != null) { | 930 if (result != null) { |
| 956 _reportErrorIfFromDeferredLibrary( | 931 _reportErrorIfFromDeferredLibrary(element, |
| 957 element, | |
| 958 CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRA
RY); | 932 CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRA
RY); |
| 959 } | 933 } |
| 960 } | 934 } |
| 961 } | 935 } |
| 962 return null; | 936 return null; |
| 963 } | 937 } |
| 964 | 938 |
| 965 @override | 939 @override |
| 966 Object visitMapLiteral(MapLiteral node) { | 940 Object visitMapLiteral(MapLiteral node) { |
| 967 super.visitMapLiteral(node); | 941 super.visitMapLiteral(node); |
| 968 bool isConst = node.constKeyword != null; | 942 bool isConst = node.constKeyword != null; |
| 969 bool reportEqualKeys = true; | 943 bool reportEqualKeys = true; |
| 970 HashSet<DartObject> keys = new HashSet<DartObject>(); | 944 HashSet<DartObject> keys = new HashSet<DartObject>(); |
| 971 List<Expression> invalidKeys = new List<Expression>(); | 945 List<Expression> invalidKeys = new List<Expression>(); |
| 972 for (MapLiteralEntry entry in node.entries) { | 946 for (MapLiteralEntry entry in node.entries) { |
| 973 Expression key = entry.key; | 947 Expression key = entry.key; |
| 974 if (isConst) { | 948 if (isConst) { |
| 975 DartObjectImpl keyResult = | 949 DartObjectImpl keyResult = |
| 976 _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY); | 950 _validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY); |
| 977 Expression valueExpression = entry.value; | 951 Expression valueExpression = entry.value; |
| 978 DartObjectImpl valueResult = | 952 DartObjectImpl valueResult = _validate( |
| 979 _validate(valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VAL
UE); | 953 valueExpression, CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); |
| 980 if (valueResult != null) { | 954 if (valueResult != null) { |
| 981 _reportErrorIfFromDeferredLibrary( | 955 _reportErrorIfFromDeferredLibrary(valueExpression, |
| 982 valueExpression, | |
| 983 CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY)
; | 956 CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY)
; |
| 984 } | 957 } |
| 985 if (keyResult != null) { | 958 if (keyResult != null) { |
| 986 _reportErrorIfFromDeferredLibrary( | 959 _reportErrorIfFromDeferredLibrary(key, |
| 987 key, | |
| 988 CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY); | 960 CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY); |
| 989 if (keys.contains(keyResult)) { | 961 if (keys.contains(keyResult)) { |
| 990 invalidKeys.add(key); | 962 invalidKeys.add(key); |
| 991 } else { | 963 } else { |
| 992 keys.add(keyResult); | 964 keys.add(keyResult); |
| 993 } | 965 } |
| 994 DartType type = keyResult.type; | 966 DartType type = keyResult.type; |
| 995 if (_implementsEqualsWhenNotAllowed(type)) { | 967 if (_implementsEqualsWhenNotAllowed(type)) { |
| 996 _errorReporter.reportErrorForNode( | 968 _errorReporter.reportErrorForNode( |
| 997 CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQ
UALS, | 969 CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQ
UALS, |
| 998 key, | 970 key, [type.displayName]); |
| 999 [type.displayName]); | |
| 1000 } | 971 } |
| 1001 } | 972 } |
| 1002 } else { | 973 } else { |
| 1003 // Note: we throw the errors away because this isn't actually a const. | 974 // Note: we throw the errors away because this isn't actually a const. |
| 1004 AnalysisErrorListener errorListener = | 975 AnalysisErrorListener errorListener = |
| 1005 AnalysisErrorListener.NULL_LISTENER; | 976 AnalysisErrorListener.NULL_LISTENER; |
| 1006 ErrorReporter subErrorReporter = | 977 ErrorReporter subErrorReporter = |
| 1007 new ErrorReporter(errorListener, _errorReporter.source); | 978 new ErrorReporter(errorListener, _errorReporter.source); |
| 1008 DartObjectImpl result = | 979 DartObjectImpl result = key |
| 1009 key.accept(new ConstantVisitor.con1(_typeProvider, subErrorReporter)
); | 980 .accept(new ConstantVisitor.con1(_typeProvider, subErrorReporter)); |
| 1010 if (result != null) { | 981 if (result != null) { |
| 1011 if (keys.contains(result)) { | 982 if (keys.contains(result)) { |
| 1012 invalidKeys.add(key); | 983 invalidKeys.add(key); |
| 1013 } else { | 984 } else { |
| 1014 keys.add(result); | 985 keys.add(result); |
| 1015 } | 986 } |
| 1016 } else { | 987 } else { |
| 1017 reportEqualKeys = false; | 988 reportEqualKeys = false; |
| 1018 } | 989 } |
| 1019 } | 990 } |
| 1020 } | 991 } |
| 1021 if (reportEqualKeys) { | 992 if (reportEqualKeys) { |
| 1022 for (Expression key in invalidKeys) { | 993 for (Expression key in invalidKeys) { |
| 1023 _errorReporter.reportErrorForNode( | 994 _errorReporter.reportErrorForNode( |
| 1024 StaticWarningCode.EQUAL_KEYS_IN_MAP, | 995 StaticWarningCode.EQUAL_KEYS_IN_MAP, key); |
| 1025 key); | |
| 1026 } | 996 } |
| 1027 } | 997 } |
| 1028 return null; | 998 return null; |
| 1029 } | 999 } |
| 1030 | 1000 |
| 1031 @override | 1001 @override |
| 1032 Object visitMethodDeclaration(MethodDeclaration node) { | 1002 Object visitMethodDeclaration(MethodDeclaration node) { |
| 1033 super.visitMethodDeclaration(node); | 1003 super.visitMethodDeclaration(node); |
| 1034 _validateDefaultValues(node.parameters); | 1004 _validateDefaultValues(node.parameters); |
| 1035 return null; | 1005 return null; |
| 1036 } | 1006 } |
| 1037 | 1007 |
| 1038 @override | 1008 @override |
| 1039 Object visitSwitchStatement(SwitchStatement node) { | 1009 Object visitSwitchStatement(SwitchStatement node) { |
| 1040 // TODO(paulberry): to minimize error messages, it would be nice to | 1010 // TODO(paulberry): to minimize error messages, it would be nice to |
| 1041 // compare all types with the most popular type rather than the first | 1011 // compare all types with the most popular type rather than the first |
| 1042 // type. | 1012 // type. |
| 1043 NodeList<SwitchMember> switchMembers = node.members; | 1013 NodeList<SwitchMember> switchMembers = node.members; |
| 1044 bool foundError = false; | 1014 bool foundError = false; |
| 1045 DartType firstType = null; | 1015 DartType firstType = null; |
| 1046 for (SwitchMember switchMember in switchMembers) { | 1016 for (SwitchMember switchMember in switchMembers) { |
| 1047 if (switchMember is SwitchCase) { | 1017 if (switchMember is SwitchCase) { |
| 1048 SwitchCase switchCase = switchMember; | 1018 SwitchCase switchCase = switchMember; |
| 1049 Expression expression = switchCase.expression; | 1019 Expression expression = switchCase.expression; |
| 1050 DartObjectImpl caseResult = | 1020 DartObjectImpl caseResult = _validate( |
| 1051 _validate(expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESS
ION); | 1021 expression, CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION); |
| 1052 if (caseResult != null) { | 1022 if (caseResult != null) { |
| 1053 _reportErrorIfFromDeferredLibrary( | 1023 _reportErrorIfFromDeferredLibrary(expression, |
| 1054 expression, | |
| 1055 CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LI
BRARY); | 1024 CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LI
BRARY); |
| 1056 DartObject value = caseResult; | 1025 DartObject value = caseResult; |
| 1057 if (firstType == null) { | 1026 if (firstType == null) { |
| 1058 firstType = value.type; | 1027 firstType = value.type; |
| 1059 } else { | 1028 } else { |
| 1060 DartType nType = value.type; | 1029 DartType nType = value.type; |
| 1061 if (firstType != nType) { | 1030 if (firstType != nType) { |
| 1062 _errorReporter.reportErrorForNode( | 1031 _errorReporter.reportErrorForNode( |
| 1063 CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, | 1032 CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES, |
| 1064 expression, | 1033 expression, [expression.toSource(), firstType.displayName]); |
| 1065 [expression.toSource(), firstType.displayName]); | |
| 1066 foundError = true; | 1034 foundError = true; |
| 1067 } | 1035 } |
| 1068 } | 1036 } |
| 1069 } | 1037 } |
| 1070 } | 1038 } |
| 1071 } | 1039 } |
| 1072 if (!foundError) { | 1040 if (!foundError) { |
| 1073 _checkForCaseExpressionTypeImplementsEquals(node, firstType); | 1041 _checkForCaseExpressionTypeImplementsEquals(node, firstType); |
| 1074 } | 1042 } |
| 1075 return super.visitSwitchStatement(node); | 1043 return super.visitSwitchStatement(node); |
| 1076 } | 1044 } |
| 1077 | 1045 |
| 1078 @override | 1046 @override |
| 1079 Object visitVariableDeclaration(VariableDeclaration node) { | 1047 Object visitVariableDeclaration(VariableDeclaration node) { |
| 1080 super.visitVariableDeclaration(node); | 1048 super.visitVariableDeclaration(node); |
| 1081 Expression initializer = node.initializer; | 1049 Expression initializer = node.initializer; |
| 1082 if (initializer != null && node.isConst) { | 1050 if (initializer != null && node.isConst) { |
| 1083 VariableElementImpl element = node.element as VariableElementImpl; | 1051 VariableElementImpl element = node.element as VariableElementImpl; |
| 1084 EvaluationResultImpl result = element.evaluationResult; | 1052 EvaluationResultImpl result = element.evaluationResult; |
| 1085 if (result == null) { | 1053 if (result == null) { |
| 1086 // | 1054 // |
| 1087 // Normally we don't need to visit const variable declarations because | 1055 // Normally we don't need to visit const variable declarations because |
| 1088 // we have already computed their values. But if we missed it for some | 1056 // we have already computed their values. But if we missed it for some |
| 1089 // reason, this gives us a second chance. | 1057 // reason, this gives us a second chance. |
| 1090 // | 1058 // |
| 1091 result = new EvaluationResultImpl.con1( | 1059 result = new EvaluationResultImpl.con1(_validate(initializer, |
| 1092 _validate( | 1060 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE)); |
| 1093 initializer, | |
| 1094 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE))
; | |
| 1095 element.evaluationResult = result; | 1061 element.evaluationResult = result; |
| 1096 return null; | 1062 return null; |
| 1097 } | 1063 } |
| 1098 _reportErrors( | 1064 _reportErrors(result.errors, |
| 1099 result.errors, | |
| 1100 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE); | 1065 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE); |
| 1101 _reportErrorIfFromDeferredLibrary( | 1066 _reportErrorIfFromDeferredLibrary(initializer, |
| 1102 initializer, | |
| 1103 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DE
FERRED_LIBRARY); | 1067 CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DE
FERRED_LIBRARY); |
| 1104 } | 1068 } |
| 1105 return null; | 1069 return null; |
| 1106 } | 1070 } |
| 1107 | 1071 |
| 1108 /** | 1072 /** |
| 1109 * This verifies that the passed switch statement does not have a case express
ion with the | 1073 * This verifies that the passed switch statement does not have a case express
ion with the |
| 1110 * operator '==' overridden. | 1074 * operator '==' overridden. |
| 1111 * | 1075 * |
| 1112 * @param node the switch statement to evaluate | 1076 * @param node the switch statement to evaluate |
| 1113 * @param type the common type of all 'case' expressions | 1077 * @param type the common type of all 'case' expressions |
| 1114 * @return `true` if and only if an error code is generated on the passed node | 1078 * @return `true` if and only if an error code is generated on the passed node |
| 1115 * See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]. | 1079 * See [CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS]. |
| 1116 */ | 1080 */ |
| 1117 bool _checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, | 1081 bool _checkForCaseExpressionTypeImplementsEquals( |
| 1118 DartType type) { | 1082 SwitchStatement node, DartType type) { |
| 1119 if (!_implementsEqualsWhenNotAllowed(type)) { | 1083 if (!_implementsEqualsWhenNotAllowed(type)) { |
| 1120 return false; | 1084 return false; |
| 1121 } | 1085 } |
| 1122 // report error | 1086 // report error |
| 1123 _errorReporter.reportErrorForToken( | 1087 _errorReporter.reportErrorForToken( |
| 1124 CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, | 1088 CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS, |
| 1125 node.switchKeyword, | 1089 node.switchKeyword, [type.displayName]); |
| 1126 [type.displayName]); | |
| 1127 return true; | 1090 return true; |
| 1128 } | 1091 } |
| 1129 | 1092 |
| 1130 /** | 1093 /** |
| 1131 * @return `true` if given [Type] implements operator <i>==</i>, and it is not | 1094 * @return `true` if given [Type] implements operator <i>==</i>, and it is not |
| 1132 * <i>int</i> or <i>String</i>. | 1095 * <i>int</i> or <i>String</i>. |
| 1133 */ | 1096 */ |
| 1134 bool _implementsEqualsWhenNotAllowed(DartType type) { | 1097 bool _implementsEqualsWhenNotAllowed(DartType type) { |
| 1135 // ignore int or String | 1098 // ignore int or String |
| 1136 if (type == null || type == _intType || type == _typeProvider.stringType) { | 1099 if (type == null || type == _intType || type == _typeProvider.stringType) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1155 } | 1118 } |
| 1156 | 1119 |
| 1157 /** | 1120 /** |
| 1158 * Given some computed [Expression], this method generates the passed [ErrorCo
de] on | 1121 * Given some computed [Expression], this method generates the passed [ErrorCo
de] on |
| 1159 * the node if its' value consists of information from a deferred library. | 1122 * the node if its' value consists of information from a deferred library. |
| 1160 * | 1123 * |
| 1161 * @param expression the expression to be tested for a deferred library refere
nce | 1124 * @param expression the expression to be tested for a deferred library refere
nce |
| 1162 * @param errorCode the error code to be used if the expression is or consists
of a reference to a | 1125 * @param errorCode the error code to be used if the expression is or consists
of a reference to a |
| 1163 * deferred library | 1126 * deferred library |
| 1164 */ | 1127 */ |
| 1165 void _reportErrorIfFromDeferredLibrary(Expression expression, | 1128 void _reportErrorIfFromDeferredLibrary( |
| 1166 ErrorCode errorCode) { | 1129 Expression expression, ErrorCode errorCode) { |
| 1167 DeferredLibraryReferenceDetector referenceDetector = | 1130 DeferredLibraryReferenceDetector referenceDetector = |
| 1168 new DeferredLibraryReferenceDetector(); | 1131 new DeferredLibraryReferenceDetector(); |
| 1169 expression.accept(referenceDetector); | 1132 expression.accept(referenceDetector); |
| 1170 if (referenceDetector.result) { | 1133 if (referenceDetector.result) { |
| 1171 _errorReporter.reportErrorForNode(errorCode, expression); | 1134 _errorReporter.reportErrorForNode(errorCode, expression); |
| 1172 } | 1135 } |
| 1173 } | 1136 } |
| 1174 | 1137 |
| 1175 /** | 1138 /** |
| 1176 * Report any errors in the given list. Except for special cases, use the give
n error code rather | 1139 * Report any errors in the given list. Except for special cases, use the give
n error code rather |
| 1177 * than the one reported in the error. | 1140 * than the one reported in the error. |
| 1178 * | 1141 * |
| 1179 * @param errors the errors that need to be reported | 1142 * @param errors the errors that need to be reported |
| 1180 * @param errorCode the error code to be used | 1143 * @param errorCode the error code to be used |
| 1181 */ | 1144 */ |
| 1182 void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) { | 1145 void _reportErrors(List<AnalysisError> errors, ErrorCode errorCode) { |
| 1183 for (AnalysisError data in errors) { | 1146 for (AnalysisError data in errors) { |
| 1184 ErrorCode dataErrorCode = data.errorCode; | 1147 ErrorCode dataErrorCode = data.errorCode; |
| 1185 if (identical( | 1148 if (identical(dataErrorCode, |
| 1186 dataErrorCode, | 1149 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || |
| 1187 CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION) || | |
| 1188 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE)
|| | |
| 1189 identical( | 1150 identical( |
| 1190 dataErrorCode, | 1151 dataErrorCode, CompileTimeErrorCode.CONST_EVAL_THROWS_IDBZE) || |
| 1152 identical(dataErrorCode, |
| 1191 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || | 1153 CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING) || |
| 1192 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || | 1154 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL) || |
| 1193 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || | 1155 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_INT) || |
| 1194 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) || | 1156 identical(dataErrorCode, CompileTimeErrorCode.CONST_EVAL_TYPE_NUM) || |
| 1195 identical( | 1157 identical(dataErrorCode, |
| 1196 dataErrorCode, | |
| 1197 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMA
TCH) || | 1158 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_FIELD_TYPE_MISMA
TCH) || |
| 1198 identical( | 1159 identical(dataErrorCode, |
| 1199 dataErrorCode, | |
| 1200 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMA
TCH) || | 1160 CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMA
TCH) || |
| 1201 identical( | 1161 identical(dataErrorCode, |
| 1202 dataErrorCode, | |
| 1203 CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) { | 1162 CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH)) { |
| 1204 _errorReporter.reportError(data); | 1163 _errorReporter.reportError(data); |
| 1205 } else if (errorCode != null) { | 1164 } else if (errorCode != null) { |
| 1206 _errorReporter.reportError( | 1165 _errorReporter.reportError(new AnalysisError.con2( |
| 1207 new AnalysisError.con2(data.source, data.offset, data.length, errorC
ode)); | 1166 data.source, data.offset, data.length, errorCode)); |
| 1208 } | 1167 } |
| 1209 } | 1168 } |
| 1210 } | 1169 } |
| 1211 | 1170 |
| 1212 /** | 1171 /** |
| 1213 * Validate that the given expression is a compile time constant. Return the v
alue of the compile | 1172 * Validate that the given expression is a compile time constant. Return the v
alue of the compile |
| 1214 * time constant, or `null` if the expression is not a compile time constant. | 1173 * time constant, or `null` if the expression is not a compile time constant. |
| 1215 * | 1174 * |
| 1216 * @param expression the expression to be validated | 1175 * @param expression the expression to be validated |
| 1217 * @param errorCode the error code to be used if the expression is not a compi
le time constant | 1176 * @param errorCode the error code to be used if the expression is not a compi
le time constant |
| 1218 * @return the value of the compile time constant | 1177 * @return the value of the compile time constant |
| 1219 */ | 1178 */ |
| 1220 DartObjectImpl _validate(Expression expression, ErrorCode errorCode) { | 1179 DartObjectImpl _validate(Expression expression, ErrorCode errorCode) { |
| 1221 RecordingErrorListener errorListener = new RecordingErrorListener(); | 1180 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 1222 ErrorReporter subErrorReporter = | 1181 ErrorReporter subErrorReporter = |
| 1223 new ErrorReporter(errorListener, _errorReporter.source); | 1182 new ErrorReporter(errorListener, _errorReporter.source); |
| 1224 DartObjectImpl result = | 1183 DartObjectImpl result = expression |
| 1225 expression.accept(new ConstantVisitor.con1(_typeProvider, subErrorReport
er)); | 1184 .accept(new ConstantVisitor.con1(_typeProvider, subErrorReporter)); |
| 1226 _reportErrors(errorListener.errors, errorCode); | 1185 _reportErrors(errorListener.errors, errorCode); |
| 1227 return result; | 1186 return result; |
| 1228 } | 1187 } |
| 1229 | 1188 |
| 1230 /** | 1189 /** |
| 1231 * Validate that if the passed arguments are constant expressions. | 1190 * Validate that if the passed arguments are constant expressions. |
| 1232 * | 1191 * |
| 1233 * @param argumentList the argument list to evaluate | 1192 * @param argumentList the argument list to evaluate |
| 1234 */ | 1193 */ |
| 1235 void _validateConstantArguments(ArgumentList argumentList) { | 1194 void _validateConstantArguments(ArgumentList argumentList) { |
| 1236 for (Expression argument in argumentList.arguments) { | 1195 for (Expression argument in argumentList.arguments) { |
| 1237 if (argument is NamedExpression) { | 1196 if (argument is NamedExpression) { |
| 1238 argument = (argument as NamedExpression).expression; | 1197 argument = (argument as NamedExpression).expression; |
| 1239 } | 1198 } |
| 1240 _validate( | 1199 _validate( |
| 1241 argument, | 1200 argument, CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT); |
| 1242 CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT); | |
| 1243 } | 1201 } |
| 1244 } | 1202 } |
| 1245 | 1203 |
| 1246 /** | 1204 /** |
| 1247 * Validates that the expressions of the given initializers (of a constant con
structor) are all | 1205 * Validates that the expressions of the given initializers (of a constant con
structor) are all |
| 1248 * compile time constants. | 1206 * compile time constants. |
| 1249 * | 1207 * |
| 1250 * @param constructor the constant constructor declaration to validate | 1208 * @param constructor the constant constructor declaration to validate |
| 1251 */ | 1209 */ |
| 1252 void _validateConstructorInitializers(ConstructorDeclaration constructor) { | 1210 void _validateConstructorInitializers(ConstructorDeclaration constructor) { |
| 1253 List<ParameterElement> parameterElements = | 1211 List<ParameterElement> parameterElements = |
| 1254 constructor.parameters.parameterElements; | 1212 constructor.parameters.parameterElements; |
| 1255 NodeList<ConstructorInitializer> initializers = constructor.initializers; | 1213 NodeList<ConstructorInitializer> initializers = constructor.initializers; |
| 1256 for (ConstructorInitializer initializer in initializers) { | 1214 for (ConstructorInitializer initializer in initializers) { |
| 1257 if (initializer is ConstructorFieldInitializer) { | 1215 if (initializer is ConstructorFieldInitializer) { |
| 1258 ConstructorFieldInitializer fieldInitializer = initializer; | 1216 ConstructorFieldInitializer fieldInitializer = initializer; |
| 1259 _validateInitializerExpression( | 1217 _validateInitializerExpression( |
| 1260 parameterElements, | 1218 parameterElements, fieldInitializer.expression); |
| 1261 fieldInitializer.expression); | |
| 1262 } | 1219 } |
| 1263 if (initializer is RedirectingConstructorInvocation) { | 1220 if (initializer is RedirectingConstructorInvocation) { |
| 1264 RedirectingConstructorInvocation invocation = initializer; | 1221 RedirectingConstructorInvocation invocation = initializer; |
| 1265 _validateInitializerInvocationArguments( | 1222 _validateInitializerInvocationArguments( |
| 1266 parameterElements, | 1223 parameterElements, invocation.argumentList); |
| 1267 invocation.argumentList); | |
| 1268 } | 1224 } |
| 1269 if (initializer is SuperConstructorInvocation) { | 1225 if (initializer is SuperConstructorInvocation) { |
| 1270 SuperConstructorInvocation invocation = initializer; | 1226 SuperConstructorInvocation invocation = initializer; |
| 1271 _validateInitializerInvocationArguments( | 1227 _validateInitializerInvocationArguments( |
| 1272 parameterElements, | 1228 parameterElements, invocation.argumentList); |
| 1273 invocation.argumentList); | |
| 1274 } | 1229 } |
| 1275 } | 1230 } |
| 1276 } | 1231 } |
| 1277 | 1232 |
| 1278 /** | 1233 /** |
| 1279 * Validate that the default value associated with each of the parameters in t
he given list is a | 1234 * Validate that the default value associated with each of the parameters in t
he given list is a |
| 1280 * compile time constant. | 1235 * compile time constant. |
| 1281 * | 1236 * |
| 1282 * @param parameters the list of parameters to be validated | 1237 * @param parameters the list of parameters to be validated |
| 1283 */ | 1238 */ |
| 1284 void _validateDefaultValues(FormalParameterList parameters) { | 1239 void _validateDefaultValues(FormalParameterList parameters) { |
| 1285 if (parameters == null) { | 1240 if (parameters == null) { |
| 1286 return; | 1241 return; |
| 1287 } | 1242 } |
| 1288 for (FormalParameter parameter in parameters.parameters) { | 1243 for (FormalParameter parameter in parameters.parameters) { |
| 1289 if (parameter is DefaultFormalParameter) { | 1244 if (parameter is DefaultFormalParameter) { |
| 1290 DefaultFormalParameter defaultParameter = parameter; | 1245 DefaultFormalParameter defaultParameter = parameter; |
| 1291 Expression defaultValue = defaultParameter.defaultValue; | 1246 Expression defaultValue = defaultParameter.defaultValue; |
| 1292 DartObjectImpl result; | 1247 DartObjectImpl result; |
| 1293 if (defaultValue == null) { | 1248 if (defaultValue == null) { |
| 1294 result = | 1249 result = |
| 1295 new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); | 1250 new DartObjectImpl(_typeProvider.nullType, NullState.NULL_STATE); |
| 1296 } else { | 1251 } else { |
| 1297 result = | 1252 result = _validate( |
| 1298 _validate(defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_
VALUE); | 1253 defaultValue, CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE); |
| 1299 if (result != null) { | 1254 if (result != null) { |
| 1300 _reportErrorIfFromDeferredLibrary( | 1255 _reportErrorIfFromDeferredLibrary(defaultValue, |
| 1301 defaultValue, | |
| 1302 CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LI
BRARY); | 1256 CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LI
BRARY); |
| 1303 } | 1257 } |
| 1304 } | 1258 } |
| 1305 VariableElementImpl element = parameter.element as VariableElementImpl; | 1259 VariableElementImpl element = parameter.element as VariableElementImpl; |
| 1306 element.evaluationResult = new EvaluationResultImpl.con1(result); | 1260 element.evaluationResult = new EvaluationResultImpl.con1(result); |
| 1307 } | 1261 } |
| 1308 } | 1262 } |
| 1309 } | 1263 } |
| 1310 | 1264 |
| 1311 /** | 1265 /** |
| 1312 * Validates that the expressions of any field initializers in the class decla
ration are all | 1266 * Validates that the expressions of any field initializers in the class decla
ration are all |
| 1313 * compile time constants. Since this is only required if the class has a cons
tant constructor, | 1267 * compile time constants. Since this is only required if the class has a cons
tant constructor, |
| 1314 * the error is reported at the constructor site. | 1268 * the error is reported at the constructor site. |
| 1315 * | 1269 * |
| 1316 * @param classDeclaration the class which should be validated | 1270 * @param classDeclaration the class which should be validated |
| 1317 * @param errorSite the site at which errors should be reported. | 1271 * @param errorSite the site at which errors should be reported. |
| 1318 */ | 1272 */ |
| 1319 void _validateFieldInitializers(ClassDeclaration classDeclaration, | 1273 void _validateFieldInitializers( |
| 1320 ConstructorDeclaration errorSite) { | 1274 ClassDeclaration classDeclaration, ConstructorDeclaration errorSite) { |
| 1321 NodeList<ClassMember> members = classDeclaration.members; | 1275 NodeList<ClassMember> members = classDeclaration.members; |
| 1322 for (ClassMember member in members) { | 1276 for (ClassMember member in members) { |
| 1323 if (member is FieldDeclaration) { | 1277 if (member is FieldDeclaration) { |
| 1324 FieldDeclaration fieldDeclaration = member; | 1278 FieldDeclaration fieldDeclaration = member; |
| 1325 if (!fieldDeclaration.isStatic) { | 1279 if (!fieldDeclaration.isStatic) { |
| 1326 for (VariableDeclaration variableDeclaration in | 1280 for (VariableDeclaration variableDeclaration |
| 1327 fieldDeclaration.fields.variables) { | 1281 in fieldDeclaration.fields.variables) { |
| 1328 Expression initializer = variableDeclaration.initializer; | 1282 Expression initializer = variableDeclaration.initializer; |
| 1329 if (initializer != null) { | 1283 if (initializer != null) { |
| 1330 // Ignore any errors produced during validation--if the constant | 1284 // Ignore any errors produced during validation--if the constant |
| 1331 // can't be eavluated we'll just report a single error. | 1285 // can't be eavluated we'll just report a single error. |
| 1332 AnalysisErrorListener errorListener = | 1286 AnalysisErrorListener errorListener = |
| 1333 AnalysisErrorListener.NULL_LISTENER; | 1287 AnalysisErrorListener.NULL_LISTENER; |
| 1334 ErrorReporter subErrorReporter = | 1288 ErrorReporter subErrorReporter = |
| 1335 new ErrorReporter(errorListener, _errorReporter.source); | 1289 new ErrorReporter(errorListener, _errorReporter.source); |
| 1336 DartObjectImpl result = | 1290 DartObjectImpl result = initializer.accept( |
| 1337 initializer.accept(new ConstantVisitor.con1(_typeProvider, sub
ErrorReporter)); | 1291 new ConstantVisitor.con1(_typeProvider, subErrorReporter)); |
| 1338 if (result == null) { | 1292 if (result == null) { |
| 1339 _errorReporter.reportErrorForNode( | 1293 _errorReporter.reportErrorForNode( |
| 1340 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZE
D_BY_NON_CONST, | 1294 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_FIELD_INITIALIZE
D_BY_NON_CONST, |
| 1341 errorSite, | 1295 errorSite, [variableDeclaration.name.name]); |
| 1342 [variableDeclaration.name.name]); | |
| 1343 } | 1296 } |
| 1344 } | 1297 } |
| 1345 } | 1298 } |
| 1346 } | 1299 } |
| 1347 } | 1300 } |
| 1348 } | 1301 } |
| 1349 } | 1302 } |
| 1350 | 1303 |
| 1351 /** | 1304 /** |
| 1352 * Validates that the given expression is a compile time constant. | 1305 * Validates that the given expression is a compile time constant. |
| 1353 * | 1306 * |
| 1354 * @param parameterElements the elements of parameters of constant constructor
, they are | 1307 * @param parameterElements the elements of parameters of constant constructor
, they are |
| 1355 * considered as a valid potentially constant expressions | 1308 * considered as a valid potentially constant expressions |
| 1356 * @param expression the expression to validate | 1309 * @param expression the expression to validate |
| 1357 */ | 1310 */ |
| 1358 void _validateInitializerExpression(List<ParameterElement> parameterElements, | 1311 void _validateInitializerExpression( |
| 1359 Expression expression) { | 1312 List<ParameterElement> parameterElements, Expression expression) { |
| 1360 RecordingErrorListener errorListener = new RecordingErrorListener(); | 1313 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 1361 ErrorReporter subErrorReporter = | 1314 ErrorReporter subErrorReporter = |
| 1362 new ErrorReporter(errorListener, _errorReporter.source); | 1315 new ErrorReporter(errorListener, _errorReporter.source); |
| 1363 DartObjectImpl result = expression.accept( | 1316 DartObjectImpl result = expression.accept( |
| 1364 new _ConstantVerifier_validateInitializerExpression( | 1317 new _ConstantVerifier_validateInitializerExpression( |
| 1365 _typeProvider, | 1318 _typeProvider, subErrorReporter, this, parameterElements)); |
| 1366 subErrorReporter, | 1319 _reportErrors(errorListener.errors, |
| 1367 this, | |
| 1368 parameterElements)); | |
| 1369 _reportErrors( | |
| 1370 errorListener.errors, | |
| 1371 CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER); | 1320 CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER); |
| 1372 if (result != null) { | 1321 if (result != null) { |
| 1373 _reportErrorIfFromDeferredLibrary( | 1322 _reportErrorIfFromDeferredLibrary(expression, |
| 1374 expression, | |
| 1375 CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_L
IBRARY); | 1323 CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_L
IBRARY); |
| 1376 } | 1324 } |
| 1377 } | 1325 } |
| 1378 | 1326 |
| 1379 /** | 1327 /** |
| 1380 * Validates that all of the arguments of a constructor initializer are compil
e time constants. | 1328 * Validates that all of the arguments of a constructor initializer are compil
e time constants. |
| 1381 * | 1329 * |
| 1382 * @param parameterElements the elements of parameters of constant constructor
, they are | 1330 * @param parameterElements the elements of parameters of constant constructor
, they are |
| 1383 * considered as a valid potentially constant expressions | 1331 * considered as a valid potentially constant expressions |
| 1384 * @param argumentList the argument list to validate | 1332 * @param argumentList the argument list to validate |
| 1385 */ | 1333 */ |
| 1386 void | 1334 void _validateInitializerInvocationArguments( |
| 1387 _validateInitializerInvocationArguments(List<ParameterElement> parameterEl
ements, | 1335 List<ParameterElement> parameterElements, ArgumentList argumentList) { |
| 1388 ArgumentList argumentList) { | |
| 1389 if (argumentList == null) { | 1336 if (argumentList == null) { |
| 1390 return; | 1337 return; |
| 1391 } | 1338 } |
| 1392 for (Expression argument in argumentList.arguments) { | 1339 for (Expression argument in argumentList.arguments) { |
| 1393 _validateInitializerExpression(parameterElements, argument); | 1340 _validateInitializerExpression(parameterElements, argument); |
| 1394 } | 1341 } |
| 1395 } | 1342 } |
| 1396 | 1343 |
| 1397 /** | 1344 /** |
| 1398 * Validate that if the passed instance creation is 'const' then all its argum
ents are constant | 1345 * Validate that if the passed instance creation is 'const' then all its argum
ents are constant |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1505 bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND; | 1452 bool isAmpAmp = operator.type == sc.TokenType.AMPERSAND_AMPERSAND; |
| 1506 bool isBarBar = operator.type == sc.TokenType.BAR_BAR; | 1453 bool isBarBar = operator.type == sc.TokenType.BAR_BAR; |
| 1507 if (isAmpAmp || isBarBar) { | 1454 if (isAmpAmp || isBarBar) { |
| 1508 Expression lhsCondition = node.leftOperand; | 1455 Expression lhsCondition = node.leftOperand; |
| 1509 if (!_isDebugConstant(lhsCondition)) { | 1456 if (!_isDebugConstant(lhsCondition)) { |
| 1510 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); | 1457 EvaluationResultImpl lhsResult = _getConstantBooleanValue(lhsCondition); |
| 1511 if (lhsResult != null) { | 1458 if (lhsResult != null) { |
| 1512 if (lhsResult.value.isTrue && isBarBar) { | 1459 if (lhsResult.value.isTrue && isBarBar) { |
| 1513 // report error on else block: true || !e! | 1460 // report error on else block: true || !e! |
| 1514 _errorReporter.reportErrorForNode( | 1461 _errorReporter.reportErrorForNode( |
| 1515 HintCode.DEAD_CODE, | 1462 HintCode.DEAD_CODE, node.rightOperand); |
| 1516 node.rightOperand); | |
| 1517 // only visit the LHS: | 1463 // only visit the LHS: |
| 1518 _safelyVisit(lhsCondition); | 1464 _safelyVisit(lhsCondition); |
| 1519 return null; | 1465 return null; |
| 1520 } else if (lhsResult.value.isFalse && isAmpAmp) { | 1466 } else if (lhsResult.value.isFalse && isAmpAmp) { |
| 1521 // report error on if block: false && !e! | 1467 // report error on if block: false && !e! |
| 1522 _errorReporter.reportErrorForNode( | 1468 _errorReporter.reportErrorForNode( |
| 1523 HintCode.DEAD_CODE, | 1469 HintCode.DEAD_CODE, node.rightOperand); |
| 1524 node.rightOperand); | |
| 1525 // only visit the LHS: | 1470 // only visit the LHS: |
| 1526 _safelyVisit(lhsCondition); | 1471 _safelyVisit(lhsCondition); |
| 1527 return null; | 1472 return null; |
| 1528 } | 1473 } |
| 1529 } | 1474 } |
| 1530 } | 1475 } |
| 1531 // How do we want to handle the RHS? It isn't dead code, but "pointless" | 1476 // How do we want to handle the RHS? It isn't dead code, but "pointless" |
| 1532 // or "obscure"... | 1477 // or "obscure"... |
| 1533 // Expression rhsCondition = node.getRightOperand(); | 1478 // Expression rhsCondition = node.getRightOperand(); |
| 1534 // ValidResult rhsResult = getConstantBooleanValue(rhsCondition); | 1479 // ValidResult rhsResult = getConstantBooleanValue(rhsCondition); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1568 Object visitConditionalExpression(ConditionalExpression node) { | 1513 Object visitConditionalExpression(ConditionalExpression node) { |
| 1569 Expression conditionExpression = node.condition; | 1514 Expression conditionExpression = node.condition; |
| 1570 _safelyVisit(conditionExpression); | 1515 _safelyVisit(conditionExpression); |
| 1571 if (!_isDebugConstant(conditionExpression)) { | 1516 if (!_isDebugConstant(conditionExpression)) { |
| 1572 EvaluationResultImpl result = | 1517 EvaluationResultImpl result = |
| 1573 _getConstantBooleanValue(conditionExpression); | 1518 _getConstantBooleanValue(conditionExpression); |
| 1574 if (result != null) { | 1519 if (result != null) { |
| 1575 if (result.value.isTrue) { | 1520 if (result.value.isTrue) { |
| 1576 // report error on else block: true ? 1 : !2! | 1521 // report error on else block: true ? 1 : !2! |
| 1577 _errorReporter.reportErrorForNode( | 1522 _errorReporter.reportErrorForNode( |
| 1578 HintCode.DEAD_CODE, | 1523 HintCode.DEAD_CODE, node.elseExpression); |
| 1579 node.elseExpression); | |
| 1580 _safelyVisit(node.thenExpression); | 1524 _safelyVisit(node.thenExpression); |
| 1581 return null; | 1525 return null; |
| 1582 } else { | 1526 } else { |
| 1583 // report error on if block: false ? !1! : 2 | 1527 // report error on if block: false ? !1! : 2 |
| 1584 _errorReporter.reportErrorForNode( | 1528 _errorReporter |
| 1585 HintCode.DEAD_CODE, | 1529 .reportErrorForNode(HintCode.DEAD_CODE, node.thenExpression); |
| 1586 node.thenExpression); | |
| 1587 _safelyVisit(node.elseExpression); | 1530 _safelyVisit(node.elseExpression); |
| 1588 return null; | 1531 return null; |
| 1589 } | 1532 } |
| 1590 } | 1533 } |
| 1591 } | 1534 } |
| 1592 return super.visitConditionalExpression(node); | 1535 return super.visitConditionalExpression(node); |
| 1593 } | 1536 } |
| 1594 | 1537 |
| 1595 @override | 1538 @override |
| 1596 Object visitIfStatement(IfStatement node) { | 1539 Object visitIfStatement(IfStatement node) { |
| 1597 Expression conditionExpression = node.condition; | 1540 Expression conditionExpression = node.condition; |
| 1598 _safelyVisit(conditionExpression); | 1541 _safelyVisit(conditionExpression); |
| 1599 if (!_isDebugConstant(conditionExpression)) { | 1542 if (!_isDebugConstant(conditionExpression)) { |
| 1600 EvaluationResultImpl result = | 1543 EvaluationResultImpl result = |
| 1601 _getConstantBooleanValue(conditionExpression); | 1544 _getConstantBooleanValue(conditionExpression); |
| 1602 if (result != null) { | 1545 if (result != null) { |
| 1603 if (result.value.isTrue) { | 1546 if (result.value.isTrue) { |
| 1604 // report error on else block: if(true) {} else {!} | 1547 // report error on else block: if(true) {} else {!} |
| 1605 Statement elseStatement = node.elseStatement; | 1548 Statement elseStatement = node.elseStatement; |
| 1606 if (elseStatement != null) { | 1549 if (elseStatement != null) { |
| 1607 _errorReporter.reportErrorForNode( | 1550 _errorReporter.reportErrorForNode( |
| 1608 HintCode.DEAD_CODE, | 1551 HintCode.DEAD_CODE, elseStatement); |
| 1609 elseStatement); | |
| 1610 _safelyVisit(node.thenStatement); | 1552 _safelyVisit(node.thenStatement); |
| 1611 return null; | 1553 return null; |
| 1612 } | 1554 } |
| 1613 } else { | 1555 } else { |
| 1614 // report error on if block: if (false) {!} else {} | 1556 // report error on if block: if (false) {!} else {} |
| 1615 _errorReporter.reportErrorForNode( | 1557 _errorReporter |
| 1616 HintCode.DEAD_CODE, | 1558 .reportErrorForNode(HintCode.DEAD_CODE, node.thenStatement); |
| 1617 node.thenStatement); | |
| 1618 _safelyVisit(node.elseStatement); | 1559 _safelyVisit(node.elseStatement); |
| 1619 return null; | 1560 return null; |
| 1620 } | 1561 } |
| 1621 } | 1562 } |
| 1622 } | 1563 } |
| 1623 return super.visitIfStatement(node); | 1564 return super.visitIfStatement(node); |
| 1624 } | 1565 } |
| 1625 | 1566 |
| 1626 @override | 1567 @override |
| 1627 Object visitSwitchCase(SwitchCase node) { | 1568 Object visitSwitchCase(SwitchCase node) { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1656 // exception type, visit the block, but generate an error on any | 1597 // exception type, visit the block, but generate an error on any |
| 1657 // following catch clauses (and don't visit them). | 1598 // following catch clauses (and don't visit them). |
| 1658 _safelyVisit(catchClause); | 1599 _safelyVisit(catchClause); |
| 1659 if (i + 1 != numOfCatchClauses) { | 1600 if (i + 1 != numOfCatchClauses) { |
| 1660 // this catch clause is not the last in the try statement | 1601 // this catch clause is not the last in the try statement |
| 1661 CatchClause nextCatchClause = catchClauses[i + 1]; | 1602 CatchClause nextCatchClause = catchClauses[i + 1]; |
| 1662 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; | 1603 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; |
| 1663 int offset = nextCatchClause.offset; | 1604 int offset = nextCatchClause.offset; |
| 1664 int length = lastCatchClause.end - offset; | 1605 int length = lastCatchClause.end - offset; |
| 1665 _errorReporter.reportErrorForOffset( | 1606 _errorReporter.reportErrorForOffset( |
| 1666 HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, | 1607 HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length); |
| 1667 offset, | |
| 1668 length); | |
| 1669 return null; | 1608 return null; |
| 1670 } | 1609 } |
| 1671 } | 1610 } |
| 1672 for (DartType type in visitedTypes) { | 1611 for (DartType type in visitedTypes) { |
| 1673 if (currentType.isSubtypeOf(type)) { | 1612 if (currentType.isSubtypeOf(type)) { |
| 1674 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; | 1613 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; |
| 1675 int offset = catchClause.offset; | 1614 int offset = catchClause.offset; |
| 1676 int length = lastCatchClause.end - offset; | 1615 int length = lastCatchClause.end - offset; |
| 1677 _errorReporter.reportErrorForOffset( | 1616 _errorReporter.reportErrorForOffset( |
| 1678 HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, | 1617 HintCode.DEAD_CODE_ON_CATCH_SUBTYPE, offset, length, [ |
| 1679 offset, | 1618 currentType.displayName, |
| 1680 length, | 1619 type.displayName |
| 1681 [currentType.displayName, type.displayName]); | 1620 ]); |
| 1682 return null; | 1621 return null; |
| 1683 } | 1622 } |
| 1684 } | 1623 } |
| 1685 visitedTypes.add(currentType); | 1624 visitedTypes.add(currentType); |
| 1686 } | 1625 } |
| 1687 _safelyVisit(catchClause); | 1626 _safelyVisit(catchClause); |
| 1688 } else { | 1627 } else { |
| 1689 // Found catch clause clause that doesn't have an exception type, | 1628 // Found catch clause clause that doesn't have an exception type, |
| 1690 // visit the block, but generate an error on any following catch clauses | 1629 // visit the block, but generate an error on any following catch clauses |
| 1691 // (and don't visit them). | 1630 // (and don't visit them). |
| 1692 _safelyVisit(catchClause); | 1631 _safelyVisit(catchClause); |
| 1693 if (i + 1 != numOfCatchClauses) { | 1632 if (i + 1 != numOfCatchClauses) { |
| 1694 // this catch clause is not the last in the try statement | 1633 // this catch clause is not the last in the try statement |
| 1695 CatchClause nextCatchClause = catchClauses[i + 1]; | 1634 CatchClause nextCatchClause = catchClauses[i + 1]; |
| 1696 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; | 1635 CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1]; |
| 1697 int offset = nextCatchClause.offset; | 1636 int offset = nextCatchClause.offset; |
| 1698 int length = lastCatchClause.end - offset; | 1637 int length = lastCatchClause.end - offset; |
| 1699 _errorReporter.reportErrorForOffset( | 1638 _errorReporter.reportErrorForOffset( |
| 1700 HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, | 1639 HintCode.DEAD_CODE_CATCH_FOLLOWING_CATCH, offset, length); |
| 1701 offset, | |
| 1702 length); | |
| 1703 return null; | 1640 return null; |
| 1704 } | 1641 } |
| 1705 } | 1642 } |
| 1706 } | 1643 } |
| 1707 return null; | 1644 return null; |
| 1708 } | 1645 } |
| 1709 | 1646 |
| 1710 @override | 1647 @override |
| 1711 Object visitWhileStatement(WhileStatement node) { | 1648 Object visitWhileStatement(WhileStatement node) { |
| 1712 Expression conditionExpression = node.condition; | 1649 Expression conditionExpression = node.condition; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1731 * [SwitchMember], this loops through the list in reverse order searching for
statements | 1668 * [SwitchMember], this loops through the list in reverse order searching for
statements |
| 1732 * after a return, unlabeled break or unlabeled continue statement to mark the
m as dead code. | 1669 * after a return, unlabeled break or unlabeled continue statement to mark the
m as dead code. |
| 1733 * | 1670 * |
| 1734 * @param statements some ordered list of statements in a [Block] or [SwitchMe
mber] | 1671 * @param statements some ordered list of statements in a [Block] or [SwitchMe
mber] |
| 1735 */ | 1672 */ |
| 1736 void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) { | 1673 void _checkForDeadStatementsInNodeList(NodeList<Statement> statements) { |
| 1737 int size = statements.length; | 1674 int size = statements.length; |
| 1738 for (int i = 0; i < size; i++) { | 1675 for (int i = 0; i < size; i++) { |
| 1739 Statement currentStatement = statements[i]; | 1676 Statement currentStatement = statements[i]; |
| 1740 _safelyVisit(currentStatement); | 1677 _safelyVisit(currentStatement); |
| 1741 bool returnOrBreakingStatement = | 1678 bool returnOrBreakingStatement = currentStatement is ReturnStatement || |
| 1742 currentStatement is ReturnStatement || | 1679 (currentStatement is BreakStatement && |
| 1743 (currentStatement is BreakStatement && currentStatement.label == null)
|| | 1680 currentStatement.label == null) || |
| 1744 (currentStatement is ContinueStatement && currentStatement.label == nu
ll); | 1681 (currentStatement is ContinueStatement && |
| 1682 currentStatement.label == null); |
| 1745 if (returnOrBreakingStatement && i != size - 1) { | 1683 if (returnOrBreakingStatement && i != size - 1) { |
| 1746 Statement nextStatement = statements[i + 1]; | 1684 Statement nextStatement = statements[i + 1]; |
| 1747 Statement lastStatement = statements[size - 1]; | 1685 Statement lastStatement = statements[size - 1]; |
| 1748 int offset = nextStatement.offset; | 1686 int offset = nextStatement.offset; |
| 1749 int length = lastStatement.end - offset; | 1687 int length = lastStatement.end - offset; |
| 1750 _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length); | 1688 _errorReporter.reportErrorForOffset(HintCode.DEAD_CODE, offset, length); |
| 1751 return; | 1689 return; |
| 1752 } | 1690 } |
| 1753 } | 1691 } |
| 1754 } | 1692 } |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1970 _findIdentifier(constants, constant.name); | 1908 _findIdentifier(constants, constant.name); |
| 1971 } | 1909 } |
| 1972 return super.visitEnumDeclaration(node); | 1910 return super.visitEnumDeclaration(node); |
| 1973 } | 1911 } |
| 1974 | 1912 |
| 1975 @override | 1913 @override |
| 1976 Object visitExportDirective(ExportDirective node) { | 1914 Object visitExportDirective(ExportDirective node) { |
| 1977 String uri = _getStringValue(node.uri); | 1915 String uri = _getStringValue(node.uri); |
| 1978 if (uri != null) { | 1916 if (uri != null) { |
| 1979 LibraryElement library = _enclosingUnit.library; | 1917 LibraryElement library = _enclosingUnit.library; |
| 1980 ExportElement exportElement = _findExport( | 1918 ExportElement exportElement = _findExport(library.exports, |
| 1981 library.exports, | 1919 _enclosingUnit.context.sourceFactory.resolveUri( |
| 1982 _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source,
uri)); | 1920 _enclosingUnit.source, uri)); |
| 1983 node.element = exportElement; | 1921 node.element = exportElement; |
| 1984 } | 1922 } |
| 1985 return super.visitExportDirective(node); | 1923 return super.visitExportDirective(node); |
| 1986 } | 1924 } |
| 1987 | 1925 |
| 1988 @override | 1926 @override |
| 1989 Object visitFieldFormalParameter(FieldFormalParameter node) { | 1927 Object visitFieldFormalParameter(FieldFormalParameter node) { |
| 1990 if (node.parent is! DefaultFormalParameter) { | 1928 if (node.parent is! DefaultFormalParameter) { |
| 1991 SimpleIdentifier parameterName = node.identifier; | 1929 SimpleIdentifier parameterName = node.identifier; |
| 1992 ParameterElement element = _getElementForParameter(node, parameterName); | 1930 ParameterElement element = _getElementForParameter(node, parameterName); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2076 } else { | 2014 } else { |
| 2077 return super.visitFunctionTypedFormalParameter(node); | 2015 return super.visitFunctionTypedFormalParameter(node); |
| 2078 } | 2016 } |
| 2079 } | 2017 } |
| 2080 | 2018 |
| 2081 @override | 2019 @override |
| 2082 Object visitImportDirective(ImportDirective node) { | 2020 Object visitImportDirective(ImportDirective node) { |
| 2083 String uri = _getStringValue(node.uri); | 2021 String uri = _getStringValue(node.uri); |
| 2084 if (uri != null) { | 2022 if (uri != null) { |
| 2085 LibraryElement library = _enclosingUnit.library; | 2023 LibraryElement library = _enclosingUnit.library; |
| 2086 ImportElement importElement = _findImport( | 2024 ImportElement importElement = _findImport(library.imports, |
| 2087 library.imports, | 2025 _enclosingUnit.context.sourceFactory.resolveUri( |
| 2088 _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source,
uri), | 2026 _enclosingUnit.source, uri), node.prefix); |
| 2089 node.prefix); | |
| 2090 node.element = importElement; | 2027 node.element = importElement; |
| 2091 } | 2028 } |
| 2092 return super.visitImportDirective(node); | 2029 return super.visitImportDirective(node); |
| 2093 } | 2030 } |
| 2094 | 2031 |
| 2095 @override | 2032 @override |
| 2096 Object visitLabeledStatement(LabeledStatement node) { | 2033 Object visitLabeledStatement(LabeledStatement node) { |
| 2097 for (Label label in node.labels) { | 2034 for (Label label in node.labels) { |
| 2098 SimpleIdentifier labelName = label.label; | 2035 SimpleIdentifier labelName = label.label; |
| 2099 _findIdentifier(_enclosingExecutable.labels, labelName); | 2036 _findIdentifier(_enclosingExecutable.labels, labelName); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2113 try { | 2050 try { |
| 2114 sc.Token property = node.propertyKeyword; | 2051 sc.Token property = node.propertyKeyword; |
| 2115 SimpleIdentifier methodName = node.name; | 2052 SimpleIdentifier methodName = node.name; |
| 2116 String nameOfMethod = methodName.name; | 2053 String nameOfMethod = methodName.name; |
| 2117 if (nameOfMethod == sc.TokenType.MINUS.lexeme && | 2054 if (nameOfMethod == sc.TokenType.MINUS.lexeme && |
| 2118 node.parameters.parameters.length == 0) { | 2055 node.parameters.parameters.length == 0) { |
| 2119 nameOfMethod = "unary-"; | 2056 nameOfMethod = "unary-"; |
| 2120 } | 2057 } |
| 2121 if (property == null) { | 2058 if (property == null) { |
| 2122 _enclosingExecutable = _findWithNameAndOffset( | 2059 _enclosingExecutable = _findWithNameAndOffset( |
| 2123 _enclosingClass.methods, | 2060 _enclosingClass.methods, nameOfMethod, methodName.offset); |
| 2124 nameOfMethod, | |
| 2125 methodName.offset); | |
| 2126 methodName.staticElement = _enclosingExecutable; | 2061 methodName.staticElement = _enclosingExecutable; |
| 2127 } else { | 2062 } else { |
| 2128 PropertyAccessorElement accessor = | 2063 PropertyAccessorElement accessor = |
| 2129 _findIdentifier(_enclosingClass.accessors, methodName); | 2064 _findIdentifier(_enclosingClass.accessors, methodName); |
| 2130 if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) { | 2065 if ((property as sc.KeywordToken).keyword == sc.Keyword.SET) { |
| 2131 accessor = accessor.variable.setter; | 2066 accessor = accessor.variable.setter; |
| 2132 methodName.staticElement = accessor; | 2067 methodName.staticElement = accessor; |
| 2133 } | 2068 } |
| 2134 _enclosingExecutable = accessor; | 2069 _enclosingExecutable = accessor; |
| 2135 } | 2070 } |
| 2136 return super.visitMethodDeclaration(node); | 2071 return super.visitMethodDeclaration(node); |
| 2137 } finally { | 2072 } finally { |
| 2138 _enclosingExecutable = outerExecutable; | 2073 _enclosingExecutable = outerExecutable; |
| 2139 } | 2074 } |
| 2140 } | 2075 } |
| 2141 | 2076 |
| 2142 @override | 2077 @override |
| 2143 Object visitPartDirective(PartDirective node) { | 2078 Object visitPartDirective(PartDirective node) { |
| 2144 String uri = _getStringValue(node.uri); | 2079 String uri = _getStringValue(node.uri); |
| 2145 if (uri != null) { | 2080 if (uri != null) { |
| 2146 Source partSource = | 2081 Source partSource = _enclosingUnit.context.sourceFactory.resolveUri( |
| 2147 _enclosingUnit.context.sourceFactory.resolveUri(_enclosingUnit.source,
uri); | 2082 _enclosingUnit.source, uri); |
| 2148 node.element = _findPart(_enclosingUnit.library.parts, partSource); | 2083 node.element = _findPart(_enclosingUnit.library.parts, partSource); |
| 2149 } | 2084 } |
| 2150 return super.visitPartDirective(node); | 2085 return super.visitPartDirective(node); |
| 2151 } | 2086 } |
| 2152 | 2087 |
| 2153 @override | 2088 @override |
| 2154 Object visitPartOfDirective(PartOfDirective node) { | 2089 Object visitPartOfDirective(PartOfDirective node) { |
| 2155 node.element = _enclosingUnit.library; | 2090 node.element = _enclosingUnit.library; |
| 2156 return super.visitPartOfDirective(node); | 2091 return super.visitPartOfDirective(node); |
| 2157 } | 2092 } |
| 2158 | 2093 |
| 2159 @override | 2094 @override |
| 2160 Object visitSimpleFormalParameter(SimpleFormalParameter node) { | 2095 Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 2161 if (node.parent is! DefaultFormalParameter) { | 2096 if (node.parent is! DefaultFormalParameter) { |
| 2162 SimpleIdentifier parameterName = node.identifier; | 2097 SimpleIdentifier parameterName = node.identifier; |
| 2163 ParameterElement element = _getElementForParameter(node, parameterName); | 2098 ParameterElement element = _getElementForParameter(node, parameterName); |
| 2164 ParameterElement outerParameter = _enclosingParameter; | 2099 ParameterElement outerParameter = _enclosingParameter; |
| 2165 try { | 2100 try { |
| 2166 _enclosingParameter = element; | 2101 _enclosingParameter = element; |
| 2167 return super.visitSimpleFormalParameter(node); | 2102 return super.visitSimpleFormalParameter(node); |
| 2168 } finally { | 2103 } finally { |
| 2169 _enclosingParameter = outerParameter; | 2104 _enclosingParameter = outerParameter; |
| 2170 } | 2105 } |
| 2171 } else { | 2106 } else {} |
| 2172 } | |
| 2173 return super.visitSimpleFormalParameter(node); | 2107 return super.visitSimpleFormalParameter(node); |
| 2174 } | 2108 } |
| 2175 | 2109 |
| 2176 @override | 2110 @override |
| 2177 Object visitSwitchCase(SwitchCase node) { | 2111 Object visitSwitchCase(SwitchCase node) { |
| 2178 for (Label label in node.labels) { | 2112 for (Label label in node.labels) { |
| 2179 SimpleIdentifier labelName = label.label; | 2113 SimpleIdentifier labelName = label.label; |
| 2180 _findIdentifier(_enclosingExecutable.labels, labelName); | 2114 _findIdentifier(_enclosingExecutable.labels, labelName); |
| 2181 } | 2115 } |
| 2182 return super.visitSwitchCase(node); | 2116 return super.visitSwitchCase(node); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2280 /** | 2214 /** |
| 2281 * Return the import element from the given array whose library has the given
source and that has | 2215 * Return the import element from the given array whose library has the given
source and that has |
| 2282 * the given prefix, or `null` if there is no such import. | 2216 * the given prefix, or `null` if there is no such import. |
| 2283 * | 2217 * |
| 2284 * @param imports the import elements being searched | 2218 * @param imports the import elements being searched |
| 2285 * @param source the source of the library associated with the import element
to being searched | 2219 * @param source the source of the library associated with the import element
to being searched |
| 2286 * for | 2220 * for |
| 2287 * @param prefix the prefix with which the library was imported | 2221 * @param prefix the prefix with which the library was imported |
| 2288 * @return the import element whose library has the given source and prefix | 2222 * @return the import element whose library has the given source and prefix |
| 2289 */ | 2223 */ |
| 2290 ImportElement _findImport(List<ImportElement> imports, Source source, | 2224 ImportElement _findImport( |
| 2291 SimpleIdentifier prefix) { | 2225 List<ImportElement> imports, Source source, SimpleIdentifier prefix) { |
| 2292 for (ImportElement element in imports) { | 2226 for (ImportElement element in imports) { |
| 2293 if (element.importedLibrary.source == source) { | 2227 if (element.importedLibrary.source == source) { |
| 2294 PrefixElement prefixElement = element.prefix; | 2228 PrefixElement prefixElement = element.prefix; |
| 2295 if (prefix == null) { | 2229 if (prefix == null) { |
| 2296 if (prefixElement == null) { | 2230 if (prefixElement == null) { |
| 2297 return element; | 2231 return element; |
| 2298 } | 2232 } |
| 2299 } else { | 2233 } else { |
| 2300 if (prefixElement != null && | 2234 if (prefixElement != null && |
| 2301 prefix.name == prefixElement.displayName) { | 2235 prefix.name == prefixElement.displayName) { |
| 2302 return element; | 2236 return element; |
| 2303 } | 2237 } |
| 2304 } | 2238 } |
| 2305 } | 2239 } |
| 2306 } | 2240 } |
| 2307 return null; | 2241 return null; |
| 2308 } | 2242 } |
| 2309 | 2243 |
| 2310 /** | 2244 /** |
| 2311 * Return the element for the part with the given source, or `null` if there i
s no element | 2245 * Return the element for the part with the given source, or `null` if there i
s no element |
| 2312 * for the given source. | 2246 * for the given source. |
| 2313 * | 2247 * |
| 2314 * @param parts the elements for the parts | 2248 * @param parts the elements for the parts |
| 2315 * @param partSource the source for the part whose element is to be returned | 2249 * @param partSource the source for the part whose element is to be returned |
| 2316 * @return the element for the part with the given source | 2250 * @return the element for the part with the given source |
| 2317 */ | 2251 */ |
| 2318 CompilationUnitElement _findPart(List<CompilationUnitElement> parts, | 2252 CompilationUnitElement _findPart( |
| 2319 Source partSource) { | 2253 List<CompilationUnitElement> parts, Source partSource) { |
| 2320 for (CompilationUnitElement part in parts) { | 2254 for (CompilationUnitElement part in parts) { |
| 2321 if (part.source == partSource) { | 2255 if (part.source == partSource) { |
| 2322 return part; | 2256 return part; |
| 2323 } | 2257 } |
| 2324 } | 2258 } |
| 2325 return null; | 2259 return null; |
| 2326 } | 2260 } |
| 2327 | 2261 |
| 2328 /** | 2262 /** |
| 2329 * Return the element in the given array of elements that was created for the
declaration with the | 2263 * Return the element in the given array of elements that was created for the
declaration with the |
| 2330 * given name at the given offset. | 2264 * given name at the given offset. |
| 2331 * | 2265 * |
| 2332 * @param elements the elements of the appropriate kind that exist in the curr
ent context | 2266 * @param elements the elements of the appropriate kind that exist in the curr
ent context |
| 2333 * @param name the name of the element to be returned | 2267 * @param name the name of the element to be returned |
| 2334 * @param offset the offset of the name of the element to be returned | 2268 * @param offset the offset of the name of the element to be returned |
| 2335 * @return the element with the given name and offset | 2269 * @return the element with the given name and offset |
| 2336 */ | 2270 */ |
| 2337 Element _findWithNameAndOffset(List<Element> elements, String name, | 2271 Element _findWithNameAndOffset( |
| 2338 int offset) { | 2272 List<Element> elements, String name, int offset) { |
| 2339 for (Element element in elements) { | 2273 for (Element element in elements) { |
| 2340 if (element.displayName == name && element.nameOffset == offset) { | 2274 if (element.displayName == name && element.nameOffset == offset) { |
| 2341 return element; | 2275 return element; |
| 2342 } | 2276 } |
| 2343 } | 2277 } |
| 2344 return null; | 2278 return null; |
| 2345 } | 2279 } |
| 2346 | 2280 |
| 2347 /** | 2281 /** |
| 2348 * Search the most closely enclosing list of parameters for a parameter with t
he given name. | 2282 * Search the most closely enclosing list of parameters for a parameter with t
he given name. |
| 2349 * | 2283 * |
| 2350 * @param node the node defining the parameter with the given name | 2284 * @param node the node defining the parameter with the given name |
| 2351 * @param parameterName the name of the parameter being searched for | 2285 * @param parameterName the name of the parameter being searched for |
| 2352 * @return the element representing the parameter with that name | 2286 * @return the element representing the parameter with that name |
| 2353 */ | 2287 */ |
| 2354 ParameterElement _getElementForParameter(FormalParameter node, | 2288 ParameterElement _getElementForParameter( |
| 2355 SimpleIdentifier parameterName) { | 2289 FormalParameter node, SimpleIdentifier parameterName) { |
| 2356 List<ParameterElement> parameters = null; | 2290 List<ParameterElement> parameters = null; |
| 2357 if (_enclosingParameter != null) { | 2291 if (_enclosingParameter != null) { |
| 2358 parameters = _enclosingParameter.parameters; | 2292 parameters = _enclosingParameter.parameters; |
| 2359 } | 2293 } |
| 2360 if (parameters == null && _enclosingExecutable != null) { | 2294 if (parameters == null && _enclosingExecutable != null) { |
| 2361 parameters = _enclosingExecutable.parameters; | 2295 parameters = _enclosingExecutable.parameters; |
| 2362 } | 2296 } |
| 2363 if (parameters == null && _enclosingAlias != null) { | 2297 if (parameters == null && _enclosingAlias != null) { |
| 2364 parameters = _enclosingAlias.parameters; | 2298 parameters = _enclosingAlias.parameters; |
| 2365 } | 2299 } |
| 2366 ParameterElement element = | 2300 ParameterElement element = |
| 2367 parameters == null ? null : _findIdentifier(parameters, parameterName); | 2301 parameters == null ? null : _findIdentifier(parameters, parameterName); |
| 2368 if (element == null) { | 2302 if (element == null) { |
| 2369 StringBuffer buffer = new StringBuffer(); | 2303 StringBuffer buffer = new StringBuffer(); |
| 2370 buffer.writeln("Invalid state found in the Analysis Engine:"); | 2304 buffer.writeln("Invalid state found in the Analysis Engine:"); |
| 2371 buffer.writeln( | 2305 buffer.writeln( |
| 2372 "DeclarationResolver.getElementForParameter() is visiting a parameter
that does not appear to be in a method or function."); | 2306 "DeclarationResolver.getElementForParameter() is visiting a parameter
that does not appear to be in a method or function."); |
| 2373 buffer.writeln("Ancestors:"); | 2307 buffer.writeln("Ancestors:"); |
| 2374 AstNode parent = node.parent; | 2308 AstNode parent = node.parent; |
| 2375 while (parent != null) { | 2309 while (parent != null) { |
| 2376 buffer.writeln(parent.runtimeType.toString()); | 2310 buffer.writeln(parent.runtimeType.toString()); |
| 2377 buffer.writeln("---------"); | 2311 buffer.writeln("---------"); |
| 2378 parent = parent.parent; | 2312 parent = parent.parent; |
| 2379 } | 2313 } |
| 2380 AnalysisEngine.instance.logger.logError( | 2314 AnalysisEngine.instance.logger.logError(buffer.toString(), |
| 2381 buffer.toString(), | |
| 2382 new CaughtException(new AnalysisException(), null)); | 2315 new CaughtException(new AnalysisException(), null)); |
| 2383 } | 2316 } |
| 2384 return element; | 2317 return element; |
| 2385 } | 2318 } |
| 2386 | 2319 |
| 2387 /** | 2320 /** |
| 2388 * Return the value of the given string literal, or `null` if the string is no
t a constant | 2321 * Return the value of the given string literal, or `null` if the string is no
t a constant |
| 2389 * string without any string interpolation. | 2322 * string without any string interpolation. |
| 2390 * | 2323 * |
| 2391 * @param literal the string literal whose value is to be returned | 2324 * @param literal the string literal whose value is to be returned |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2770 _currentHolder.addFunction(element); | 2703 _currentHolder.addFunction(element); |
| 2771 expression.element = element; | 2704 expression.element = element; |
| 2772 functionName.staticElement = element; | 2705 functionName.staticElement = element; |
| 2773 } else { | 2706 } else { |
| 2774 SimpleIdentifier propertyNameNode = node.name; | 2707 SimpleIdentifier propertyNameNode = node.name; |
| 2775 if (propertyNameNode == null) { | 2708 if (propertyNameNode == null) { |
| 2776 // TODO(brianwilkerson) Report this internal error. | 2709 // TODO(brianwilkerson) Report this internal error. |
| 2777 return null; | 2710 return null; |
| 2778 } | 2711 } |
| 2779 String propertyName = propertyNameNode.name; | 2712 String propertyName = propertyNameNode.name; |
| 2780 TopLevelVariableElementImpl variable = | 2713 TopLevelVariableElementImpl variable = _currentHolder |
| 2781 _currentHolder.getTopLevelVariable(propertyName) as TopLevelVariable
ElementImpl; | 2714 .getTopLevelVariable(propertyName) as TopLevelVariableElementImpl; |
| 2782 if (variable == null) { | 2715 if (variable == null) { |
| 2783 variable = new TopLevelVariableElementImpl(node.name.name, -1); | 2716 variable = new TopLevelVariableElementImpl(node.name.name, -1); |
| 2784 variable.final2 = true; | 2717 variable.final2 = true; |
| 2785 variable.synthetic = true; | 2718 variable.synthetic = true; |
| 2786 _currentHolder.addTopLevelVariable(variable); | 2719 _currentHolder.addTopLevelVariable(variable); |
| 2787 } | 2720 } |
| 2788 if (node.isGetter) { | 2721 if (node.isGetter) { |
| 2789 PropertyAccessorElementImpl getter = | 2722 PropertyAccessorElementImpl getter = |
| 2790 new PropertyAccessorElementImpl.forNode(propertyNameNode); | 2723 new PropertyAccessorElementImpl.forNode(propertyNameNode); |
| 2791 getter.functions = holder.functions; | 2724 getter.functions = holder.functions; |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3025 if (node.name.staticElement == null) { | 2958 if (node.name.staticElement == null) { |
| 3026 ClassDeclaration classNode = | 2959 ClassDeclaration classNode = |
| 3027 node.getAncestor((node) => node is ClassDeclaration); | 2960 node.getAncestor((node) => node is ClassDeclaration); |
| 3028 StringBuffer buffer = new StringBuffer(); | 2961 StringBuffer buffer = new StringBuffer(); |
| 3029 buffer.write("The element for the method "); | 2962 buffer.write("The element for the method "); |
| 3030 buffer.write(node.name); | 2963 buffer.write(node.name); |
| 3031 buffer.write(" in "); | 2964 buffer.write(" in "); |
| 3032 buffer.write(classNode.name); | 2965 buffer.write(classNode.name); |
| 3033 buffer.write(" was not set while trying to build the element model."); | 2966 buffer.write(" was not set while trying to build the element model."); |
| 3034 AnalysisEngine.instance.logger.logError( | 2967 AnalysisEngine.instance.logger.logError( |
| 3035 buffer.toString(), | 2968 buffer.toString(), new CaughtException(exception, stackTrace)); |
| 3036 new CaughtException(exception, stackTrace)); | |
| 3037 } else { | 2969 } else { |
| 3038 String message = | 2970 String message = |
| 3039 "Exception caught in ElementBuilder.visitMethodDeclaration()"; | 2971 "Exception caught in ElementBuilder.visitMethodDeclaration()"; |
| 3040 AnalysisEngine.instance.logger.logError( | 2972 AnalysisEngine.instance.logger.logError( |
| 3041 message, | 2973 message, new CaughtException(exception, stackTrace)); |
| 3042 new CaughtException(exception, stackTrace)); | |
| 3043 } | 2974 } |
| 3044 } finally { | 2975 } finally { |
| 3045 if (node.name.staticElement == null) { | 2976 if (node.name.staticElement == null) { |
| 3046 ClassDeclaration classNode = | 2977 ClassDeclaration classNode = |
| 3047 node.getAncestor((node) => node is ClassDeclaration); | 2978 node.getAncestor((node) => node is ClassDeclaration); |
| 3048 StringBuffer buffer = new StringBuffer(); | 2979 StringBuffer buffer = new StringBuffer(); |
| 3049 buffer.write("The element for the method "); | 2980 buffer.write("The element for the method "); |
| 3050 buffer.write(node.name); | 2981 buffer.write(node.name); |
| 3051 buffer.write(" in "); | 2982 buffer.write(" in "); |
| 3052 buffer.write(classNode.name); | 2983 buffer.write(classNode.name); |
| 3053 buffer.write(" was not set while trying to resolve types."); | 2984 buffer.write(" was not set while trying to resolve types."); |
| 3054 AnalysisEngine.instance.logger.logError( | 2985 AnalysisEngine.instance.logger.logError(buffer.toString(), |
| 3055 buffer.toString(), | 2986 new CaughtException( |
| 3056 new CaughtException(new AnalysisException(buffer.toString()), null))
; | 2987 new AnalysisException(buffer.toString()), null)); |
| 3057 } | 2988 } |
| 3058 } | 2989 } |
| 3059 return null; | 2990 return null; |
| 3060 } | 2991 } |
| 3061 | 2992 |
| 3062 @override | 2993 @override |
| 3063 Object visitSimpleFormalParameter(SimpleFormalParameter node) { | 2994 Object visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 3064 if (node.parent is! DefaultFormalParameter) { | 2995 if (node.parent is! DefaultFormalParameter) { |
| 3065 SimpleIdentifier parameterName = node.identifier; | 2996 SimpleIdentifier parameterName = node.identifier; |
| 3066 ParameterElementImpl parameter = | 2997 ParameterElementImpl parameter = |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3224 _fieldMap[field.name] = field; | 3155 _fieldMap[field.name] = field; |
| 3225 } | 3156 } |
| 3226 } | 3157 } |
| 3227 | 3158 |
| 3228 /** | 3159 /** |
| 3229 * Creates the [ConstructorElement]s array with the single default constructor
element. | 3160 * Creates the [ConstructorElement]s array with the single default constructor
element. |
| 3230 * | 3161 * |
| 3231 * @param interfaceType the interface type for which to create a default const
ructor | 3162 * @param interfaceType the interface type for which to create a default const
ructor |
| 3232 * @return the [ConstructorElement]s array with the single default constructor
element | 3163 * @return the [ConstructorElement]s array with the single default constructor
element |
| 3233 */ | 3164 */ |
| 3234 List<ConstructorElement> | 3165 List<ConstructorElement> _createDefaultConstructors( |
| 3235 _createDefaultConstructors(InterfaceTypeImpl interfaceType) { | 3166 InterfaceTypeImpl interfaceType) { |
| 3236 ConstructorElementImpl constructor = | 3167 ConstructorElementImpl constructor = |
| 3237 new ConstructorElementImpl.forNode(null); | 3168 new ConstructorElementImpl.forNode(null); |
| 3238 constructor.synthetic = true; | 3169 constructor.synthetic = true; |
| 3239 constructor.returnType = interfaceType; | 3170 constructor.returnType = interfaceType; |
| 3240 FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor); | 3171 FunctionTypeImpl type = new FunctionTypeImpl.con1(constructor); |
| 3241 _functionTypesToFix.add(type); | 3172 _functionTypesToFix.add(type); |
| 3242 constructor.type = type; | 3173 constructor.type = type; |
| 3243 return <ConstructorElement>[constructor]; | 3174 return <ConstructorElement>[constructor]; |
| 3244 } | 3175 } |
| 3245 | 3176 |
| 3246 /** | 3177 /** |
| 3247 * Create the types associated with the given type parameters, setting the typ
e of each type | 3178 * Create the types associated with the given type parameters, setting the typ
e of each type |
| 3248 * parameter, and return an array of types corresponding to the given paramete
rs. | 3179 * parameter, and return an array of types corresponding to the given paramete
rs. |
| 3249 * | 3180 * |
| 3250 * @param typeParameters the type parameters for which types are to be created | 3181 * @param typeParameters the type parameters for which types are to be created |
| 3251 * @return an array of types corresponding to the given parameters | 3182 * @return an array of types corresponding to the given parameters |
| 3252 */ | 3183 */ |
| 3253 List<DartType> | 3184 List<DartType> _createTypeParameterTypes( |
| 3254 _createTypeParameterTypes(List<TypeParameterElement> typeParameters) { | 3185 List<TypeParameterElement> typeParameters) { |
| 3255 int typeParameterCount = typeParameters.length; | 3186 int typeParameterCount = typeParameters.length; |
| 3256 List<DartType> typeArguments = new List<DartType>(typeParameterCount); | 3187 List<DartType> typeArguments = new List<DartType>(typeParameterCount); |
| 3257 for (int i = 0; i < typeParameterCount; i++) { | 3188 for (int i = 0; i < typeParameterCount; i++) { |
| 3258 TypeParameterElementImpl typeParameter = | 3189 TypeParameterElementImpl typeParameter = |
| 3259 typeParameters[i] as TypeParameterElementImpl; | 3190 typeParameters[i] as TypeParameterElementImpl; |
| 3260 TypeParameterTypeImpl typeParameterType = | 3191 TypeParameterTypeImpl typeParameterType = |
| 3261 new TypeParameterTypeImpl(typeParameter); | 3192 new TypeParameterTypeImpl(typeParameter); |
| 3262 typeParameter.type = typeParameterType; | 3193 typeParameter.type = typeParameterType; |
| 3263 typeArguments[i] = typeParameterType; | 3194 typeArguments[i] = typeParameterType; |
| 3264 } | 3195 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3283 return (parent as MethodDeclaration).body; | 3214 return (parent as MethodDeclaration).body; |
| 3284 } | 3215 } |
| 3285 parent = parent.parent; | 3216 parent = parent.parent; |
| 3286 } | 3217 } |
| 3287 return null; | 3218 return null; |
| 3288 } | 3219 } |
| 3289 | 3220 |
| 3290 /** | 3221 /** |
| 3291 * Sets the visible source range for formal parameter. | 3222 * Sets the visible source range for formal parameter. |
| 3292 */ | 3223 */ |
| 3293 void _setParameterVisibleRange(FormalParameter node, | 3224 void _setParameterVisibleRange( |
| 3294 ParameterElementImpl element) { | 3225 FormalParameter node, ParameterElementImpl element) { |
| 3295 FunctionBody body = _getFunctionBody(node); | 3226 FunctionBody body = _getFunctionBody(node); |
| 3296 if (body != null) { | 3227 if (body != null) { |
| 3297 element.setVisibleRange(body.offset, body.length); | 3228 element.setVisibleRange(body.offset, body.length); |
| 3298 } | 3229 } |
| 3299 } | 3230 } |
| 3300 | 3231 |
| 3301 /** | 3232 /** |
| 3302 * Make the given holder be the current holder while visiting the given node. | 3233 * Make the given holder be the current holder while visiting the given node. |
| 3303 * | 3234 * |
| 3304 * @param holder the holder that will gather elements that are built while vis
iting the children | 3235 * @param holder the holder that will gather elements that are built while vis
iting the children |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3683 buffer.write(" type aliases"); | 3614 buffer.write(" type aliases"); |
| 3684 } | 3615 } |
| 3685 if (_typeParameters != null) { | 3616 if (_typeParameters != null) { |
| 3686 if (buffer.length > 0) { | 3617 if (buffer.length > 0) { |
| 3687 buffer.write("; "); | 3618 buffer.write("; "); |
| 3688 } | 3619 } |
| 3689 buffer.write(_typeParameters.length); | 3620 buffer.write(_typeParameters.length); |
| 3690 buffer.write(" type parameters"); | 3621 buffer.write(" type parameters"); |
| 3691 } | 3622 } |
| 3692 if (buffer.length > 0) { | 3623 if (buffer.length > 0) { |
| 3693 AnalysisEngine.instance.logger.logError( | 3624 AnalysisEngine.instance.logger |
| 3694 "Failed to capture elements: $buffer"); | 3625 .logError("Failed to capture elements: $buffer"); |
| 3695 } | 3626 } |
| 3696 } | 3627 } |
| 3697 } | 3628 } |
| 3698 | 3629 |
| 3699 /** | 3630 /** |
| 3700 * Instances of the class `EnclosedScope` implement a scope that is lexically en
closed in | 3631 * Instances of the class `EnclosedScope` implement a scope that is lexically en
closed in |
| 3701 * another scope. | 3632 * another scope. |
| 3702 */ | 3633 */ |
| 3703 class EnclosedScope extends Scope { | 3634 class EnclosedScope extends Scope { |
| 3704 /** | 3635 /** |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3739 if (element != null) { | 3670 if (element != null) { |
| 3740 String name = element.name; | 3671 String name = element.name; |
| 3741 if (name != null && !name.isEmpty) { | 3672 if (name != null && !name.isEmpty) { |
| 3742 _hiddenElements[name] = element; | 3673 _hiddenElements[name] = element; |
| 3743 _hasHiddenName = true; | 3674 _hasHiddenName = true; |
| 3744 } | 3675 } |
| 3745 } | 3676 } |
| 3746 } | 3677 } |
| 3747 | 3678 |
| 3748 @override | 3679 @override |
| 3749 Element internalLookup(Identifier identifier, String name, | 3680 Element internalLookup( |
| 3750 LibraryElement referencingLibrary) { | 3681 Identifier identifier, String name, LibraryElement referencingLibrary) { |
| 3751 Element element = localLookup(name, referencingLibrary); | 3682 Element element = localLookup(name, referencingLibrary); |
| 3752 if (element != null) { | 3683 if (element != null) { |
| 3753 return element; | 3684 return element; |
| 3754 } | 3685 } |
| 3755 // May be there is a hidden Element. | 3686 // May be there is a hidden Element. |
| 3756 if (_hasHiddenName) { | 3687 if (_hasHiddenName) { |
| 3757 Element hiddenElement = _hiddenElements[name]; | 3688 Element hiddenElement = _hiddenElements[name]; |
| 3758 if (hiddenElement != null) { | 3689 if (hiddenElement != null) { |
| 3759 errorListener.onError( | 3690 errorListener.onError(new AnalysisError.con2(getSource(identifier), |
| 3760 new AnalysisError.con2( | 3691 identifier.offset, identifier.length, |
| 3761 getSource(identifier), | 3692 CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, [])); |
| 3762 identifier.offset, | |
| 3763 identifier.length, | |
| 3764 CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, | |
| 3765 [])); | |
| 3766 return hiddenElement; | 3693 return hiddenElement; |
| 3767 } | 3694 } |
| 3768 } | 3695 } |
| 3769 // Check enclosing scope. | 3696 // Check enclosing scope. |
| 3770 return enclosingScope.internalLookup(identifier, name, referencingLibrary); | 3697 return enclosingScope.internalLookup(identifier, name, referencingLibrary); |
| 3771 } | 3698 } |
| 3772 } | 3699 } |
| 3773 | 3700 |
| 3774 /** | 3701 /** |
| 3775 * Instances of the class `EnumMemberBuilder` build the members in enum declarat
ions. | 3702 * Instances of the class `EnumMemberBuilder` build the members in enum declarat
ions. |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4025 Expression conditionExpression = node.condition; | 3952 Expression conditionExpression = node.condition; |
| 4026 if (conditionExpression != null && _nodeExits(conditionExpression)) { | 3953 if (conditionExpression != null && _nodeExits(conditionExpression)) { |
| 4027 return true; | 3954 return true; |
| 4028 } | 3955 } |
| 4029 if (_visitExpressions(node.updaters)) { | 3956 if (_visitExpressions(node.updaters)) { |
| 4030 return true; | 3957 return true; |
| 4031 } | 3958 } |
| 4032 // TODO(jwren) Do we want to take all constant expressions into account? | 3959 // TODO(jwren) Do we want to take all constant expressions into account? |
| 4033 // If for(; true; ) (or for(;;)), and the body doesn't return or the body | 3960 // If for(; true; ) (or for(;;)), and the body doesn't return or the body |
| 4034 // doesn't have a break, then return true. | 3961 // doesn't have a break, then return true. |
| 4035 bool implicitOrExplictTrue = | 3962 bool implicitOrExplictTrue = conditionExpression == null || |
| 4036 conditionExpression == null || | |
| 4037 (conditionExpression is BooleanLiteral && conditionExpression.value); | 3963 (conditionExpression is BooleanLiteral && conditionExpression.value); |
| 4038 if (implicitOrExplictTrue) { | 3964 if (implicitOrExplictTrue) { |
| 4039 bool blockReturns = _nodeExits(node.body); | 3965 bool blockReturns = _nodeExits(node.body); |
| 4040 if (blockReturns || !_enclosingBlockContainsBreak) { | 3966 if (blockReturns || !_enclosingBlockContainsBreak) { |
| 4041 return true; | 3967 return true; |
| 4042 } | 3968 } |
| 4043 } | 3969 } |
| 4044 return false; | 3970 return false; |
| 4045 } finally { | 3971 } finally { |
| 4046 _enclosingBlockContainsBreak = outerBreakValue; | 3972 _enclosingBlockContainsBreak = outerBreakValue; |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4304 | 4230 |
| 4305 bool _visitStatements(NodeList<Statement> statements) { | 4231 bool _visitStatements(NodeList<Statement> statements) { |
| 4306 for (int i = statements.length - 1; i >= 0; i--) { | 4232 for (int i = statements.length - 1; i >= 0; i--) { |
| 4307 if (statements[i].accept(this)) { | 4233 if (statements[i].accept(this)) { |
| 4308 return true; | 4234 return true; |
| 4309 } | 4235 } |
| 4310 } | 4236 } |
| 4311 return false; | 4237 return false; |
| 4312 } | 4238 } |
| 4313 | 4239 |
| 4314 bool | 4240 bool _visitVariableDeclarations( |
| 4315 _visitVariableDeclarations(NodeList<VariableDeclaration> variableDeclarati
ons) { | 4241 NodeList<VariableDeclaration> variableDeclarations) { |
| 4316 for (int i = variableDeclarations.length - 1; i >= 0; i--) { | 4242 for (int i = variableDeclarations.length - 1; i >= 0; i--) { |
| 4317 if (variableDeclarations[i].accept(this)) { | 4243 if (variableDeclarations[i].accept(this)) { |
| 4318 return true; | 4244 return true; |
| 4319 } | 4245 } |
| 4320 } | 4246 } |
| 4321 return false; | 4247 return false; |
| 4322 } | 4248 } |
| 4323 | 4249 |
| 4324 /** | 4250 /** |
| 4325 * Return `true` if the given [node] exits. | 4251 * Return `true` if the given [node] exits. |
| 4326 */ | 4252 */ |
| 4327 static bool exits(AstNode node) { | 4253 static bool exits(AstNode node) { |
| 4328 return new ExitDetector()._nodeExits(node); | 4254 return new ExitDetector()._nodeExits(node); |
| 4329 } | 4255 } |
| 4330 } | 4256 } |
| 4331 | 4257 |
| 4332 | |
| 4333 /** | 4258 /** |
| 4334 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. | 4259 * Instances of the class `FunctionScope` implement the scope defined by a funct
ion. |
| 4335 */ | 4260 */ |
| 4336 class FunctionScope extends EnclosedScope { | 4261 class FunctionScope extends EnclosedScope { |
| 4337 final ExecutableElement _functionElement; | 4262 final ExecutableElement _functionElement; |
| 4338 | 4263 |
| 4339 bool _parametersDefined = false; | 4264 bool _parametersDefined = false; |
| 4340 | 4265 |
| 4341 /** | 4266 /** |
| 4342 * Initialize a newly created scope enclosed within another scope. | 4267 * Initialize a newly created scope enclosed within another scope. |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4457 if (element != null) { | 4382 if (element != null) { |
| 4458 if (i == 0) { | 4383 if (i == 0) { |
| 4459 _importsVerifier.inDefiningCompilationUnit = true; | 4384 _importsVerifier.inDefiningCompilationUnit = true; |
| 4460 _generateForCompilationUnit(_compilationUnits[i], element.source); | 4385 _generateForCompilationUnit(_compilationUnits[i], element.source); |
| 4461 _importsVerifier.inDefiningCompilationUnit = false; | 4386 _importsVerifier.inDefiningCompilationUnit = false; |
| 4462 } else { | 4387 } else { |
| 4463 _generateForCompilationUnit(_compilationUnits[i], element.source); | 4388 _generateForCompilationUnit(_compilationUnits[i], element.source); |
| 4464 } | 4389 } |
| 4465 } | 4390 } |
| 4466 } | 4391 } |
| 4467 ErrorReporter definingCompilationUnitErrorReporter = | 4392 ErrorReporter definingCompilationUnitErrorReporter = new ErrorReporter( |
| 4468 new ErrorReporter(_errorListener, _compilationUnits[0].element.source)
; | 4393 _errorListener, _compilationUnits[0].element.source); |
| 4469 _importsVerifier.generateDuplicateImportHints( | 4394 _importsVerifier |
| 4470 definingCompilationUnitErrorReporter); | 4395 .generateDuplicateImportHints(definingCompilationUnitErrorReporter); |
| 4471 _importsVerifier.generateUnusedImportHints( | 4396 _importsVerifier |
| 4472 definingCompilationUnitErrorReporter); | 4397 .generateUnusedImportHints(definingCompilationUnitErrorReporter); |
| 4473 _library.accept( | 4398 _library.accept(new _UnusedElementsVerifier( |
| 4474 new _UnusedElementsVerifier(_errorListener, _usedElementsVisitor.usedE
lements)); | 4399 _errorListener, _usedElementsVisitor.usedElements)); |
| 4475 }); | 4400 }); |
| 4476 } | 4401 } |
| 4477 | 4402 |
| 4478 void _generateForCompilationUnit(CompilationUnit unit, Source source) { | 4403 void _generateForCompilationUnit(CompilationUnit unit, Source source) { |
| 4479 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source); | 4404 ErrorReporter errorReporter = new ErrorReporter(_errorListener, source); |
| 4480 unit.accept(_importsVerifier); | 4405 unit.accept(_importsVerifier); |
| 4481 // dead code analysis | 4406 // dead code analysis |
| 4482 unit.accept(new DeadCodeVerifier(errorReporter)); | 4407 unit.accept(new DeadCodeVerifier(errorReporter)); |
| 4483 unit.accept(_usedElementsVisitor); | 4408 unit.accept(_usedElementsVisitor); |
| 4484 // dart2js analysis | 4409 // dart2js analysis |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4614 visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { | 4539 visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { |
| 4615 visitXmlTagNode(node); | 4540 visitXmlTagNode(node); |
| 4616 } | 4541 } |
| 4617 | 4542 |
| 4618 @override | 4543 @override |
| 4619 visitHtmlUnit(ht.HtmlUnit node) { | 4544 visitHtmlUnit(ht.HtmlUnit node) { |
| 4620 node.visitChildren(this); | 4545 node.visitChildren(this); |
| 4621 } | 4546 } |
| 4622 | 4547 |
| 4623 @override | 4548 @override |
| 4624 visitXmlAttributeNode(ht.XmlAttributeNode node) { | 4549 visitXmlAttributeNode(ht.XmlAttributeNode node) {} |
| 4625 } | |
| 4626 | 4550 |
| 4627 @override | 4551 @override |
| 4628 visitXmlTagNode(ht.XmlTagNode node) { | 4552 visitXmlTagNode(ht.XmlTagNode node) { |
| 4629 node.visitChildren(this); | 4553 node.visitChildren(this); |
| 4630 String tagName = node.tag; | 4554 String tagName = node.tag; |
| 4631 tagSet.add(tagName); | 4555 tagSet.add(tagName); |
| 4632 for (ht.XmlAttributeNode attribute in node.attributes) { | 4556 for (ht.XmlAttributeNode attribute in node.attributes) { |
| 4633 String attributeName = attribute.name; | 4557 String attributeName = attribute.name; |
| 4634 if (attributeName == ID_ATTRIBUTE) { | 4558 if (attributeName == ID_ATTRIBUTE) { |
| 4635 String attributeValue = attribute.text; | 4559 String attributeValue = attribute.text; |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4806 if (scriptSourcePath != null) { | 4730 if (scriptSourcePath != null) { |
| 4807 try { | 4731 try { |
| 4808 scriptSourcePath = Uri.encodeFull(scriptSourcePath); | 4732 scriptSourcePath = Uri.encodeFull(scriptSourcePath); |
| 4809 // Force an exception to be thrown if the URI is invalid so that we | 4733 // Force an exception to be thrown if the URI is invalid so that we |
| 4810 // can report the problem. | 4734 // can report the problem. |
| 4811 parseUriWithException(scriptSourcePath); | 4735 parseUriWithException(scriptSourcePath); |
| 4812 Source scriptSource = | 4736 Source scriptSource = |
| 4813 _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath); | 4737 _context.sourceFactory.resolveUri(htmlSource, scriptSourcePath); |
| 4814 script.scriptSource = scriptSource; | 4738 script.scriptSource = scriptSource; |
| 4815 if (!_context.exists(scriptSource)) { | 4739 if (!_context.exists(scriptSource)) { |
| 4816 _reportValueError( | 4740 _reportValueError(HtmlWarningCode.URI_DOES_NOT_EXIST, |
| 4817 HtmlWarningCode.URI_DOES_NOT_EXIST, | 4741 scriptAttribute, [scriptSourcePath]); |
| 4818 scriptAttribute, | |
| 4819 [scriptSourcePath]); | |
| 4820 } | 4742 } |
| 4821 } on URISyntaxException catch (exception) { | 4743 } on URISyntaxException catch (exception) { |
| 4822 _reportValueError( | 4744 _reportValueError(HtmlWarningCode.INVALID_URI, scriptAttribute, [ |
| 4823 HtmlWarningCode.INVALID_URI, | 4745 scriptSourcePath |
| 4824 scriptAttribute, | 4746 ]); |
| 4825 [scriptSourcePath]); | |
| 4826 } | 4747 } |
| 4827 } | 4748 } |
| 4828 node.scriptElement = script; | 4749 node.scriptElement = script; |
| 4829 _scripts.add(script); | 4750 _scripts.add(script); |
| 4830 } | 4751 } |
| 4831 } finally { | 4752 } finally { |
| 4832 _parentNodes.remove(node); | 4753 _parentNodes.remove(node); |
| 4833 } | 4754 } |
| 4834 return null; | 4755 return null; |
| 4835 } | 4756 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4910 | 4831 |
| 4911 /** | 4832 /** |
| 4912 * Report an error with the given error code at the given location. Use the gi
ven arguments to | 4833 * Report an error with the given error code at the given location. Use the gi
ven arguments to |
| 4913 * compose the error message. | 4834 * compose the error message. |
| 4914 * | 4835 * |
| 4915 * @param errorCode the error code of the error to be reported | 4836 * @param errorCode the error code of the error to be reported |
| 4916 * @param offset the offset of the first character to be highlighted | 4837 * @param offset the offset of the first character to be highlighted |
| 4917 * @param length the number of characters to be highlighted | 4838 * @param length the number of characters to be highlighted |
| 4918 * @param arguments the arguments used to compose the error message | 4839 * @param arguments the arguments used to compose the error message |
| 4919 */ | 4840 */ |
| 4920 void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, | 4841 void _reportErrorForOffset( |
| 4921 List<Object> arguments) { | 4842 ErrorCode errorCode, int offset, int length, List<Object> arguments) { |
| 4922 _errorListener.onError( | 4843 _errorListener.onError(new AnalysisError.con2( |
| 4923 new AnalysisError.con2( | 4844 _htmlElement.source, offset, length, errorCode, arguments)); |
| 4924 _htmlElement.source, | |
| 4925 offset, | |
| 4926 length, | |
| 4927 errorCode, | |
| 4928 arguments)); | |
| 4929 } | 4845 } |
| 4930 | 4846 |
| 4931 /** | 4847 /** |
| 4932 * Report an error with the given error code at the location of the value of t
he given attribute. | 4848 * Report an error with the given error code at the location of the value of t
he given attribute. |
| 4933 * Use the given arguments to compose the error message. | 4849 * Use the given arguments to compose the error message. |
| 4934 * | 4850 * |
| 4935 * @param errorCode the error code of the error to be reported | 4851 * @param errorCode the error code of the error to be reported |
| 4936 * @param offset the offset of the first character to be highlighted | 4852 * @param offset the offset of the first character to be highlighted |
| 4937 * @param length the number of characters to be highlighted | 4853 * @param length the number of characters to be highlighted |
| 4938 * @param arguments the arguments used to compose the error message | 4854 * @param arguments the arguments used to compose the error message |
| (...skipping 26 matching lines...) Expand all Loading... |
| 4965 /** | 4881 /** |
| 4966 * Initialize a newly created visitor to build implicit constructors for file | 4882 * Initialize a newly created visitor to build implicit constructors for file |
| 4967 * [source], in library [libraryElement], which has scope [libraryScope]. Use | 4883 * [source], in library [libraryElement], which has scope [libraryScope]. Use |
| 4968 * [typeProvider] to access types from the core library. | 4884 * [typeProvider] to access types from the core library. |
| 4969 * | 4885 * |
| 4970 * The visit methods will pass closures to [_callback] to indicate what | 4886 * The visit methods will pass closures to [_callback] to indicate what |
| 4971 * computation needs to be performed, and its dependency order. | 4887 * computation needs to be performed, and its dependency order. |
| 4972 */ | 4888 */ |
| 4973 ImplicitConstructorBuilder(Source source, LibraryElement libraryElement, | 4889 ImplicitConstructorBuilder(Source source, LibraryElement libraryElement, |
| 4974 LibraryScope libraryScope, TypeProvider typeProvider, this._callback) | 4890 LibraryScope libraryScope, TypeProvider typeProvider, this._callback) |
| 4975 : super.con3( | 4891 : super.con3(libraryElement, source, typeProvider, libraryScope, |
| 4976 libraryElement, | |
| 4977 source, | |
| 4978 typeProvider, | |
| 4979 libraryScope, | |
| 4980 libraryScope.errorListener); | 4892 libraryScope.errorListener); |
| 4981 | 4893 |
| 4982 @override | 4894 @override |
| 4983 Object visitClassDeclaration(ClassDeclaration node) { | 4895 Object visitClassDeclaration(ClassDeclaration node) { |
| 4984 ClassElementImpl classElement = node.element; | 4896 ClassElementImpl classElement = node.element; |
| 4985 classElement.mixinErrorsReported = false; | 4897 classElement.mixinErrorsReported = false; |
| 4986 if (node.extendsClause != null && node.withClause != null) { | 4898 if (node.extendsClause != null && node.withClause != null) { |
| 4987 // We don't need to build any implicitly constructors for the mixin | 4899 // We don't need to build any implicitly constructors for the mixin |
| 4988 // application (since there isn't an explicit element for it), but we | 4900 // application (since there isn't an explicit element for it), but we |
| 4989 // need to verify that they _could_ be built. | 4901 // need to verify that they _could_ be built. |
| 4990 InterfaceType superclassType = null; | 4902 InterfaceType superclassType = null; |
| 4991 TypeName superclassName = node.extendsClause.superclass; | 4903 TypeName superclassName = node.extendsClause.superclass; |
| 4992 DartType type = superclassName.type; | 4904 DartType type = superclassName.type; |
| 4993 if (type is InterfaceType) { | 4905 if (type is InterfaceType) { |
| 4994 superclassType = type; | 4906 superclassType = type; |
| 4995 } else { | 4907 } else { |
| 4996 superclassType = typeProvider.objectType; | 4908 superclassType = typeProvider.objectType; |
| 4997 } | 4909 } |
| 4998 ClassElement superclassElement = classElement.supertype.element; | 4910 ClassElement superclassElement = classElement.supertype.element; |
| 4999 if (superclassElement != null) { | 4911 if (superclassElement != null) { |
| 5000 _callback(classElement, superclassElement, () { | 4912 _callback(classElement, superclassElement, () { |
| 5001 bool constructorFound = false; | 4913 bool constructorFound = false; |
| 5002 void callback(ConstructorElement explicitConstructor, | 4914 void callback(ConstructorElement explicitConstructor, |
| 5003 List<DartType> parameterTypes, List<DartType> argumentTypes) { | 4915 List<DartType> parameterTypes, List<DartType> argumentTypes) { |
| 5004 constructorFound = true; | 4916 constructorFound = true; |
| 5005 } | 4917 } |
| 5006 if (_findForwardedConstructors( | 4918 if (_findForwardedConstructors( |
| 5007 classElement, | 4919 classElement, superclassName, superclassType, callback) && |
| 5008 superclassName, | |
| 5009 superclassType, | |
| 5010 callback) && | |
| 5011 !constructorFound) { | 4920 !constructorFound) { |
| 5012 reportErrorForNode( | 4921 reportErrorForNode(CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, |
| 5013 CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, | 4922 node.withClause, [superclassType.element.name]); |
| 5014 node.withClause, | |
| 5015 [superclassType.element.name]); | |
| 5016 classElement.mixinErrorsReported = true; | 4923 classElement.mixinErrorsReported = true; |
| 5017 } | 4924 } |
| 5018 }); | 4925 }); |
| 5019 } | 4926 } |
| 5020 } | 4927 } |
| 5021 return null; | 4928 return null; |
| 5022 } | 4929 } |
| 5023 | 4930 |
| 5024 @override | 4931 @override |
| 5025 Object visitClassTypeAlias(ClassTypeAlias node) { | 4932 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 5026 super.visitClassTypeAlias(node); | 4933 super.visitClassTypeAlias(node); |
| 5027 InterfaceType superclassType = null; | 4934 InterfaceType superclassType = null; |
| 5028 TypeName superclassName = node.superclass; | 4935 TypeName superclassName = node.superclass; |
| 5029 DartType type = superclassName.type; | 4936 DartType type = superclassName.type; |
| 5030 if (type is InterfaceType) { | 4937 if (type is InterfaceType) { |
| 5031 superclassType = type; | 4938 superclassType = type; |
| 5032 } else { | 4939 } else { |
| 5033 superclassType = typeProvider.objectType; | 4940 superclassType = typeProvider.objectType; |
| 5034 } | 4941 } |
| 5035 ClassElementImpl classElement = node.element as ClassElementImpl; | 4942 ClassElementImpl classElement = node.element as ClassElementImpl; |
| 5036 if (classElement != null) { | 4943 if (classElement != null) { |
| 5037 ClassElement superclassElement = superclassType.element; | 4944 ClassElement superclassElement = superclassType.element; |
| 5038 if (superclassElement != null) { | 4945 if (superclassElement != null) { |
| 5039 _callback(classElement, superclassElement, () { | 4946 _callback(classElement, superclassElement, () { |
| 5040 List<ConstructorElement> implicitConstructors = | 4947 List<ConstructorElement> implicitConstructors = |
| 5041 new List<ConstructorElement>(); | 4948 new List<ConstructorElement>(); |
| 5042 void callback(ConstructorElement explicitConstructor, | 4949 void callback(ConstructorElement explicitConstructor, |
| 5043 List<DartType> parameterTypes, List<DartType> argumentTypes) { | 4950 List<DartType> parameterTypes, List<DartType> argumentTypes) { |
| 5044 implicitConstructors.add( | 4951 implicitConstructors.add(_createImplicitContructor( |
| 5045 _createImplicitContructor( | 4952 classElement.type, explicitConstructor, parameterTypes, |
| 5046 classElement.type, | 4953 argumentTypes)); |
| 5047 explicitConstructor, | |
| 5048 parameterTypes, | |
| 5049 argumentTypes)); | |
| 5050 } | 4954 } |
| 5051 if (_findForwardedConstructors( | 4955 if (_findForwardedConstructors( |
| 5052 classElement, | 4956 classElement, superclassName, superclassType, callback)) { |
| 5053 superclassName, | |
| 5054 superclassType, | |
| 5055 callback)) { | |
| 5056 if (implicitConstructors.isEmpty) { | 4957 if (implicitConstructors.isEmpty) { |
| 5057 reportErrorForNode( | 4958 reportErrorForNode(CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, |
| 5058 CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS, | 4959 node, [superclassElement.name]); |
| 5059 node, | |
| 5060 [superclassElement.name]); | |
| 5061 } else { | 4960 } else { |
| 5062 classElement.constructors = implicitConstructors; | 4961 classElement.constructors = implicitConstructors; |
| 5063 } | 4962 } |
| 5064 } | 4963 } |
| 5065 }); | 4964 }); |
| 5066 } | 4965 } |
| 5067 } | 4966 } |
| 5068 return null; | 4967 return null; |
| 5069 } | 4968 } |
| 5070 | 4969 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5126 * Find all the constructors that should be forwarded from the superclass | 5025 * Find all the constructors that should be forwarded from the superclass |
| 5127 * named [superclassName], having type [superclassType], to the class or | 5026 * named [superclassName], having type [superclassType], to the class or |
| 5128 * mixin application [classElement], and pass information about them to | 5027 * mixin application [classElement], and pass information about them to |
| 5129 * [callback]. | 5028 * [callback]. |
| 5130 * | 5029 * |
| 5131 * Return true if some constructors were considered. (A false return value | 5030 * Return true if some constructors were considered. (A false return value |
| 5132 * can only happen if the supeclass is a built-in type, in which case it | 5031 * can only happen if the supeclass is a built-in type, in which case it |
| 5133 * can't be used as a mixin anyway). | 5032 * can't be used as a mixin anyway). |
| 5134 */ | 5033 */ |
| 5135 bool _findForwardedConstructors(ClassElementImpl classElement, | 5034 bool _findForwardedConstructors(ClassElementImpl classElement, |
| 5136 TypeName superclassName, InterfaceType superclassType, void | 5035 TypeName superclassName, InterfaceType superclassType, void callback( |
| 5137 callback(ConstructorElement explicitConstructor, List<DartType> parameterT
ypes, | 5036 ConstructorElement explicitConstructor, List<DartType> parameterTypes, |
| 5138 List<DartType> argumentTypes)) { | 5037 List<DartType> argumentTypes)) { |
| 5139 ClassElement superclassElement = superclassType.element; | 5038 ClassElement superclassElement = superclassType.element; |
| 5140 List<ConstructorElement> constructors = superclassElement.constructors; | 5039 List<ConstructorElement> constructors = superclassElement.constructors; |
| 5141 int count = constructors.length; | 5040 int count = constructors.length; |
| 5142 if (count == 0) { | 5041 if (count == 0) { |
| 5143 return false; | 5042 return false; |
| 5144 } | 5043 } |
| 5145 List<DartType> parameterTypes = | 5044 List<DartType> parameterTypes = |
| 5146 TypeParameterTypeImpl.getTypes(superclassType.typeParameters); | 5045 TypeParameterTypeImpl.getTypes(superclassType.typeParameters); |
| 5147 List<DartType> argumentTypes = | 5046 List<DartType> argumentTypes = |
| 5148 _getArgumentTypes(superclassName.typeArguments, parameterTypes); | 5047 _getArgumentTypes(superclassName.typeArguments, parameterTypes); |
| 5149 for (int i = 0; i < count; i++) { | 5048 for (int i = 0; i < count; i++) { |
| 5150 ConstructorElement explicitConstructor = constructors[i]; | 5049 ConstructorElement explicitConstructor = constructors[i]; |
| 5151 if (!explicitConstructor.isFactory && | 5050 if (!explicitConstructor.isFactory && |
| 5152 classElement.isSuperConstructorAccessible(explicitConstructor)) { | 5051 classElement.isSuperConstructorAccessible(explicitConstructor)) { |
| 5153 callback(explicitConstructor, parameterTypes, argumentTypes); | 5052 callback(explicitConstructor, parameterTypes, argumentTypes); |
| 5154 } | 5053 } |
| 5155 } | 5054 } |
| 5156 return true; | 5055 return true; |
| 5157 } | 5056 } |
| 5158 | 5057 |
| 5159 /** | 5058 /** |
| 5160 * Return an array of argument types that corresponds to the array of paramete
r types and that are | 5059 * Return an array of argument types that corresponds to the array of paramete
r types and that are |
| 5161 * derived from the given list of type arguments. | 5060 * derived from the given list of type arguments. |
| 5162 * | 5061 * |
| 5163 * @param typeArguments the type arguments from which the types will be taken | 5062 * @param typeArguments the type arguments from which the types will be taken |
| 5164 * @param parameterTypes the parameter types that must be matched by the type
arguments | 5063 * @param parameterTypes the parameter types that must be matched by the type
arguments |
| 5165 * @return the argument types that correspond to the parameter types | 5064 * @return the argument types that correspond to the parameter types |
| 5166 */ | 5065 */ |
| 5167 List<DartType> _getArgumentTypes(TypeArgumentList typeArguments, | 5066 List<DartType> _getArgumentTypes( |
| 5168 List<DartType> parameterTypes) { | 5067 TypeArgumentList typeArguments, List<DartType> parameterTypes) { |
| 5169 DynamicTypeImpl dynamic = DynamicTypeImpl.instance; | 5068 DynamicTypeImpl dynamic = DynamicTypeImpl.instance; |
| 5170 int parameterCount = parameterTypes.length; | 5069 int parameterCount = parameterTypes.length; |
| 5171 List<DartType> types = new List<DartType>(parameterCount); | 5070 List<DartType> types = new List<DartType>(parameterCount); |
| 5172 if (typeArguments == null) { | 5071 if (typeArguments == null) { |
| 5173 for (int i = 0; i < parameterCount; i++) { | 5072 for (int i = 0; i < parameterCount; i++) { |
| 5174 types[i] = dynamic; | 5073 types[i] = dynamic; |
| 5175 } | 5074 } |
| 5176 } else { | 5075 } else { |
| 5177 NodeList<TypeName> arguments = typeArguments.arguments; | 5076 NodeList<TypeName> arguments = typeArguments.arguments; |
| 5178 int argumentCount = math.min(arguments.length, parameterCount); | 5077 int argumentCount = math.min(arguments.length, parameterCount); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5219 ImplicitConstructorComputer(this.typeProvider); | 5118 ImplicitConstructorComputer(this.typeProvider); |
| 5220 | 5119 |
| 5221 /** | 5120 /** |
| 5222 * Add the given [unit] to the list of units which need to have implicit | 5121 * Add the given [unit] to the list of units which need to have implicit |
| 5223 * constructors built for them. [source] is the source file corresponding to | 5122 * constructors built for them. [source] is the source file corresponding to |
| 5224 * the compilation unit, [libraryElement] is the library element containing | 5123 * the compilation unit, [libraryElement] is the library element containing |
| 5225 * that source, and [libraryScope] is the scope for the library element. | 5124 * that source, and [libraryScope] is the scope for the library element. |
| 5226 */ | 5125 */ |
| 5227 void add(CompilationUnit unit, Source source, LibraryElement libraryElement, | 5126 void add(CompilationUnit unit, Source source, LibraryElement libraryElement, |
| 5228 LibraryScope libraryScope) { | 5127 LibraryScope libraryScope) { |
| 5229 unit.accept( | 5128 unit.accept(new ImplicitConstructorBuilder( |
| 5230 new ImplicitConstructorBuilder( | 5129 source, libraryElement, libraryScope, typeProvider, _defer)); |
| 5231 source, | |
| 5232 libraryElement, | |
| 5233 libraryScope, | |
| 5234 typeProvider, | |
| 5235 _defer)); | |
| 5236 } | 5130 } |
| 5237 | 5131 |
| 5238 /** | 5132 /** |
| 5239 * Compute the implicit constructors for all compilation units that have been | 5133 * Compute the implicit constructors for all compilation units that have been |
| 5240 * passed to [add]. | 5134 * passed to [add]. |
| 5241 */ | 5135 */ |
| 5242 void compute() { | 5136 void compute() { |
| 5243 List<List<ClassElement>> topologicalSort = | 5137 List<List<ClassElement>> topologicalSort = |
| 5244 _dependencies.computeTopologicalSort(); | 5138 _dependencies.computeTopologicalSort(); |
| 5245 for (List<ClassElement> classesInCycle in topologicalSort) { | 5139 for (List<ClassElement> classesInCycle in topologicalSort) { |
| 5246 // Note: a cycle could occur if there is a loop in the inheritance graph. | 5140 // Note: a cycle could occur if there is a loop in the inheritance graph. |
| 5247 // Such loops are forbidden by Dart but could occur in the analysis of | 5141 // Such loops are forbidden by Dart but could occur in the analysis of |
| 5248 // incorrect code. If this happens, we simply visit the classes | 5142 // incorrect code. If this happens, we simply visit the classes |
| 5249 // constituting the loop in any order. | 5143 // constituting the loop in any order. |
| 5250 for (ClassElement classElement in classesInCycle) { | 5144 for (ClassElement classElement in classesInCycle) { |
| 5251 VoidFunction computation = _computations[classElement]; | 5145 VoidFunction computation = _computations[classElement]; |
| 5252 if (computation != null) { | 5146 if (computation != null) { |
| 5253 computation(); | 5147 computation(); |
| 5254 } | 5148 } |
| 5255 } | 5149 } |
| 5256 } | 5150 } |
| 5257 } | 5151 } |
| 5258 | 5152 |
| 5259 /** | 5153 /** |
| 5260 * Defer execution of [computation], which builds implicit constructors for | 5154 * Defer execution of [computation], which builds implicit constructors for |
| 5261 * [classElement], until after implicit constructors have been built for | 5155 * [classElement], until after implicit constructors have been built for |
| 5262 * [superclassElement]. | 5156 * [superclassElement]. |
| 5263 */ | 5157 */ |
| 5264 void _defer(ClassElement classElement, ClassElement superclassElement, void | 5158 void _defer(ClassElement classElement, ClassElement superclassElement, |
| 5265 computation()) { | 5159 void computation()) { |
| 5266 assert(!_computations.containsKey(classElement)); | 5160 assert(!_computations.containsKey(classElement)); |
| 5267 _computations[classElement] = computation; | 5161 _computations[classElement] = computation; |
| 5268 _dependencies.addEdge(classElement, superclassElement); | 5162 _dependencies.addEdge(classElement, superclassElement); |
| 5269 } | 5163 } |
| 5270 } | 5164 } |
| 5271 | 5165 |
| 5272 /** | 5166 /** |
| 5273 * Instances of the class `ImplicitLabelScope` represent the scope statements | 5167 * Instances of the class `ImplicitLabelScope` represent the scope statements |
| 5274 * that can be the target of unlabeled break and continue statements. | 5168 * that can be the target of unlabeled break and continue statements. |
| 5275 */ | 5169 */ |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5414 * Any time after the defining compilation unit has been visited by this visit
or, this method can | 5308 * Any time after the defining compilation unit has been visited by this visit
or, this method can |
| 5415 * be called to report an [HintCode.DUPLICATE_IMPORT] hint for each of the imp
ort directives | 5309 * be called to report an [HintCode.DUPLICATE_IMPORT] hint for each of the imp
ort directives |
| 5416 * in the [duplicateImports] list. | 5310 * in the [duplicateImports] list. |
| 5417 * | 5311 * |
| 5418 * @param errorReporter the error reporter to report the set of [HintCode.DUPL
ICATE_IMPORT] | 5312 * @param errorReporter the error reporter to report the set of [HintCode.DUPL
ICATE_IMPORT] |
| 5419 * hints to | 5313 * hints to |
| 5420 */ | 5314 */ |
| 5421 void generateDuplicateImportHints(ErrorReporter errorReporter) { | 5315 void generateDuplicateImportHints(ErrorReporter errorReporter) { |
| 5422 for (ImportDirective duplicateImport in _duplicateImports) { | 5316 for (ImportDirective duplicateImport in _duplicateImports) { |
| 5423 errorReporter.reportErrorForNode( | 5317 errorReporter.reportErrorForNode( |
| 5424 HintCode.DUPLICATE_IMPORT, | 5318 HintCode.DUPLICATE_IMPORT, duplicateImport.uri); |
| 5425 duplicateImport.uri); | |
| 5426 } | 5319 } |
| 5427 } | 5320 } |
| 5428 | 5321 |
| 5429 /** | 5322 /** |
| 5430 * After all of the compilation units have been visited by this visitor, this
method can be called | 5323 * After all of the compilation units have been visited by this visitor, this
method can be called |
| 5431 * to report an [HintCode.UNUSED_IMPORT] hint for each of the import directive
s in the | 5324 * to report an [HintCode.UNUSED_IMPORT] hint for each of the import directive
s in the |
| 5432 * [unusedImports] list. | 5325 * [unusedImports] list. |
| 5433 * | 5326 * |
| 5434 * @param errorReporter the error reporter to report the set of [HintCode.UNUS
ED_IMPORT] | 5327 * @param errorReporter the error reporter to report the set of [HintCode.UNUS
ED_IMPORT] |
| 5435 * hints to | 5328 * hints to |
| 5436 */ | 5329 */ |
| 5437 void generateUnusedImportHints(ErrorReporter errorReporter) { | 5330 void generateUnusedImportHints(ErrorReporter errorReporter) { |
| 5438 for (ImportDirective unusedImport in _unusedImports) { | 5331 for (ImportDirective unusedImport in _unusedImports) { |
| 5439 // Check that the import isn't dart:core | 5332 // Check that the import isn't dart:core |
| 5440 ImportElement importElement = unusedImport.element; | 5333 ImportElement importElement = unusedImport.element; |
| 5441 if (importElement != null) { | 5334 if (importElement != null) { |
| 5442 LibraryElement libraryElement = importElement.importedLibrary; | 5335 LibraryElement libraryElement = importElement.importedLibrary; |
| 5443 if (libraryElement != null && libraryElement.isDartCore) { | 5336 if (libraryElement != null && libraryElement.isDartCore) { |
| 5444 continue; | 5337 continue; |
| 5445 } | 5338 } |
| 5446 } | 5339 } |
| 5447 errorReporter.reportErrorForNode( | 5340 errorReporter.reportErrorForNode( |
| 5448 HintCode.UNUSED_IMPORT, | 5341 HintCode.UNUSED_IMPORT, unusedImport.uri); |
| 5449 unusedImport.uri); | |
| 5450 } | 5342 } |
| 5451 } | 5343 } |
| 5452 | 5344 |
| 5453 @override | 5345 @override |
| 5454 Object visitCompilationUnit(CompilationUnit node) { | 5346 Object visitCompilationUnit(CompilationUnit node) { |
| 5455 if (_inDefiningCompilationUnit) { | 5347 if (_inDefiningCompilationUnit) { |
| 5456 NodeList<Directive> directives = node.directives; | 5348 NodeList<Directive> directives = node.directives; |
| 5457 for (Directive directive in directives) { | 5349 for (Directive directive in directives) { |
| 5458 if (directive is ImportDirective) { | 5350 if (directive is ImportDirective) { |
| 5459 ImportDirective importDirective = directive; | 5351 ImportDirective importDirective = directive; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5482 } | 5374 } |
| 5483 // | 5375 // |
| 5484 // Initialize libraryMap: libraryElement -> importDirective | 5376 // Initialize libraryMap: libraryElement -> importDirective |
| 5485 // | 5377 // |
| 5486 _putIntoLibraryMap(libraryElement, importDirective); | 5378 _putIntoLibraryMap(libraryElement, importDirective); |
| 5487 // | 5379 // |
| 5488 // For this new addition to the libraryMap, also recursively add any | 5380 // For this new addition to the libraryMap, also recursively add any |
| 5489 // exports from the libraryElement. | 5381 // exports from the libraryElement. |
| 5490 // | 5382 // |
| 5491 _addAdditionalLibrariesForExports( | 5383 _addAdditionalLibrariesForExports( |
| 5492 libraryElement, | 5384 libraryElement, importDirective, new List<LibraryElement>()); |
| 5493 importDirective, | |
| 5494 new List<LibraryElement>()); | |
| 5495 } | 5385 } |
| 5496 } | 5386 } |
| 5497 } | 5387 } |
| 5498 } | 5388 } |
| 5499 // If there are no imports in this library, don't visit the identifiers in | 5389 // If there are no imports in this library, don't visit the identifiers in |
| 5500 // the library- there can be no unused imports. | 5390 // the library- there can be no unused imports. |
| 5501 if (_unusedImports.isEmpty) { | 5391 if (_unusedImports.isEmpty) { |
| 5502 return null; | 5392 return null; |
| 5503 } | 5393 } |
| 5504 if (_unusedImports.length > 1) { | 5394 if (_unusedImports.length > 1) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5581 */ | 5471 */ |
| 5582 void _addAdditionalLibrariesForExports(LibraryElement library, | 5472 void _addAdditionalLibrariesForExports(LibraryElement library, |
| 5583 ImportDirective importDirective, List<LibraryElement> exportPath) { | 5473 ImportDirective importDirective, List<LibraryElement> exportPath) { |
| 5584 if (exportPath.contains(library)) { | 5474 if (exportPath.contains(library)) { |
| 5585 return; | 5475 return; |
| 5586 } | 5476 } |
| 5587 exportPath.add(library); | 5477 exportPath.add(library); |
| 5588 for (LibraryElement exportedLibraryElt in library.exportedLibraries) { | 5478 for (LibraryElement exportedLibraryElt in library.exportedLibraries) { |
| 5589 _putIntoLibraryMap(exportedLibraryElt, importDirective); | 5479 _putIntoLibraryMap(exportedLibraryElt, importDirective); |
| 5590 _addAdditionalLibrariesForExports( | 5480 _addAdditionalLibrariesForExports( |
| 5591 exportedLibraryElt, | 5481 exportedLibraryElt, importDirective, exportPath); |
| 5592 importDirective, | |
| 5593 exportPath); | |
| 5594 } | 5482 } |
| 5595 } | 5483 } |
| 5596 | 5484 |
| 5597 /** | 5485 /** |
| 5598 * Lookup and return the [Namespace] from the [namespaceMap], if the map does
not | 5486 * Lookup and return the [Namespace] from the [namespaceMap], if the map does
not |
| 5599 * have the computed namespace, compute it and cache it in the map. If the imp
ort directive is not | 5487 * have the computed namespace, compute it and cache it in the map. If the imp
ort directive is not |
| 5600 * resolved or is not resolvable, `null` is returned. | 5488 * resolved or is not resolvable, `null` is returned. |
| 5601 * | 5489 * |
| 5602 * @param importDirective the import directive used to compute the returned na
mespace | 5490 * @param importDirective the import directive used to compute the returned na
mespace |
| 5603 * @return the computed or looked up [Namespace] | 5491 * @return the computed or looked up [Namespace] |
| (...skipping 12 matching lines...) Expand all Loading... |
| 5616 } | 5504 } |
| 5617 return namespace; | 5505 return namespace; |
| 5618 } | 5506 } |
| 5619 | 5507 |
| 5620 /** | 5508 /** |
| 5621 * The [libraryMap] is a mapping between a library elements and a list of impo
rt | 5509 * The [libraryMap] is a mapping between a library elements and a list of impo
rt |
| 5622 * directives, but when adding these mappings into the [libraryMap], this meth
od can be | 5510 * directives, but when adding these mappings into the [libraryMap], this meth
od can be |
| 5623 * used to simply add the mapping between the library element an an import dir
ective without | 5511 * used to simply add the mapping between the library element an an import dir
ective without |
| 5624 * needing to check to see if a list needs to be created. | 5512 * needing to check to see if a list needs to be created. |
| 5625 */ | 5513 */ |
| 5626 void _putIntoLibraryMap(LibraryElement libraryElement, | 5514 void _putIntoLibraryMap( |
| 5627 ImportDirective importDirective) { | 5515 LibraryElement libraryElement, ImportDirective importDirective) { |
| 5628 List<ImportDirective> importList = _libraryMap[libraryElement]; | 5516 List<ImportDirective> importList = _libraryMap[libraryElement]; |
| 5629 if (importList == null) { | 5517 if (importList == null) { |
| 5630 importList = new List<ImportDirective>(); | 5518 importList = new List<ImportDirective>(); |
| 5631 _libraryMap[libraryElement] = importList; | 5519 _libraryMap[libraryElement] = importList; |
| 5632 } | 5520 } |
| 5633 importList.add(importDirective); | 5521 importList.add(importDirective); |
| 5634 } | 5522 } |
| 5635 | 5523 |
| 5636 Object _visitIdentifier(Element element, String name) { | 5524 Object _visitIdentifier(Element element, String name) { |
| 5637 if (element == null) { | 5525 if (element == null) { |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5793 * Given some [ClassElement] and some member name, this returns the | 5681 * Given some [ClassElement] and some member name, this returns the |
| 5794 * [ExecutableElement] that the class inherits from the mixins, | 5682 * [ExecutableElement] that the class inherits from the mixins, |
| 5795 * superclasses or interfaces, that has the member name, if no member is inher
ited `null` is | 5683 * superclasses or interfaces, that has the member name, if no member is inher
ited `null` is |
| 5796 * returned. | 5684 * returned. |
| 5797 * | 5685 * |
| 5798 * @param classElt the class element to query | 5686 * @param classElt the class element to query |
| 5799 * @param memberName the name of the executable element to find and return | 5687 * @param memberName the name of the executable element to find and return |
| 5800 * @return the inherited executable element with the member name, or `null` if
no such | 5688 * @return the inherited executable element with the member name, or `null` if
no such |
| 5801 * member exists | 5689 * member exists |
| 5802 */ | 5690 */ |
| 5803 ExecutableElement lookupInheritance(ClassElement classElt, | 5691 ExecutableElement lookupInheritance( |
| 5804 String memberName) { | 5692 ClassElement classElt, String memberName) { |
| 5805 if (memberName == null || memberName.isEmpty) { | 5693 if (memberName == null || memberName.isEmpty) { |
| 5806 return null; | 5694 return null; |
| 5807 } | 5695 } |
| 5808 ExecutableElement executable = _computeClassChainLookupMap( | 5696 ExecutableElement executable = _computeClassChainLookupMap( |
| 5809 classElt, | 5697 classElt, new HashSet<ClassElement>()).get(memberName); |
| 5810 new HashSet<ClassElement>()).get(memberName); | |
| 5811 if (executable == null) { | 5698 if (executable == null) { |
| 5812 return _computeInterfaceLookupMap( | 5699 return _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>()) |
| 5813 classElt, | 5700 .get(memberName); |
| 5814 new HashSet<ClassElement>()).get(memberName); | |
| 5815 } | 5701 } |
| 5816 return executable; | 5702 return executable; |
| 5817 } | 5703 } |
| 5818 | 5704 |
| 5819 /** | 5705 /** |
| 5820 * Given some [ClassElement] and some member name, this returns the | 5706 * Given some [ClassElement] and some member name, this returns the |
| 5821 * [ExecutableElement] that the class either declares itself, or | 5707 * [ExecutableElement] that the class either declares itself, or |
| 5822 * inherits, that has the member name, if no member is inherited `null` is ret
urned. | 5708 * inherits, that has the member name, if no member is inherited `null` is ret
urned. |
| 5823 * | 5709 * |
| 5824 * @param classElt the class element to query | 5710 * @param classElt the class element to query |
| (...skipping 13 matching lines...) Expand all Loading... |
| 5838 * Given some [InterfaceType] and some member name, this returns the | 5724 * Given some [InterfaceType] and some member name, this returns the |
| 5839 * [FunctionType] of the [ExecutableElement] that the | 5725 * [FunctionType] of the [ExecutableElement] that the |
| 5840 * class either declares itself, or inherits, that has the member name, if no
member is inherited | 5726 * class either declares itself, or inherits, that has the member name, if no
member is inherited |
| 5841 * `null` is returned. The returned [FunctionType] has all type | 5727 * `null` is returned. The returned [FunctionType] has all type |
| 5842 * parameters substituted with corresponding type arguments from the given [In
terfaceType]. | 5728 * parameters substituted with corresponding type arguments from the given [In
terfaceType]. |
| 5843 * | 5729 * |
| 5844 * @param interfaceType the interface type to query | 5730 * @param interfaceType the interface type to query |
| 5845 * @param memberName the name of the executable element to find and return | 5731 * @param memberName the name of the executable element to find and return |
| 5846 * @return the member's function type, or `null` if no such member exists | 5732 * @return the member's function type, or `null` if no such member exists |
| 5847 */ | 5733 */ |
| 5848 FunctionType lookupMemberType(InterfaceType interfaceType, | 5734 FunctionType lookupMemberType( |
| 5849 String memberName) { | 5735 InterfaceType interfaceType, String memberName) { |
| 5850 ExecutableElement iteratorMember = | 5736 ExecutableElement iteratorMember = |
| 5851 lookupMember(interfaceType.element, memberName); | 5737 lookupMember(interfaceType.element, memberName); |
| 5852 if (iteratorMember == null) { | 5738 if (iteratorMember == null) { |
| 5853 return null; | 5739 return null; |
| 5854 } | 5740 } |
| 5855 return substituteTypeArgumentsInMemberFromInheritance( | 5741 return substituteTypeArgumentsInMemberFromInheritance( |
| 5856 iteratorMember.type, | 5742 iteratorMember.type, memberName, interfaceType); |
| 5857 memberName, | |
| 5858 interfaceType); | |
| 5859 } | 5743 } |
| 5860 | 5744 |
| 5861 /** | 5745 /** |
| 5862 * Determine the set of methods which is overridden by the given class member.
If no member is | 5746 * Determine the set of methods which is overridden by the given class member.
If no member is |
| 5863 * inherited, an empty list is returned. If one of the inherited members is a | 5747 * inherited, an empty list is returned. If one of the inherited members is a |
| 5864 * [MultiplyInheritedExecutableElement], then it is expanded into its constitu
ent inherited | 5748 * [MultiplyInheritedExecutableElement], then it is expanded into its constitu
ent inherited |
| 5865 * elements. | 5749 * elements. |
| 5866 * | 5750 * |
| 5867 * @param classElt the class to query | 5751 * @param classElt the class to query |
| 5868 * @param memberName the name of the class member to query | 5752 * @param memberName the name of the class member to query |
| 5869 * @return a list of overridden methods | 5753 * @return a list of overridden methods |
| 5870 */ | 5754 */ |
| 5871 List<ExecutableElement> lookupOverrides(ClassElement classElt, | 5755 List<ExecutableElement> lookupOverrides( |
| 5872 String memberName) { | 5756 ClassElement classElt, String memberName) { |
| 5873 List<ExecutableElement> result = new List<ExecutableElement>(); | 5757 List<ExecutableElement> result = new List<ExecutableElement>(); |
| 5874 if (memberName == null || memberName.isEmpty) { | 5758 if (memberName == null || memberName.isEmpty) { |
| 5875 return result; | 5759 return result; |
| 5876 } | 5760 } |
| 5877 List<MemberMap> interfaceMaps = | 5761 List<MemberMap> interfaceMaps = |
| 5878 _gatherInterfaceLookupMaps(classElt, new HashSet<ClassElement>()); | 5762 _gatherInterfaceLookupMaps(classElt, new HashSet<ClassElement>()); |
| 5879 if (interfaceMaps != null) { | 5763 if (interfaceMaps != null) { |
| 5880 for (MemberMap interfaceMap in interfaceMaps) { | 5764 for (MemberMap interfaceMap in interfaceMaps) { |
| 5881 ExecutableElement overriddenElement = interfaceMap.get(memberName); | 5765 ExecutableElement overriddenElement = interfaceMap.get(memberName); |
| 5882 if (overriddenElement != null) { | 5766 if (overriddenElement != null) { |
| 5883 if (overriddenElement is MultiplyInheritedExecutableElement) { | 5767 if (overriddenElement is MultiplyInheritedExecutableElement) { |
| 5884 MultiplyInheritedExecutableElement multiplyInheritedElement = | 5768 MultiplyInheritedExecutableElement multiplyInheritedElement = |
| 5885 overriddenElement; | 5769 overriddenElement; |
| 5886 for (ExecutableElement element in | 5770 for (ExecutableElement element |
| 5887 multiplyInheritedElement.inheritedElements) { | 5771 in multiplyInheritedElement.inheritedElements) { |
| 5888 result.add(element); | 5772 result.add(element); |
| 5889 } | 5773 } |
| 5890 } else { | 5774 } else { |
| 5891 result.add(overriddenElement); | 5775 result.add(overriddenElement); |
| 5892 } | 5776 } |
| 5893 } | 5777 } |
| 5894 } | 5778 } |
| 5895 } | 5779 } |
| 5896 return result; | 5780 return result; |
| 5897 } | 5781 } |
| 5898 | 5782 |
| 5899 /** | 5783 /** |
| 5900 * This method takes some inherited [FunctionType], and resolves all the param
eterized types | 5784 * This method takes some inherited [FunctionType], and resolves all the param
eterized types |
| 5901 * in the function type, dependent on the class in which it is being overridde
n. | 5785 * in the function type, dependent on the class in which it is being overridde
n. |
| 5902 * | 5786 * |
| 5903 * @param baseFunctionType the function type that is being overridden | 5787 * @param baseFunctionType the function type that is being overridden |
| 5904 * @param memberName the name of the member, this is used to lookup the inheri
tance path of the | 5788 * @param memberName the name of the member, this is used to lookup the inheri
tance path of the |
| 5905 * override | 5789 * override |
| 5906 * @param definingType the type that is overriding the member | 5790 * @param definingType the type that is overriding the member |
| 5907 * @return the passed function type with any parameterized types substituted | 5791 * @return the passed function type with any parameterized types substituted |
| 5908 */ | 5792 */ |
| 5909 FunctionType | 5793 FunctionType substituteTypeArgumentsInMemberFromInheritance( |
| 5910 substituteTypeArgumentsInMemberFromInheritance(FunctionType baseFunctionTy
pe, | 5794 FunctionType baseFunctionType, String memberName, |
| 5911 String memberName, InterfaceType definingType) { | 5795 InterfaceType definingType) { |
| 5912 // if the baseFunctionType is null, or does not have any parameters, | 5796 // if the baseFunctionType is null, or does not have any parameters, |
| 5913 // return it. | 5797 // return it. |
| 5914 if (baseFunctionType == null || | 5798 if (baseFunctionType == null || |
| 5915 baseFunctionType.typeArguments.length == 0) { | 5799 baseFunctionType.typeArguments.length == 0) { |
| 5916 return baseFunctionType; | 5800 return baseFunctionType; |
| 5917 } | 5801 } |
| 5918 // First, generate the path from the defining type to the overridden member | 5802 // First, generate the path from the defining type to the overridden member |
| 5919 Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>(); | 5803 Queue<InterfaceType> inheritancePath = new Queue<InterfaceType>(); |
| 5920 _computeInheritancePath(inheritancePath, definingType, memberName); | 5804 _computeInheritancePath(inheritancePath, definingType, memberName); |
| 5921 if (inheritancePath == null || inheritancePath.isEmpty) { | 5805 if (inheritancePath == null || inheritancePath.isEmpty) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 5938 * Compute and return a mapping between the set of all string names of the mem
bers inherited from | 5822 * Compute and return a mapping between the set of all string names of the mem
bers inherited from |
| 5939 * the passed [ClassElement] superclass hierarchy, and the associated | 5823 * the passed [ClassElement] superclass hierarchy, and the associated |
| 5940 * [ExecutableElement]. | 5824 * [ExecutableElement]. |
| 5941 * | 5825 * |
| 5942 * @param classElt the class element to query | 5826 * @param classElt the class element to query |
| 5943 * @param visitedClasses a set of visited classes passed back into this method
when it calls | 5827 * @param visitedClasses a set of visited classes passed back into this method
when it calls |
| 5944 * itself recursively | 5828 * itself recursively |
| 5945 * @return a mapping between the set of all string names of the members inheri
ted from the passed | 5829 * @return a mapping between the set of all string names of the members inheri
ted from the passed |
| 5946 * [ClassElement] superclass hierarchy, and the associated [Executable
Element] | 5830 * [ClassElement] superclass hierarchy, and the associated [Executable
Element] |
| 5947 */ | 5831 */ |
| 5948 MemberMap _computeClassChainLookupMap(ClassElement classElt, | 5832 MemberMap _computeClassChainLookupMap( |
| 5949 HashSet<ClassElement> visitedClasses) { | 5833 ClassElement classElt, HashSet<ClassElement> visitedClasses) { |
| 5950 MemberMap resultMap = _classLookup[classElt]; | 5834 MemberMap resultMap = _classLookup[classElt]; |
| 5951 if (resultMap != null) { | 5835 if (resultMap != null) { |
| 5952 return resultMap; | 5836 return resultMap; |
| 5953 } else { | 5837 } else { |
| 5954 resultMap = new MemberMap(); | 5838 resultMap = new MemberMap(); |
| 5955 } | 5839 } |
| 5956 ClassElement superclassElt = null; | 5840 ClassElement superclassElt = null; |
| 5957 InterfaceType supertype = classElt.supertype; | 5841 InterfaceType supertype = classElt.supertype; |
| 5958 if (supertype != null) { | 5842 if (supertype != null) { |
| 5959 superclassElt = supertype.element; | 5843 superclassElt = supertype.element; |
| 5960 } else { | 5844 } else { |
| 5961 // classElt is Object | 5845 // classElt is Object |
| 5962 _classLookup[classElt] = resultMap; | 5846 _classLookup[classElt] = resultMap; |
| 5963 return resultMap; | 5847 return resultMap; |
| 5964 } | 5848 } |
| 5965 if (superclassElt != null) { | 5849 if (superclassElt != null) { |
| 5966 if (!visitedClasses.contains(superclassElt)) { | 5850 if (!visitedClasses.contains(superclassElt)) { |
| 5967 visitedClasses.add(superclassElt); | 5851 visitedClasses.add(superclassElt); |
| 5968 try { | 5852 try { |
| 5969 resultMap = | 5853 resultMap = new MemberMap.con2( |
| 5970 new MemberMap.con2(_computeClassChainLookupMap(superclassElt, visi
tedClasses)); | 5854 _computeClassChainLookupMap(superclassElt, visitedClasses)); |
| 5971 // | 5855 // |
| 5972 // Substitute the super types down the hierarchy. | 5856 // Substitute the super types down the hierarchy. |
| 5973 // | 5857 // |
| 5974 _substituteTypeParametersDownHierarchy(supertype, resultMap); | 5858 _substituteTypeParametersDownHierarchy(supertype, resultMap); |
| 5975 // | 5859 // |
| 5976 // Include the members from the superclass in the resultMap. | 5860 // Include the members from the superclass in the resultMap. |
| 5977 // | 5861 // |
| 5978 _recordMapWithClassMembers(resultMap, supertype, false); | 5862 _recordMapWithClassMembers(resultMap, supertype, false); |
| 5979 } finally { | 5863 } finally { |
| 5980 visitedClasses.remove(superclassElt); | 5864 visitedClasses.remove(superclassElt); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5992 // multiple mixins, visit them in the order listed so that methods in later | 5876 // multiple mixins, visit them in the order listed so that methods in later |
| 5993 // mixins will overwrite identically-named methods in earlier mixins. | 5877 // mixins will overwrite identically-named methods in earlier mixins. |
| 5994 // | 5878 // |
| 5995 List<InterfaceType> mixins = classElt.mixins; | 5879 List<InterfaceType> mixins = classElt.mixins; |
| 5996 for (InterfaceType mixin in mixins) { | 5880 for (InterfaceType mixin in mixins) { |
| 5997 ClassElement mixinElement = mixin.element; | 5881 ClassElement mixinElement = mixin.element; |
| 5998 if (mixinElement != null) { | 5882 if (mixinElement != null) { |
| 5999 if (!visitedClasses.contains(mixinElement)) { | 5883 if (!visitedClasses.contains(mixinElement)) { |
| 6000 visitedClasses.add(mixinElement); | 5884 visitedClasses.add(mixinElement); |
| 6001 try { | 5885 try { |
| 6002 MemberMap map = | 5886 MemberMap map = new MemberMap.con2( |
| 6003 new MemberMap.con2(_computeClassChainLookupMap(mixinElement, vis
itedClasses)); | 5887 _computeClassChainLookupMap(mixinElement, visitedClasses)); |
| 6004 // | 5888 // |
| 6005 // Substitute the super types down the hierarchy. | 5889 // Substitute the super types down the hierarchy. |
| 6006 // | 5890 // |
| 6007 _substituteTypeParametersDownHierarchy(mixin, map); | 5891 _substituteTypeParametersDownHierarchy(mixin, map); |
| 6008 // | 5892 // |
| 6009 // Include the members from the superclass in the resultMap. | 5893 // Include the members from the superclass in the resultMap. |
| 6010 // | 5894 // |
| 6011 _recordMapWithClassMembers(map, mixin, false); | 5895 _recordMapWithClassMembers(map, mixin, false); |
| 6012 // | 5896 // |
| 6013 // Add the members from map into result map. | 5897 // Add the members from map into result map. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6106 * Compute and return a mapping between the set of all string names of the mem
bers inherited from | 5990 * Compute and return a mapping between the set of all string names of the mem
bers inherited from |
| 6107 * the passed [ClassElement] interface hierarchy, and the associated | 5991 * the passed [ClassElement] interface hierarchy, and the associated |
| 6108 * [ExecutableElement]. | 5992 * [ExecutableElement]. |
| 6109 * | 5993 * |
| 6110 * @param classElt the class element to query | 5994 * @param classElt the class element to query |
| 6111 * @param visitedInterfaces a set of visited classes passed back into this met
hod when it calls | 5995 * @param visitedInterfaces a set of visited classes passed back into this met
hod when it calls |
| 6112 * itself recursively | 5996 * itself recursively |
| 6113 * @return a mapping between the set of all string names of the members inheri
ted from the passed | 5997 * @return a mapping between the set of all string names of the members inheri
ted from the passed |
| 6114 * [ClassElement] interface hierarchy, and the associated [ExecutableE
lement] | 5998 * [ClassElement] interface hierarchy, and the associated [ExecutableE
lement] |
| 6115 */ | 5999 */ |
| 6116 MemberMap _computeInterfaceLookupMap(ClassElement classElt, | 6000 MemberMap _computeInterfaceLookupMap( |
| 6117 HashSet<ClassElement> visitedInterfaces) { | 6001 ClassElement classElt, HashSet<ClassElement> visitedInterfaces) { |
| 6118 MemberMap resultMap = _interfaceLookup[classElt]; | 6002 MemberMap resultMap = _interfaceLookup[classElt]; |
| 6119 if (resultMap != null) { | 6003 if (resultMap != null) { |
| 6120 return resultMap; | 6004 return resultMap; |
| 6121 } | 6005 } |
| 6122 List<MemberMap> lookupMaps = | 6006 List<MemberMap> lookupMaps = |
| 6123 _gatherInterfaceLookupMaps(classElt, visitedInterfaces); | 6007 _gatherInterfaceLookupMaps(classElt, visitedInterfaces); |
| 6124 if (lookupMaps == null) { | 6008 if (lookupMaps == null) { |
| 6125 resultMap = new MemberMap(); | 6009 resultMap = new MemberMap(); |
| 6126 } else { | 6010 } else { |
| 6127 HashMap<String, List<ExecutableElement>> unionMap = | 6011 HashMap<String, List<ExecutableElement>> unionMap = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 6139 * returned by [computeInterfaceLookupMap] for the corresponding super, except
with type | 6023 * returned by [computeInterfaceLookupMap] for the corresponding super, except
with type |
| 6140 * parameters appropriately substituted. | 6024 * parameters appropriately substituted. |
| 6141 * | 6025 * |
| 6142 * @param classElt the class element to query | 6026 * @param classElt the class element to query |
| 6143 * @param visitedInterfaces a set of visited classes passed back into this met
hod when it calls | 6027 * @param visitedInterfaces a set of visited classes passed back into this met
hod when it calls |
| 6144 * itself recursively | 6028 * itself recursively |
| 6145 * @return `null` if there was a problem (such as a loop in the class hierarch
y) or if there | 6029 * @return `null` if there was a problem (such as a loop in the class hierarch
y) or if there |
| 6146 * are no classes above this one in the class hierarchy. Otherwise, a
list of interface | 6030 * are no classes above this one in the class hierarchy. Otherwise, a
list of interface |
| 6147 * lookup maps. | 6031 * lookup maps. |
| 6148 */ | 6032 */ |
| 6149 List<MemberMap> _gatherInterfaceLookupMaps(ClassElement classElt, | 6033 List<MemberMap> _gatherInterfaceLookupMaps( |
| 6150 HashSet<ClassElement> visitedInterfaces) { | 6034 ClassElement classElt, HashSet<ClassElement> visitedInterfaces) { |
| 6151 InterfaceType supertype = classElt.supertype; | 6035 InterfaceType supertype = classElt.supertype; |
| 6152 ClassElement superclassElement = | 6036 ClassElement superclassElement = |
| 6153 supertype != null ? supertype.element : null; | 6037 supertype != null ? supertype.element : null; |
| 6154 List<InterfaceType> mixins = classElt.mixins; | 6038 List<InterfaceType> mixins = classElt.mixins; |
| 6155 List<InterfaceType> interfaces = classElt.interfaces; | 6039 List<InterfaceType> interfaces = classElt.interfaces; |
| 6156 // Recursively collect the list of mappings from all of the interface types | 6040 // Recursively collect the list of mappings from all of the interface types |
| 6157 List<MemberMap> lookupMaps = new List<MemberMap>(); | 6041 List<MemberMap> lookupMaps = new List<MemberMap>(); |
| 6158 // | 6042 // |
| 6159 // Superclass element | 6043 // Superclass element |
| 6160 // | 6044 // |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6257 | 6141 |
| 6258 /** | 6142 /** |
| 6259 * Given some [ClassElement], this method finds and returns the [ExecutableEle
ment] of | 6143 * Given some [ClassElement], this method finds and returns the [ExecutableEle
ment] of |
| 6260 * the passed name in the class element. Static members, members in super type
s and members not | 6144 * the passed name in the class element. Static members, members in super type
s and members not |
| 6261 * accessible from the current library are not considered. | 6145 * accessible from the current library are not considered. |
| 6262 * | 6146 * |
| 6263 * @param classElt the class element to query | 6147 * @param classElt the class element to query |
| 6264 * @param memberName the name of the member to lookup in the class | 6148 * @param memberName the name of the member to lookup in the class |
| 6265 * @return the found [ExecutableElement], or `null` if no such member was foun
d | 6149 * @return the found [ExecutableElement], or `null` if no such member was foun
d |
| 6266 */ | 6150 */ |
| 6267 ExecutableElement _lookupMemberInClass(ClassElement classElt, | 6151 ExecutableElement _lookupMemberInClass( |
| 6268 String memberName) { | 6152 ClassElement classElt, String memberName) { |
| 6269 List<MethodElement> methods = classElt.methods; | 6153 List<MethodElement> methods = classElt.methods; |
| 6270 for (MethodElement method in methods) { | 6154 for (MethodElement method in methods) { |
| 6271 if (memberName == method.name && | 6155 if (memberName == method.name && |
| 6272 method.isAccessibleIn(_library) && | 6156 method.isAccessibleIn(_library) && |
| 6273 !method.isStatic) { | 6157 !method.isStatic) { |
| 6274 return method; | 6158 return method; |
| 6275 } | 6159 } |
| 6276 } | 6160 } |
| 6277 List<PropertyAccessorElement> accessors = classElt.accessors; | 6161 List<PropertyAccessorElement> accessors = classElt.accessors; |
| 6278 for (PropertyAccessorElement accessor in accessors) { | 6162 for (PropertyAccessorElement accessor in accessors) { |
| 6279 if (memberName == accessor.name && | 6163 if (memberName == accessor.name && |
| 6280 accessor.isAccessibleIn(_library) && | 6164 accessor.isAccessibleIn(_library) && |
| 6281 !accessor.isStatic) { | 6165 !accessor.isStatic) { |
| 6282 return accessor; | 6166 return accessor; |
| 6283 } | 6167 } |
| 6284 } | 6168 } |
| 6285 return null; | 6169 return null; |
| 6286 } | 6170 } |
| 6287 | 6171 |
| 6288 /** | 6172 /** |
| 6289 * Record the passed map with the set of all members (methods, getters and set
ters) in the type | 6173 * Record the passed map with the set of all members (methods, getters and set
ters) in the type |
| 6290 * into the passed map. | 6174 * into the passed map. |
| 6291 * | 6175 * |
| 6292 * @param map some non-`null` map to put the methods and accessors from the pa
ssed | 6176 * @param map some non-`null` map to put the methods and accessors from the pa
ssed |
| 6293 * [ClassElement] into | 6177 * [ClassElement] into |
| 6294 * @param type the type that will be recorded into the passed map | 6178 * @param type the type that will be recorded into the passed map |
| 6295 * @param doIncludeAbstract `true` if abstract members will be put into the ma
p | 6179 * @param doIncludeAbstract `true` if abstract members will be put into the ma
p |
| 6296 */ | 6180 */ |
| 6297 void _recordMapWithClassMembers(MemberMap map, InterfaceType type, | 6181 void _recordMapWithClassMembers( |
| 6298 bool doIncludeAbstract) { | 6182 MemberMap map, InterfaceType type, bool doIncludeAbstract) { |
| 6299 List<MethodElement> methods = type.methods; | 6183 List<MethodElement> methods = type.methods; |
| 6300 for (MethodElement method in methods) { | 6184 for (MethodElement method in methods) { |
| 6301 if (method.isAccessibleIn(_library) && | 6185 if (method.isAccessibleIn(_library) && |
| 6302 !method.isStatic && | 6186 !method.isStatic && |
| 6303 (doIncludeAbstract || !method.isAbstract)) { | 6187 (doIncludeAbstract || !method.isAbstract)) { |
| 6304 map.put(method.name, method); | 6188 map.put(method.name, method); |
| 6305 } | 6189 } |
| 6306 } | 6190 } |
| 6307 List<PropertyAccessorElement> accessors = type.accessors; | 6191 List<PropertyAccessorElement> accessors = type.accessors; |
| 6308 for (PropertyAccessorElement accessor in accessors) { | 6192 for (PropertyAccessorElement accessor in accessors) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 6325 * @param errorCode the error code to be associated with this error | 6209 * @param errorCode the error code to be associated with this error |
| 6326 * @param arguments the arguments used to build the error message | 6210 * @param arguments the arguments used to build the error message |
| 6327 */ | 6211 */ |
| 6328 void _reportError(ClassElement classElt, int offset, int length, | 6212 void _reportError(ClassElement classElt, int offset, int length, |
| 6329 ErrorCode errorCode, List<Object> arguments) { | 6213 ErrorCode errorCode, List<Object> arguments) { |
| 6330 HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt]; | 6214 HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt]; |
| 6331 if (errorSet == null) { | 6215 if (errorSet == null) { |
| 6332 errorSet = new HashSet<AnalysisError>(); | 6216 errorSet = new HashSet<AnalysisError>(); |
| 6333 _errorsInClassElement[classElt] = errorSet; | 6217 _errorsInClassElement[classElt] = errorSet; |
| 6334 } | 6218 } |
| 6335 errorSet.add( | 6219 errorSet.add(new AnalysisError.con2( |
| 6336 new AnalysisError.con2(classElt.source, offset, length, errorCode, argum
ents)); | 6220 classElt.source, offset, length, errorCode, arguments)); |
| 6337 } | 6221 } |
| 6338 | 6222 |
| 6339 /** | 6223 /** |
| 6340 * Given the set of methods defined by classes above [classElt] in the class h
ierarchy, | 6224 * Given the set of methods defined by classes above [classElt] in the class h
ierarchy, |
| 6341 * apply the appropriate inheritance rules to determine those methods inherite
d by or overridden | 6225 * apply the appropriate inheritance rules to determine those methods inherite
d by or overridden |
| 6342 * by [classElt]. Also report static warnings | 6226 * by [classElt]. Also report static warnings |
| 6343 * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and | 6227 * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and |
| 6344 * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if ap
propriate. | 6228 * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if ap
propriate. |
| 6345 * | 6229 * |
| 6346 * @param classElt the class element to query. | 6230 * @param classElt the class element to query. |
| 6347 * @param unionMap a mapping from method name to the set of unique (in terms o
f signature) methods | 6231 * @param unionMap a mapping from method name to the set of unique (in terms o
f signature) methods |
| 6348 * defined in superclasses of [classElt]. | 6232 * defined in superclasses of [classElt]. |
| 6349 * @return the inheritance lookup map for [classElt]. | 6233 * @return the inheritance lookup map for [classElt]. |
| 6350 */ | 6234 */ |
| 6351 MemberMap _resolveInheritanceLookup(ClassElement classElt, HashMap<String, | 6235 MemberMap _resolveInheritanceLookup(ClassElement classElt, |
| 6352 List<ExecutableElement>> unionMap) { | 6236 HashMap<String, List<ExecutableElement>> unionMap) { |
| 6353 MemberMap resultMap = new MemberMap(); | 6237 MemberMap resultMap = new MemberMap(); |
| 6354 unionMap.forEach((String key, List<ExecutableElement> list) { | 6238 unionMap.forEach((String key, List<ExecutableElement> list) { |
| 6355 int numOfEltsWithMatchingNames = list.length; | 6239 int numOfEltsWithMatchingNames = list.length; |
| 6356 if (numOfEltsWithMatchingNames == 1) { | 6240 if (numOfEltsWithMatchingNames == 1) { |
| 6357 // | 6241 // |
| 6358 // Example: class A inherits only 1 method named 'm'. | 6242 // Example: class A inherits only 1 method named 'm'. |
| 6359 // Since it is the only such method, it is inherited. | 6243 // Since it is the only such method, it is inherited. |
| 6360 // Another example: class A inherits 2 methods named 'm' from 2 | 6244 // Another example: class A inherits 2 methods named 'm' from 2 |
| 6361 // different interfaces, but they both have the same signature, so it is | 6245 // different interfaces, but they both have the same signature, so it is |
| 6362 // the method inherited. | 6246 // the method inherited. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6397 for (int i = 0; i < numOfEltsWithMatchingNames; i++) { | 6281 for (int i = 0; i < numOfEltsWithMatchingNames; i++) { |
| 6398 executableElementTypes[i] = elements[i].type; | 6282 executableElementTypes[i] = elements[i].type; |
| 6399 } | 6283 } |
| 6400 List<int> subtypesOfAllOtherTypesIndexes = new List<int>(); | 6284 List<int> subtypesOfAllOtherTypesIndexes = new List<int>(); |
| 6401 for (int i = 0; i < numOfEltsWithMatchingNames; i++) { | 6285 for (int i = 0; i < numOfEltsWithMatchingNames; i++) { |
| 6402 FunctionType subtype = executableElementTypes[i]; | 6286 FunctionType subtype = executableElementTypes[i]; |
| 6403 if (subtype == null) { | 6287 if (subtype == null) { |
| 6404 continue; | 6288 continue; |
| 6405 } | 6289 } |
| 6406 bool subtypeOfAllTypes = true; | 6290 bool subtypeOfAllTypes = true; |
| 6407 for (int j = | 6291 for (int j = 0; |
| 6408 0; j < numOfEltsWithMatchingNames && subtypeOfAllTypes; j++) { | 6292 j < numOfEltsWithMatchingNames && subtypeOfAllTypes; |
| 6293 j++) { |
| 6409 if (i != j) { | 6294 if (i != j) { |
| 6410 if (!subtype.isSubtypeOf(executableElementTypes[j])) { | 6295 if (!subtype.isSubtypeOf(executableElementTypes[j])) { |
| 6411 subtypeOfAllTypes = false; | 6296 subtypeOfAllTypes = false; |
| 6412 break; | 6297 break; |
| 6413 } | 6298 } |
| 6414 } | 6299 } |
| 6415 } | 6300 } |
| 6416 if (subtypeOfAllTypes) { | 6301 if (subtypeOfAllTypes) { |
| 6417 subtypesOfAllOtherTypesIndexes.add(i); | 6302 subtypesOfAllOtherTypesIndexes.add(i); |
| 6418 } | 6303 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6451 } | 6336 } |
| 6452 // | 6337 // |
| 6453 // Example: class A inherited only 2 method named 'm'. | 6338 // Example: class A inherited only 2 method named 'm'. |
| 6454 // One has the function type '() -> int' and one has the function | 6339 // One has the function type '() -> int' and one has the function |
| 6455 // type '() -> String'. Since neither is a subtype of the other, | 6340 // type '() -> String'. Since neither is a subtype of the other, |
| 6456 // we create a warning, and have this class inherit nothing. | 6341 // we create a warning, and have this class inherit nothing. |
| 6457 // | 6342 // |
| 6458 if (!classHasMember) { | 6343 if (!classHasMember) { |
| 6459 String firstTwoFuntionTypesStr = | 6344 String firstTwoFuntionTypesStr = |
| 6460 "${executableElementTypes[0]}, ${executableElementTypes[1]}"
; | 6345 "${executableElementTypes[0]}, ${executableElementTypes[1]}"
; |
| 6461 _reportError( | 6346 _reportError(classElt, classElt.nameOffset, |
| 6462 classElt, | |
| 6463 classElt.nameOffset, | |
| 6464 classElt.displayName.length, | 6347 classElt.displayName.length, |
| 6465 StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, | 6348 StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE, [ |
| 6466 [key, firstTwoFuntionTypesStr]); | 6349 key, |
| 6350 firstTwoFuntionTypesStr |
| 6351 ]); |
| 6467 } | 6352 } |
| 6468 } else { | 6353 } else { |
| 6469 // | 6354 // |
| 6470 // Example: class A inherits 2 methods named 'm'. | 6355 // Example: class A inherits 2 methods named 'm'. |
| 6471 // One has the function type '(int) -> dynamic' and one has the | 6356 // One has the function type '(int) -> dynamic' and one has the |
| 6472 // function type '(num) -> dynamic'. Since they are both a subtype | 6357 // function type '(num) -> dynamic'. Since they are both a subtype |
| 6473 // of the other, a synthetic function '(dynamic) -> dynamic' is | 6358 // of the other, a synthetic function '(dynamic) -> dynamic' is |
| 6474 // inherited. | 6359 // inherited. |
| 6475 // Tests: test_getMapOfMembersInheritedFromInterfaces_ | 6360 // Tests: test_getMapOfMembersInheritedFromInterfaces_ |
| 6476 // union_multipleSubtypes_* | 6361 // union_multipleSubtypes_* |
| 6477 // | 6362 // |
| 6478 List<ExecutableElement> elementArrayToMerge = | 6363 List<ExecutableElement> elementArrayToMerge = |
| 6479 new List<ExecutableElement>(subtypesOfAllOtherTypesIndexes.len
gth); | 6364 new List<ExecutableElement>( |
| 6365 subtypesOfAllOtherTypesIndexes.length); |
| 6480 for (int i = 0; i < elementArrayToMerge.length; i++) { | 6366 for (int i = 0; i < elementArrayToMerge.length; i++) { |
| 6481 elementArrayToMerge[i] = | 6367 elementArrayToMerge[i] = |
| 6482 elements[subtypesOfAllOtherTypesIndexes[i]]; | 6368 elements[subtypesOfAllOtherTypesIndexes[i]]; |
| 6483 } | 6369 } |
| 6484 ExecutableElement mergedExecutableElement = | 6370 ExecutableElement mergedExecutableElement = |
| 6485 _computeMergedExecutableElement(elementArrayToMerge); | 6371 _computeMergedExecutableElement(elementArrayToMerge); |
| 6486 resultMap.put(key, mergedExecutableElement); | 6372 resultMap.put(key, mergedExecutableElement); |
| 6487 } | 6373 } |
| 6488 } | 6374 } |
| 6489 } else { | 6375 } else { |
| 6490 _reportError( | 6376 _reportError(classElt, classElt.nameOffset, |
| 6491 classElt, | |
| 6492 classElt.nameOffset, | |
| 6493 classElt.displayName.length, | 6377 classElt.displayName.length, |
| 6494 StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHO
D, | 6378 StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHO
D, |
| 6495 [key]); | 6379 [key]); |
| 6496 } | 6380 } |
| 6497 } | 6381 } |
| 6498 }); | 6382 }); |
| 6499 return resultMap; | 6383 return resultMap; |
| 6500 } | 6384 } |
| 6501 | 6385 |
| 6502 /** | 6386 /** |
| 6503 * Loop through all of the members in some [MemberMap], performing type parame
ter | 6387 * Loop through all of the members in some [MemberMap], performing type parame
ter |
| 6504 * substitutions using a passed supertype. | 6388 * substitutions using a passed supertype. |
| 6505 * | 6389 * |
| 6506 * @param superType the supertype to substitute into the members of the [Membe
rMap] | 6390 * @param superType the supertype to substitute into the members of the [Membe
rMap] |
| 6507 * @param map the MemberMap to perform the substitutions on | 6391 * @param map the MemberMap to perform the substitutions on |
| 6508 */ | 6392 */ |
| 6509 void _substituteTypeParametersDownHierarchy(InterfaceType superType, | 6393 void _substituteTypeParametersDownHierarchy( |
| 6510 MemberMap map) { | 6394 InterfaceType superType, MemberMap map) { |
| 6511 for (int i = 0; i < map.size; i++) { | 6395 for (int i = 0; i < map.size; i++) { |
| 6512 ExecutableElement executableElement = map.getValue(i); | 6396 ExecutableElement executableElement = map.getValue(i); |
| 6513 if (executableElement is MethodMember) { | 6397 if (executableElement is MethodMember) { |
| 6514 executableElement = | 6398 executableElement = |
| 6515 MethodMember.from(executableElement as MethodMember, superType); | 6399 MethodMember.from(executableElement as MethodMember, superType); |
| 6516 map.setValue(i, executableElement); | 6400 map.setValue(i, executableElement); |
| 6517 } else if (executableElement is PropertyAccessorMember) { | 6401 } else if (executableElement is PropertyAccessorMember) { |
| 6518 executableElement = PropertyAccessorMember.from( | 6402 executableElement = PropertyAccessorMember.from( |
| 6519 executableElement as PropertyAccessorMember, | 6403 executableElement as PropertyAccessorMember, superType); |
| 6520 superType); | |
| 6521 map.setValue(i, executableElement); | 6404 map.setValue(i, executableElement); |
| 6522 } | 6405 } |
| 6523 } | 6406 } |
| 6524 } | 6407 } |
| 6525 | 6408 |
| 6526 /** | 6409 /** |
| 6527 * Union all of the [lookupMaps] together into a single map, grouping the Exec
utableElements | 6410 * Union all of the [lookupMaps] together into a single map, grouping the Exec
utableElements |
| 6528 * into a list where none of the elements are equal where equality is determin
ed by having equal | 6411 * into a list where none of the elements are equal where equality is determin
ed by having equal |
| 6529 * function types. (We also take note too of the kind of the element: ()->int
and () -> int may | 6412 * function types. (We also take note too of the kind of the element: ()->int
and () -> int may |
| 6530 * not be equal if one is a getter and the other is a method.) | 6413 * not be equal if one is a getter and the other is a method.) |
| 6531 * | 6414 * |
| 6532 * @param lookupMaps the maps to be unioned together. | 6415 * @param lookupMaps the maps to be unioned together. |
| 6533 * @return the resulting union map. | 6416 * @return the resulting union map. |
| 6534 */ | 6417 */ |
| 6535 HashMap<String, List<ExecutableElement>> | 6418 HashMap<String, List<ExecutableElement>> _unionInterfaceLookupMaps( |
| 6536 _unionInterfaceLookupMaps(List<MemberMap> lookupMaps) { | 6419 List<MemberMap> lookupMaps) { |
| 6537 HashMap<String, List<ExecutableElement>> unionMap = | 6420 HashMap<String, List<ExecutableElement>> unionMap = |
| 6538 new HashMap<String, List<ExecutableElement>>(); | 6421 new HashMap<String, List<ExecutableElement>>(); |
| 6539 for (MemberMap lookupMap in lookupMaps) { | 6422 for (MemberMap lookupMap in lookupMaps) { |
| 6540 int lookupMapSize = lookupMap.size; | 6423 int lookupMapSize = lookupMap.size; |
| 6541 for (int i = 0; i < lookupMapSize; i++) { | 6424 for (int i = 0; i < lookupMapSize; i++) { |
| 6542 // Get the string key, if null, break. | 6425 // Get the string key, if null, break. |
| 6543 String key = lookupMap.getKey(i); | 6426 String key = lookupMap.getKey(i); |
| 6544 if (key == null) { | 6427 if (key == null) { |
| 6545 break; | 6428 break; |
| 6546 } | 6429 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 6559 list.add(newExecutableElementEntry); | 6442 list.add(newExecutableElementEntry); |
| 6560 } else { | 6443 } else { |
| 6561 // Otherwise, only add the newExecutableElementEntry if it isn't | 6444 // Otherwise, only add the newExecutableElementEntry if it isn't |
| 6562 // already in the list, this covers situation where a class inherits | 6445 // already in the list, this covers situation where a class inherits |
| 6563 // two methods (or two getters) that are identical. | 6446 // two methods (or two getters) that are identical. |
| 6564 bool alreadyInList = false; | 6447 bool alreadyInList = false; |
| 6565 bool isMethod1 = newExecutableElementEntry is MethodElement; | 6448 bool isMethod1 = newExecutableElementEntry is MethodElement; |
| 6566 for (ExecutableElement executableElementInList in list) { | 6449 for (ExecutableElement executableElementInList in list) { |
| 6567 bool isMethod2 = executableElementInList is MethodElement; | 6450 bool isMethod2 = executableElementInList is MethodElement; |
| 6568 if (isMethod1 == isMethod2 && | 6451 if (isMethod1 == isMethod2 && |
| 6569 executableElementInList.type == newExecutableElementEntry.type)
{ | 6452 executableElementInList.type == |
| 6453 newExecutableElementEntry.type) { |
| 6570 alreadyInList = true; | 6454 alreadyInList = true; |
| 6571 break; | 6455 break; |
| 6572 } | 6456 } |
| 6573 } | 6457 } |
| 6574 if (!alreadyInList) { | 6458 if (!alreadyInList) { |
| 6575 list.add(newExecutableElementEntry); | 6459 list.add(newExecutableElementEntry); |
| 6576 } | 6460 } |
| 6577 } | 6461 } |
| 6578 } | 6462 } |
| 6579 } | 6463 } |
| 6580 return unionMap; | 6464 return unionMap; |
| 6581 } | 6465 } |
| 6582 | 6466 |
| 6583 /** | 6467 /** |
| 6584 * Given some array of [ExecutableElement]s, this method creates a synthetic e
lement as | 6468 * Given some array of [ExecutableElement]s, this method creates a synthetic e
lement as |
| 6585 * described in 8.1.1: | 6469 * described in 8.1.1: |
| 6586 * | 6470 * |
| 6587 * Let <i>numberOfPositionals</i>(<i>f</i>) denote the number of positional pa
rameters of a | 6471 * Let <i>numberOfPositionals</i>(<i>f</i>) denote the number of positional pa
rameters of a |
| 6588 * function <i>f</i>, and let <i>numberOfRequiredParams</i>(<i>f</i>) denote t
he number of | 6472 * function <i>f</i>, and let <i>numberOfRequiredParams</i>(<i>f</i>) denote t
he number of |
| 6589 * required parameters of a function <i>f</i>. Furthermore, let <i>s</i> denot
e the set of all | 6473 * required parameters of a function <i>f</i>. Furthermore, let <i>s</i> denot
e the set of all |
| 6590 * named parameters of the <i>m<sub>1</sub>, …, m<sub>k</sub></i>. Then
let | 6474 * named parameters of the <i>m<sub>1</sub>, …, m<sub>k</sub></i>. Then
let |
| 6591 * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i> | 6475 * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i> |
| 6592 * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <=
i <= k.</i> | 6476 * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <=
i <= k.</i> |
| 6593 * Then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameter
s of type | 6477 * Then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameter
s of type |
| 6594 * <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, name
d parameters | 6478 * <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, name
d parameters |
| 6595 * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>. | 6479 * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>. |
| 6596 * | 6480 * |
| 6597 */ | 6481 */ |
| 6598 static ExecutableElement | 6482 static ExecutableElement _computeMergedExecutableElement( |
| 6599 _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerg
e) { | 6483 List<ExecutableElement> elementArrayToMerge) { |
| 6600 int h = _getNumOfPositionalParameters(elementArrayToMerge[0]); | 6484 int h = _getNumOfPositionalParameters(elementArrayToMerge[0]); |
| 6601 int r = _getNumOfRequiredParameters(elementArrayToMerge[0]); | 6485 int r = _getNumOfRequiredParameters(elementArrayToMerge[0]); |
| 6602 Set<String> namedParametersList = new HashSet<String>(); | 6486 Set<String> namedParametersList = new HashSet<String>(); |
| 6603 for (int i = 1; i < elementArrayToMerge.length; i++) { | 6487 for (int i = 1; i < elementArrayToMerge.length; i++) { |
| 6604 ExecutableElement element = elementArrayToMerge[i]; | 6488 ExecutableElement element = elementArrayToMerge[i]; |
| 6605 int numOfPositionalParams = _getNumOfPositionalParameters(element); | 6489 int numOfPositionalParams = _getNumOfPositionalParameters(element); |
| 6606 if (h < numOfPositionalParams) { | 6490 if (h < numOfPositionalParams) { |
| 6607 h = numOfPositionalParams; | 6491 h = numOfPositionalParams; |
| 6608 } | 6492 } |
| 6609 int numOfRequiredParams = _getNumOfRequiredParameters(element); | 6493 int numOfRequiredParams = _getNumOfRequiredParameters(element); |
| 6610 if (r > numOfRequiredParams) { | 6494 if (r > numOfRequiredParams) { |
| 6611 r = numOfRequiredParams; | 6495 r = numOfRequiredParams; |
| 6612 } | 6496 } |
| 6613 namedParametersList.addAll(_getNamedParameterNames(element)); | 6497 namedParametersList.addAll(_getNamedParameterNames(element)); |
| 6614 } | 6498 } |
| 6615 return _createSyntheticExecutableElement( | 6499 return _createSyntheticExecutableElement(elementArrayToMerge, |
| 6616 elementArrayToMerge, | 6500 elementArrayToMerge[0].displayName, r, h - r, |
| 6617 elementArrayToMerge[0].displayName, | |
| 6618 r, | |
| 6619 h - r, | |
| 6620 new List.from(namedParametersList)); | 6501 new List.from(namedParametersList)); |
| 6621 } | 6502 } |
| 6622 | 6503 |
| 6623 /** | 6504 /** |
| 6624 * Used by [computeMergedExecutableElement] to actually create the | 6505 * Used by [computeMergedExecutableElement] to actually create the |
| 6625 * synthetic element. | 6506 * synthetic element. |
| 6626 * | 6507 * |
| 6627 * @param elementArrayToMerge the array used to create the synthetic element | 6508 * @param elementArrayToMerge the array used to create the synthetic element |
| 6628 * @param name the name of the method, getter or setter | 6509 * @param name the name of the method, getter or setter |
| 6629 * @param numOfRequiredParameters the number of required parameters | 6510 * @param numOfRequiredParameters the number of required parameters |
| 6630 * @param numOfPositionalParameters the number of positional parameters | 6511 * @param numOfPositionalParameters the number of positional parameters |
| 6631 * @param namedParameters the list of [String]s that are the named parameters | 6512 * @param namedParameters the list of [String]s that are the named parameters |
| 6632 * @return the created synthetic element | 6513 * @return the created synthetic element |
| 6633 */ | 6514 */ |
| 6634 static ExecutableElement | 6515 static ExecutableElement _createSyntheticExecutableElement( |
| 6635 _createSyntheticExecutableElement(List<ExecutableElement> elementArrayToMe
rge, | 6516 List<ExecutableElement> elementArrayToMerge, String name, |
| 6636 String name, int numOfRequiredParameters, int numOfPositionalParameters, | 6517 int numOfRequiredParameters, int numOfPositionalParameters, |
| 6637 List<String> namedParameters) { | 6518 List<String> namedParameters) { |
| 6638 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; | 6519 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; |
| 6639 SimpleIdentifier nameIdentifier = | 6520 SimpleIdentifier nameIdentifier = new SimpleIdentifier( |
| 6640 new SimpleIdentifier(new sc.StringToken(sc.TokenType.IDENTIFIER, name, 0
)); | 6521 new sc.StringToken(sc.TokenType.IDENTIFIER, name, 0)); |
| 6641 ExecutableElementImpl executable; | 6522 ExecutableElementImpl executable; |
| 6642 if (elementArrayToMerge[0] is MethodElement) { | 6523 if (elementArrayToMerge[0] is MethodElement) { |
| 6643 MultiplyInheritedMethodElementImpl unionedMethod = | 6524 MultiplyInheritedMethodElementImpl unionedMethod = |
| 6644 new MultiplyInheritedMethodElementImpl(nameIdentifier); | 6525 new MultiplyInheritedMethodElementImpl(nameIdentifier); |
| 6645 unionedMethod.inheritedElements = elementArrayToMerge; | 6526 unionedMethod.inheritedElements = elementArrayToMerge; |
| 6646 executable = unionedMethod; | 6527 executable = unionedMethod; |
| 6647 } else { | 6528 } else { |
| 6648 MultiplyInheritedPropertyAccessorElementImpl unionedPropertyAccessor = | 6529 MultiplyInheritedPropertyAccessorElementImpl unionedPropertyAccessor = |
| 6649 new MultiplyInheritedPropertyAccessorElementImpl(nameIdentifier); | 6530 new MultiplyInheritedPropertyAccessorElementImpl(nameIdentifier); |
| 6650 unionedPropertyAccessor.getter = | 6531 unionedPropertyAccessor.getter = |
| 6651 (elementArrayToMerge[0] as PropertyAccessorElement).isGetter; | 6532 (elementArrayToMerge[0] as PropertyAccessorElement).isGetter; |
| 6652 unionedPropertyAccessor.setter = | 6533 unionedPropertyAccessor.setter = |
| 6653 (elementArrayToMerge[0] as PropertyAccessorElement).isSetter; | 6534 (elementArrayToMerge[0] as PropertyAccessorElement).isSetter; |
| 6654 unionedPropertyAccessor.inheritedElements = elementArrayToMerge; | 6535 unionedPropertyAccessor.inheritedElements = elementArrayToMerge; |
| 6655 executable = unionedPropertyAccessor; | 6536 executable = unionedPropertyAccessor; |
| 6656 } | 6537 } |
| 6657 int numOfParameters = | 6538 int numOfParameters = numOfRequiredParameters + |
| 6658 numOfRequiredParameters + | |
| 6659 numOfPositionalParameters + | 6539 numOfPositionalParameters + |
| 6660 namedParameters.length; | 6540 namedParameters.length; |
| 6661 List<ParameterElement> parameters = | 6541 List<ParameterElement> parameters = |
| 6662 new List<ParameterElement>(numOfParameters); | 6542 new List<ParameterElement>(numOfParameters); |
| 6663 int i = 0; | 6543 int i = 0; |
| 6664 for (int j = 0; j < numOfRequiredParameters; j++, i++) { | 6544 for (int j = 0; j < numOfRequiredParameters; j++, i++) { |
| 6665 ParameterElementImpl parameter = new ParameterElementImpl("", 0); | 6545 ParameterElementImpl parameter = new ParameterElementImpl("", 0); |
| 6666 parameter.type = dynamicType; | 6546 parameter.type = dynamicType; |
| 6667 parameter.parameterKind = ParameterKind.REQUIRED; | 6547 parameter.parameterKind = ParameterKind.REQUIRED; |
| 6668 parameters[i] = parameter; | 6548 parameters[i] = parameter; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 6683 executable.returnType = dynamicType; | 6563 executable.returnType = dynamicType; |
| 6684 executable.parameters = parameters; | 6564 executable.parameters = parameters; |
| 6685 FunctionTypeImpl methodType = new FunctionTypeImpl.con1(executable); | 6565 FunctionTypeImpl methodType = new FunctionTypeImpl.con1(executable); |
| 6686 executable.type = methodType; | 6566 executable.type = methodType; |
| 6687 return executable; | 6567 return executable; |
| 6688 } | 6568 } |
| 6689 | 6569 |
| 6690 /** | 6570 /** |
| 6691 * Given some [ExecutableElement], return the list of named parameters. | 6571 * Given some [ExecutableElement], return the list of named parameters. |
| 6692 */ | 6572 */ |
| 6693 static List<String> | 6573 static List<String> _getNamedParameterNames( |
| 6694 _getNamedParameterNames(ExecutableElement executableElement) { | 6574 ExecutableElement executableElement) { |
| 6695 List<String> namedParameterNames = new List<String>(); | 6575 List<String> namedParameterNames = new List<String>(); |
| 6696 List<ParameterElement> parameters = executableElement.parameters; | 6576 List<ParameterElement> parameters = executableElement.parameters; |
| 6697 for (int i = 0; i < parameters.length; i++) { | 6577 for (int i = 0; i < parameters.length; i++) { |
| 6698 ParameterElement parameterElement = parameters[i]; | 6578 ParameterElement parameterElement = parameters[i]; |
| 6699 if (parameterElement.parameterKind == ParameterKind.NAMED) { | 6579 if (parameterElement.parameterKind == ParameterKind.NAMED) { |
| 6700 namedParameterNames.add(parameterElement.name); | 6580 namedParameterNames.add(parameterElement.name); |
| 6701 } | 6581 } |
| 6702 } | 6582 } |
| 6703 return namedParameterNames; | 6583 return namedParameterNames; |
| 6704 } | 6584 } |
| 6705 | 6585 |
| 6706 /** | 6586 /** |
| 6707 * Given some [ExecutableElement] return the number of parameters of the speci
fied kind. | 6587 * Given some [ExecutableElement] return the number of parameters of the speci
fied kind. |
| 6708 */ | 6588 */ |
| 6709 static int _getNumOfParameters(ExecutableElement executableElement, | 6589 static int _getNumOfParameters( |
| 6710 ParameterKind parameterKind) { | 6590 ExecutableElement executableElement, ParameterKind parameterKind) { |
| 6711 int parameterCount = 0; | 6591 int parameterCount = 0; |
| 6712 List<ParameterElement> parameters = executableElement.parameters; | 6592 List<ParameterElement> parameters = executableElement.parameters; |
| 6713 for (int i = 0; i < parameters.length; i++) { | 6593 for (int i = 0; i < parameters.length; i++) { |
| 6714 ParameterElement parameterElement = parameters[i]; | 6594 ParameterElement parameterElement = parameters[i]; |
| 6715 if (parameterElement.parameterKind == parameterKind) { | 6595 if (parameterElement.parameterKind == parameterKind) { |
| 6716 parameterCount++; | 6596 parameterCount++; |
| 6717 } | 6597 } |
| 6718 } | 6598 } |
| 6719 return parameterCount; | 6599 return parameterCount; |
| 6720 } | 6600 } |
| 6721 | 6601 |
| 6722 /** | 6602 /** |
| 6723 * Given some [ExecutableElement] return the number of positional parameters. | 6603 * Given some [ExecutableElement] return the number of positional parameters. |
| 6724 * | 6604 * |
| 6725 * Note: by positional we mean [ParameterKind.REQUIRED] or [ParameterKind.POSI
TIONAL]. | 6605 * Note: by positional we mean [ParameterKind.REQUIRED] or [ParameterKind.POSI
TIONAL]. |
| 6726 */ | 6606 */ |
| 6727 static int | 6607 static int _getNumOfPositionalParameters( |
| 6728 _getNumOfPositionalParameters(ExecutableElement executableElement) => | 6608 ExecutableElement executableElement) => |
| 6729 _getNumOfParameters(executableElement, ParameterKind.REQUIRED) + | 6609 _getNumOfParameters(executableElement, ParameterKind.REQUIRED) + |
| 6730 _getNumOfParameters(executableElement, ParameterKind.POSITIONAL); | 6610 _getNumOfParameters(executableElement, ParameterKind.POSITIONAL); |
| 6731 | 6611 |
| 6732 /** | 6612 /** |
| 6733 * Given some [ExecutableElement] return the number of required parameters. | 6613 * Given some [ExecutableElement] return the number of required parameters. |
| 6734 */ | 6614 */ |
| 6735 static int _getNumOfRequiredParameters(ExecutableElement executableElement) => | 6615 static int _getNumOfRequiredParameters(ExecutableElement executableElement) => |
| 6736 _getNumOfParameters(executableElement, ParameterKind.REQUIRED); | 6616 _getNumOfParameters(executableElement, ParameterKind.REQUIRED); |
| 6737 | 6617 |
| 6738 /** | 6618 /** |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6763 static const INIT_STATE INIT_IN_DECLARATION = | 6643 static const INIT_STATE INIT_IN_DECLARATION = |
| 6764 const INIT_STATE('INIT_IN_DECLARATION', 1); | 6644 const INIT_STATE('INIT_IN_DECLARATION', 1); |
| 6765 | 6645 |
| 6766 static const INIT_STATE INIT_IN_FIELD_FORMAL = | 6646 static const INIT_STATE INIT_IN_FIELD_FORMAL = |
| 6767 const INIT_STATE('INIT_IN_FIELD_FORMAL', 2); | 6647 const INIT_STATE('INIT_IN_FIELD_FORMAL', 2); |
| 6768 | 6648 |
| 6769 static const INIT_STATE INIT_IN_INITIALIZERS = | 6649 static const INIT_STATE INIT_IN_INITIALIZERS = |
| 6770 const INIT_STATE('INIT_IN_INITIALIZERS', 3); | 6650 const INIT_STATE('INIT_IN_INITIALIZERS', 3); |
| 6771 | 6651 |
| 6772 static const List<INIT_STATE> values = const [ | 6652 static const List<INIT_STATE> values = const [ |
| 6773 NOT_INIT, | 6653 NOT_INIT, |
| 6774 INIT_IN_DECLARATION, | 6654 INIT_IN_DECLARATION, |
| 6775 INIT_IN_FIELD_FORMAL, | 6655 INIT_IN_FIELD_FORMAL, |
| 6776 INIT_IN_INITIALIZERS]; | 6656 INIT_IN_INITIALIZERS |
| 6657 ]; |
| 6777 | 6658 |
| 6778 const INIT_STATE(String name, int ordinal) : super(name, ordinal); | 6659 const INIT_STATE(String name, int ordinal) : super(name, ordinal); |
| 6779 } | 6660 } |
| 6780 | 6661 |
| 6781 /** | 6662 /** |
| 6782 * Instances of the class `LabelScope` represent a scope in which a single label
is defined. | 6663 * Instances of the class `LabelScope` represent a scope in which a single label
is defined. |
| 6783 */ | 6664 */ |
| 6784 class LabelScope { | 6665 class LabelScope { |
| 6785 /** | 6666 /** |
| 6786 * The label scope enclosing this label scope. | 6667 * The label scope enclosing this label scope. |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7008 } | 6889 } |
| 7009 | 6890 |
| 7010 /** | 6891 /** |
| 7011 * Return the library element representing this library, creating it if necess
ary. | 6892 * Return the library element representing this library, creating it if necess
ary. |
| 7012 * | 6893 * |
| 7013 * @return the library element representing this library | 6894 * @return the library element representing this library |
| 7014 */ | 6895 */ |
| 7015 LibraryElementImpl get libraryElement { | 6896 LibraryElementImpl get libraryElement { |
| 7016 if (_libraryElement == null) { | 6897 if (_libraryElement == null) { |
| 7017 try { | 6898 try { |
| 7018 _libraryElement = | 6899 _libraryElement = _analysisContext |
| 7019 _analysisContext.computeLibraryElement(librarySource) as LibraryElem
entImpl; | 6900 .computeLibraryElement(librarySource) as LibraryElementImpl; |
| 7020 } on AnalysisException catch (exception, stackTrace) { | 6901 } on AnalysisException catch (exception, stackTrace) { |
| 7021 AnalysisEngine.instance.logger.logError( | 6902 AnalysisEngine.instance.logger.logError( |
| 7022 "Could not compute library element for ${librarySource.fullName}", | 6903 "Could not compute library element for ${librarySource.fullName}", |
| 7023 new CaughtException(exception, stackTrace)); | 6904 new CaughtException(exception, stackTrace)); |
| 7024 } | 6905 } |
| 7025 } | 6906 } |
| 7026 return _libraryElement; | 6907 return _libraryElement; |
| 7027 } | 6908 } |
| 7028 | 6909 |
| 7029 /** | 6910 /** |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7069 /** | 6950 /** |
| 7070 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the | 6951 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the |
| 7071 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. | 6952 * library, or `null` if the URI is not valid. If the URI is not valid, report
the error. |
| 7072 * | 6953 * |
| 7073 * @param directive the directive which URI should be resolved | 6954 * @param directive the directive which URI should be resolved |
| 7074 * @return the result of resolving the URI against the URI of the library | 6955 * @return the result of resolving the URI against the URI of the library |
| 7075 */ | 6956 */ |
| 7076 Source getSource(UriBasedDirective directive) { | 6957 Source getSource(UriBasedDirective directive) { |
| 7077 StringLiteral uriLiteral = directive.uri; | 6958 StringLiteral uriLiteral = directive.uri; |
| 7078 if (uriLiteral is StringInterpolation) { | 6959 if (uriLiteral is StringInterpolation) { |
| 7079 _errorListener.onError( | 6960 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7080 new AnalysisError.con2( | 6961 uriLiteral.offset, uriLiteral.length, |
| 7081 librarySource, | 6962 CompileTimeErrorCode.URI_WITH_INTERPOLATION)); |
| 7082 uriLiteral.offset, | |
| 7083 uriLiteral.length, | |
| 7084 CompileTimeErrorCode.URI_WITH_INTERPOLATION)); | |
| 7085 return null; | 6963 return null; |
| 7086 } | 6964 } |
| 7087 String uriContent = uriLiteral.stringValue.trim(); | 6965 String uriContent = uriLiteral.stringValue.trim(); |
| 7088 _directiveUris[directive] = uriContent; | 6966 _directiveUris[directive] = uriContent; |
| 7089 uriContent = Uri.encodeFull(uriContent); | 6967 uriContent = Uri.encodeFull(uriContent); |
| 7090 if (directive is ImportDirective && | 6968 if (directive is ImportDirective && |
| 7091 uriContent.startsWith(_DART_EXT_SCHEME)) { | 6969 uriContent.startsWith(_DART_EXT_SCHEME)) { |
| 7092 _libraryElement.hasExtUri = true; | 6970 _libraryElement.hasExtUri = true; |
| 7093 return null; | 6971 return null; |
| 7094 } | 6972 } |
| 7095 try { | 6973 try { |
| 7096 parseUriWithException(uriContent); | 6974 parseUriWithException(uriContent); |
| 7097 Source source = | 6975 Source source = |
| 7098 _analysisContext.sourceFactory.resolveUri(librarySource, uriContent); | 6976 _analysisContext.sourceFactory.resolveUri(librarySource, uriContent); |
| 7099 if (!_analysisContext.exists(source)) { | 6977 if (!_analysisContext.exists(source)) { |
| 7100 _errorListener.onError( | 6978 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7101 new AnalysisError.con2( | 6979 uriLiteral.offset, uriLiteral.length, |
| 7102 librarySource, | 6980 CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent])); |
| 7103 uriLiteral.offset, | |
| 7104 uriLiteral.length, | |
| 7105 CompileTimeErrorCode.URI_DOES_NOT_EXIST, | |
| 7106 [uriContent])); | |
| 7107 } | 6981 } |
| 7108 return source; | 6982 return source; |
| 7109 } on URISyntaxException catch (exception) { | 6983 } on URISyntaxException catch (exception) { |
| 7110 _errorListener.onError( | 6984 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7111 new AnalysisError.con2( | 6985 uriLiteral.offset, uriLiteral.length, |
| 7112 librarySource, | 6986 CompileTimeErrorCode.INVALID_URI, [uriContent])); |
| 7113 uriLiteral.offset, | |
| 7114 uriLiteral.length, | |
| 7115 CompileTimeErrorCode.INVALID_URI, | |
| 7116 [uriContent])); | |
| 7117 } | 6987 } |
| 7118 return null; | 6988 return null; |
| 7119 } | 6989 } |
| 7120 | 6990 |
| 7121 /** | 6991 /** |
| 7122 * Returns the URI value of the given directive. | 6992 * Returns the URI value of the given directive. |
| 7123 */ | 6993 */ |
| 7124 String getUri(UriBasedDirective directive) => _directiveUris[directive]; | 6994 String getUri(UriBasedDirective directive) => _directiveUris[directive]; |
| 7125 | 6995 |
| 7126 /** | 6996 /** |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7210 part.uriOffset = partUri.offset; | 7080 part.uriOffset = partUri.offset; |
| 7211 part.uriEnd = partUri.end; | 7081 part.uriEnd = partUri.end; |
| 7212 part.uri = partDirective.uriContent; | 7082 part.uri = partDirective.uriContent; |
| 7213 // | 7083 // |
| 7214 // Validate that the part contains a part-of directive with the same | 7084 // Validate that the part contains a part-of directive with the same |
| 7215 // name as the library. | 7085 // name as the library. |
| 7216 // | 7086 // |
| 7217 String partLibraryName = | 7087 String partLibraryName = |
| 7218 _getPartLibraryName(partSource, partUnit, directivesToResolve); | 7088 _getPartLibraryName(partSource, partUnit, directivesToResolve); |
| 7219 if (partLibraryName == null) { | 7089 if (partLibraryName == null) { |
| 7220 _errorListener.onError( | 7090 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7221 new AnalysisError.con2( | 7091 partUri.offset, partUri.length, |
| 7222 librarySource, | 7092 CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSource()])); |
| 7223 partUri.offset, | |
| 7224 partUri.length, | |
| 7225 CompileTimeErrorCode.PART_OF_NON_PART, | |
| 7226 [partUri.toSource()])); | |
| 7227 } else if (libraryNameNode == null) { | 7093 } else if (libraryNameNode == null) { |
| 7228 // TODO(brianwilkerson) Collect the names declared by the part. | 7094 // TODO(brianwilkerson) Collect the names declared by the part. |
| 7229 // If they are all the same then we can use that name as the | 7095 // If they are all the same then we can use that name as the |
| 7230 // inferred name of the library and present it in a quick-fix. | 7096 // inferred name of the library and present it in a quick-fix. |
| 7231 // partLibraryNames.add(partLibraryName); | 7097 // partLibraryNames.add(partLibraryName); |
| 7232 } else if (libraryNameNode.name != partLibraryName) { | 7098 } else if (libraryNameNode.name != partLibraryName) { |
| 7233 _errorListener.onError( | 7099 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7234 new AnalysisError.con2( | 7100 partUri.offset, partUri.length, |
| 7235 librarySource, | 7101 StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [ |
| 7236 partUri.offset, | 7102 libraryNameNode.name, |
| 7237 partUri.length, | 7103 partLibraryName |
| 7238 StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, | 7104 ])); |
| 7239 [libraryNameNode.name, partLibraryName])); | |
| 7240 } | 7105 } |
| 7241 if (entryPoint == null) { | 7106 if (entryPoint == null) { |
| 7242 entryPoint = _findEntryPoint(part); | 7107 entryPoint = _findEntryPoint(part); |
| 7243 } | 7108 } |
| 7244 directive.element = part; | 7109 directive.element = part; |
| 7245 sourcedCompilationUnits.add(part); | 7110 sourcedCompilationUnits.add(part); |
| 7246 } | 7111 } |
| 7247 } | 7112 } |
| 7248 } | 7113 } |
| 7249 if (hasPartDirective && libraryNameNode == null) { | 7114 if (hasPartDirective && libraryNameNode == null) { |
| 7250 _errorListener.onError( | 7115 _errorListener.onError(new AnalysisError.con1(librarySource, |
| 7251 new AnalysisError.con1( | 7116 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); |
| 7252 librarySource, | |
| 7253 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); | |
| 7254 } | 7117 } |
| 7255 // | 7118 // |
| 7256 // Create and populate the library element. | 7119 // Create and populate the library element. |
| 7257 // | 7120 // |
| 7258 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( | 7121 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( |
| 7259 _analysisContext.getContextFor(librarySource), | 7122 _analysisContext.getContextFor(librarySource), libraryNameNode); |
| 7260 libraryNameNode); | |
| 7261 libraryElement.definingCompilationUnit = definingCompilationUnitElement; | 7123 libraryElement.definingCompilationUnit = definingCompilationUnitElement; |
| 7262 if (entryPoint != null) { | 7124 if (entryPoint != null) { |
| 7263 libraryElement.entryPoint = entryPoint; | 7125 libraryElement.entryPoint = entryPoint; |
| 7264 } | 7126 } |
| 7265 int sourcedUnitCount = sourcedCompilationUnits.length; | 7127 int sourcedUnitCount = sourcedCompilationUnits.length; |
| 7266 libraryElement.parts = sourcedCompilationUnits; | 7128 libraryElement.parts = sourcedCompilationUnits; |
| 7267 for (Directive directive in directivesToResolve) { | 7129 for (Directive directive in directivesToResolve) { |
| 7268 directive.element = libraryElement; | 7130 directive.element = libraryElement; |
| 7269 } | 7131 } |
| 7270 library.libraryElement = libraryElement; | 7132 library.libraryElement = libraryElement; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7321 part.uriOffset = partUri.offset; | 7183 part.uriOffset = partUri.offset; |
| 7322 part.uriEnd = partUri.end; | 7184 part.uriEnd = partUri.end; |
| 7323 part.uri = partDirective.uriContent; | 7185 part.uri = partDirective.uriContent; |
| 7324 // | 7186 // |
| 7325 // Validate that the part contains a part-of directive with the same | 7187 // Validate that the part contains a part-of directive with the same |
| 7326 // name as the library. | 7188 // name as the library. |
| 7327 // | 7189 // |
| 7328 String partLibraryName = | 7190 String partLibraryName = |
| 7329 _getPartLibraryName(partSource, partUnit, directivesToResolve); | 7191 _getPartLibraryName(partSource, partUnit, directivesToResolve); |
| 7330 if (partLibraryName == null) { | 7192 if (partLibraryName == null) { |
| 7331 _errorListener.onError( | 7193 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7332 new AnalysisError.con2( | 7194 partUri.offset, partUri.length, |
| 7333 librarySource, | 7195 CompileTimeErrorCode.PART_OF_NON_PART, [partUri.toSource()])); |
| 7334 partUri.offset, | |
| 7335 partUri.length, | |
| 7336 CompileTimeErrorCode.PART_OF_NON_PART, | |
| 7337 [partUri.toSource()])); | |
| 7338 } else if (libraryNameNode == null) { | 7196 } else if (libraryNameNode == null) { |
| 7339 // TODO(brianwilkerson) Collect the names declared by the part. | 7197 // TODO(brianwilkerson) Collect the names declared by the part. |
| 7340 // If they are all the same then we can use that name as the | 7198 // If they are all the same then we can use that name as the |
| 7341 // inferred name of the library and present it in a quick-fix. | 7199 // inferred name of the library and present it in a quick-fix. |
| 7342 // partLibraryNames.add(partLibraryName); | 7200 // partLibraryNames.add(partLibraryName); |
| 7343 } else if (libraryNameNode.name != partLibraryName) { | 7201 } else if (libraryNameNode.name != partLibraryName) { |
| 7344 _errorListener.onError( | 7202 _errorListener.onError(new AnalysisError.con2(librarySource, |
| 7345 new AnalysisError.con2( | 7203 partUri.offset, partUri.length, |
| 7346 librarySource, | 7204 StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, [ |
| 7347 partUri.offset, | 7205 libraryNameNode.name, |
| 7348 partUri.length, | 7206 partLibraryName |
| 7349 StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, | 7207 ])); |
| 7350 [libraryNameNode.name, partLibraryName])); | |
| 7351 } | 7208 } |
| 7352 if (entryPoint == null) { | 7209 if (entryPoint == null) { |
| 7353 entryPoint = _findEntryPoint(part); | 7210 entryPoint = _findEntryPoint(part); |
| 7354 } | 7211 } |
| 7355 directive.element = part; | 7212 directive.element = part; |
| 7356 sourcedCompilationUnits.add(part); | 7213 sourcedCompilationUnits.add(part); |
| 7357 } | 7214 } |
| 7358 } | 7215 } |
| 7359 } | 7216 } |
| 7360 } | 7217 } |
| 7361 if (hasPartDirective && libraryNameNode == null) { | 7218 if (hasPartDirective && libraryNameNode == null) { |
| 7362 _errorListener.onError( | 7219 _errorListener.onError(new AnalysisError.con1(librarySource, |
| 7363 new AnalysisError.con1( | 7220 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); |
| 7364 librarySource, | |
| 7365 ResolverErrorCode.MISSING_LIBRARY_DIRECTIVE_WITH_PART)); | |
| 7366 } | 7221 } |
| 7367 // | 7222 // |
| 7368 // Create and populate the library element. | 7223 // Create and populate the library element. |
| 7369 // | 7224 // |
| 7370 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( | 7225 LibraryElementImpl libraryElement = new LibraryElementImpl.forNode( |
| 7371 _analysisContext.getContextFor(librarySource), | 7226 _analysisContext.getContextFor(librarySource), libraryNameNode); |
| 7372 libraryNameNode); | |
| 7373 libraryElement.definingCompilationUnit = definingCompilationUnitElement; | 7227 libraryElement.definingCompilationUnit = definingCompilationUnitElement; |
| 7374 if (entryPoint != null) { | 7228 if (entryPoint != null) { |
| 7375 libraryElement.entryPoint = entryPoint; | 7229 libraryElement.entryPoint = entryPoint; |
| 7376 } | 7230 } |
| 7377 int sourcedUnitCount = sourcedCompilationUnits.length; | 7231 int sourcedUnitCount = sourcedCompilationUnits.length; |
| 7378 libraryElement.parts = sourcedCompilationUnits; | 7232 libraryElement.parts = sourcedCompilationUnits; |
| 7379 for (Directive directive in directivesToResolve) { | 7233 for (Directive directive in directivesToResolve) { |
| 7380 directive.element = libraryElement; | 7234 directive.element = libraryElement; |
| 7381 } | 7235 } |
| 7382 library.libraryElement = libraryElement; | 7236 library.libraryElement = libraryElement; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7517 @override | 7371 @override |
| 7518 Source getSource(AstNode node) { | 7372 Source getSource(AstNode node) { |
| 7519 Source source = super.getSource(node); | 7373 Source source = super.getSource(node); |
| 7520 if (source == null) { | 7374 if (source == null) { |
| 7521 source = _definingLibrary.definingCompilationUnit.source; | 7375 source = _definingLibrary.definingCompilationUnit.source; |
| 7522 } | 7376 } |
| 7523 return source; | 7377 return source; |
| 7524 } | 7378 } |
| 7525 | 7379 |
| 7526 @override | 7380 @override |
| 7527 Element internalLookup(Identifier identifier, String name, | 7381 Element internalLookup( |
| 7528 LibraryElement referencingLibrary) { | 7382 Identifier identifier, String name, LibraryElement referencingLibrary) { |
| 7529 Element foundElement = localLookup(name, referencingLibrary); | 7383 Element foundElement = localLookup(name, referencingLibrary); |
| 7530 if (foundElement != null) { | 7384 if (foundElement != null) { |
| 7531 return foundElement; | 7385 return foundElement; |
| 7532 } | 7386 } |
| 7533 for (int i = 0; i < _importedNamespaces.length; i++) { | 7387 for (int i = 0; i < _importedNamespaces.length; i++) { |
| 7534 Namespace nameSpace = _importedNamespaces[i]; | 7388 Namespace nameSpace = _importedNamespaces[i]; |
| 7535 Element element = nameSpace.get(name); | 7389 Element element = nameSpace.get(name); |
| 7536 if (element != null) { | 7390 if (element != null) { |
| 7537 if (foundElement == null) { | 7391 if (foundElement == null) { |
| 7538 foundElement = element; | 7392 foundElement = element; |
| 7539 } else if (!identical(foundElement, element)) { | 7393 } else if (!identical(foundElement, element)) { |
| 7540 foundElement = MultiplyDefinedElementImpl.fromElements( | 7394 foundElement = MultiplyDefinedElementImpl.fromElements( |
| 7541 _definingLibrary.context, | 7395 _definingLibrary.context, foundElement, element); |
| 7542 foundElement, | |
| 7543 element); | |
| 7544 } | 7396 } |
| 7545 } | 7397 } |
| 7546 } | 7398 } |
| 7547 if (foundElement is MultiplyDefinedElementImpl) { | 7399 if (foundElement is MultiplyDefinedElementImpl) { |
| 7548 foundElement = _removeSdkElements( | 7400 foundElement = _removeSdkElements( |
| 7549 identifier, | 7401 identifier, name, foundElement as MultiplyDefinedElementImpl); |
| 7550 name, | |
| 7551 foundElement as MultiplyDefinedElementImpl); | |
| 7552 } | 7402 } |
| 7553 if (foundElement is MultiplyDefinedElementImpl) { | 7403 if (foundElement is MultiplyDefinedElementImpl) { |
| 7554 String foundEltName = foundElement.displayName; | 7404 String foundEltName = foundElement.displayName; |
| 7555 List<Element> conflictingMembers = | 7405 List<Element> conflictingMembers = |
| 7556 (foundElement as MultiplyDefinedElementImpl).conflictingElements; | 7406 (foundElement as MultiplyDefinedElementImpl).conflictingElements; |
| 7557 int count = conflictingMembers.length; | 7407 int count = conflictingMembers.length; |
| 7558 List<String> libraryNames = new List<String>(count); | 7408 List<String> libraryNames = new List<String>(count); |
| 7559 for (int i = 0; i < count; i++) { | 7409 for (int i = 0; i < count; i++) { |
| 7560 libraryNames[i] = _getLibraryName(conflictingMembers[i]); | 7410 libraryNames[i] = _getLibraryName(conflictingMembers[i]); |
| 7561 } | 7411 } |
| 7562 libraryNames.sort(); | 7412 libraryNames.sort(); |
| 7563 errorListener.onError( | 7413 errorListener.onError(new AnalysisError.con2(getSource(identifier), |
| 7564 new AnalysisError.con2( | 7414 identifier.offset, identifier.length, |
| 7565 getSource(identifier), | 7415 StaticWarningCode.AMBIGUOUS_IMPORT, [ |
| 7566 identifier.offset, | 7416 foundEltName, |
| 7567 identifier.length, | 7417 StringUtilities.printListOfQuotedNames(libraryNames) |
| 7568 StaticWarningCode.AMBIGUOUS_IMPORT, | 7418 ])); |
| 7569 [foundEltName, StringUtilities.printListOfQuotedNames(libraryNames
)])); | |
| 7570 return foundElement; | 7419 return foundElement; |
| 7571 } | 7420 } |
| 7572 if (foundElement != null) { | 7421 if (foundElement != null) { |
| 7573 defineNameWithoutChecking(name, foundElement); | 7422 defineNameWithoutChecking(name, foundElement); |
| 7574 } | 7423 } |
| 7575 return foundElement; | 7424 return foundElement; |
| 7576 } | 7425 } |
| 7577 | 7426 |
| 7578 /** | 7427 /** |
| 7579 * Create all of the namespaces associated with the libraries imported into th
is library. The | 7428 * Create all of the namespaces associated with the libraries imported into th
is library. The |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7611 int count = imports.length; | 7460 int count = imports.length; |
| 7612 for (int i = 0; i < count; i++) { | 7461 for (int i = 0; i < count; i++) { |
| 7613 if (identical(imports[i].importedLibrary, library)) { | 7462 if (identical(imports[i].importedLibrary, library)) { |
| 7614 return library.definingCompilationUnit.displayName; | 7463 return library.definingCompilationUnit.displayName; |
| 7615 } | 7464 } |
| 7616 } | 7465 } |
| 7617 List<String> indirectSources = new List<String>(); | 7466 List<String> indirectSources = new List<String>(); |
| 7618 for (int i = 0; i < count; i++) { | 7467 for (int i = 0; i < count; i++) { |
| 7619 LibraryElement importedLibrary = imports[i].importedLibrary; | 7468 LibraryElement importedLibrary = imports[i].importedLibrary; |
| 7620 if (importedLibrary != null) { | 7469 if (importedLibrary != null) { |
| 7621 for (LibraryElement exportedLibrary in | 7470 for (LibraryElement exportedLibrary |
| 7622 importedLibrary.exportedLibraries) { | 7471 in importedLibrary.exportedLibraries) { |
| 7623 if (identical(exportedLibrary, library)) { | 7472 if (identical(exportedLibrary, library)) { |
| 7624 indirectSources.add( | 7473 indirectSources |
| 7625 importedLibrary.definingCompilationUnit.displayName); | 7474 .add(importedLibrary.definingCompilationUnit.displayName); |
| 7626 } | 7475 } |
| 7627 } | 7476 } |
| 7628 } | 7477 } |
| 7629 } | 7478 } |
| 7630 int indirectCount = indirectSources.length; | 7479 int indirectCount = indirectSources.length; |
| 7631 StringBuffer buffer = new StringBuffer(); | 7480 StringBuffer buffer = new StringBuffer(); |
| 7632 buffer.write(library.definingCompilationUnit.displayName); | 7481 buffer.write(library.definingCompilationUnit.displayName); |
| 7633 if (indirectCount > 0) { | 7482 if (indirectCount > 0) { |
| 7634 buffer.write(" (via "); | 7483 buffer.write(" (via "); |
| 7635 if (indirectCount > 1) { | 7484 if (indirectCount > 1) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 7662 for (Element member in conflictingMembers) { | 7511 for (Element member in conflictingMembers) { |
| 7663 if (member.library.isInSdk) { | 7512 if (member.library.isInSdk) { |
| 7664 sdkElement = member; | 7513 sdkElement = member; |
| 7665 } else { | 7514 } else { |
| 7666 conflictingMembers[to++] = member; | 7515 conflictingMembers[to++] = member; |
| 7667 } | 7516 } |
| 7668 } | 7517 } |
| 7669 if (sdkElement != null && to > 0) { | 7518 if (sdkElement != null && to > 0) { |
| 7670 String sdkLibName = _getLibraryName(sdkElement); | 7519 String sdkLibName = _getLibraryName(sdkElement); |
| 7671 String otherLibName = _getLibraryName(conflictingMembers[0]); | 7520 String otherLibName = _getLibraryName(conflictingMembers[0]); |
| 7672 errorListener.onError( | 7521 errorListener.onError(new AnalysisError.con2(getSource(identifier), |
| 7673 new AnalysisError.con2( | 7522 identifier.offset, identifier.length, |
| 7674 getSource(identifier), | 7523 StaticWarningCode.CONFLICTING_DART_IMPORT, [ |
| 7675 identifier.offset, | 7524 name, |
| 7676 identifier.length, | 7525 sdkLibName, |
| 7677 StaticWarningCode.CONFLICTING_DART_IMPORT, | 7526 otherLibName |
| 7678 [name, sdkLibName, otherLibName])); | 7527 ])); |
| 7679 } | 7528 } |
| 7680 if (to == length) { | 7529 if (to == length) { |
| 7681 // None of the members were removed | 7530 // None of the members were removed |
| 7682 return foundElement; | 7531 return foundElement; |
| 7683 } else if (to == 1) { | 7532 } else if (to == 1) { |
| 7684 // All but one member was removed | 7533 // All but one member was removed |
| 7685 return conflictingMembers[0]; | 7534 return conflictingMembers[0]; |
| 7686 } else if (to == 0) { | 7535 } else if (to == 0) { |
| 7687 // All members were removed | 7536 // All members were removed |
| 7688 AnalysisEngine.instance.logger.logInformation( | 7537 AnalysisEngine.instance.logger |
| 7689 "Multiply defined SDK element: $foundElement"); | 7538 .logInformation("Multiply defined SDK element: $foundElement"); |
| 7690 return foundElement; | 7539 return foundElement; |
| 7691 } | 7540 } |
| 7692 List<Element> remaining = new List<Element>(to); | 7541 List<Element> remaining = new List<Element>(to); |
| 7693 JavaSystem.arraycopy(conflictingMembers, 0, remaining, 0, to); | 7542 JavaSystem.arraycopy(conflictingMembers, 0, remaining, 0, to); |
| 7694 return new MultiplyDefinedElementImpl(_definingLibrary.context, remaining); | 7543 return new MultiplyDefinedElementImpl(_definingLibrary.context, remaining); |
| 7695 } | 7544 } |
| 7696 } | 7545 } |
| 7697 | 7546 |
| 7698 /** | 7547 /** |
| 7699 * Instances of the class `LibraryResolver` are used to resolve one or more mutu
ally dependent | 7548 * Instances of the class `LibraryResolver` are used to resolve one or more mutu
ally dependent |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7793 * Resolve the library specified by the given source in the given context. The
library is assumed | 7642 * Resolve the library specified by the given source in the given context. The
library is assumed |
| 7794 * to be embedded in the given source. | 7643 * to be embedded in the given source. |
| 7795 * | 7644 * |
| 7796 * @param librarySource the source specifying the defining compilation unit of
the library to be | 7645 * @param librarySource the source specifying the defining compilation unit of
the library to be |
| 7797 * resolved | 7646 * resolved |
| 7798 * @param unit the compilation unit representing the embedded library | 7647 * @param unit the compilation unit representing the embedded library |
| 7799 * @param fullAnalysis `true` if a full analysis should be performed | 7648 * @param fullAnalysis `true` if a full analysis should be performed |
| 7800 * @return the element representing the resolved library | 7649 * @return the element representing the resolved library |
| 7801 * @throws AnalysisException if the library could not be resolved for some rea
son | 7650 * @throws AnalysisException if the library could not be resolved for some rea
son |
| 7802 */ | 7651 */ |
| 7803 LibraryElement resolveEmbeddedLibrary(Source librarySource, | 7652 LibraryElement resolveEmbeddedLibrary( |
| 7804 CompilationUnit unit, bool fullAnalysis) { | 7653 Source librarySource, CompilationUnit unit, bool fullAnalysis) { |
| 7805 // | 7654 // |
| 7806 // Create the objects representing the library being resolved and the core | 7655 // Create the objects representing the library being resolved and the core |
| 7807 // library. | 7656 // library. |
| 7808 // | 7657 // |
| 7809 Library targetLibrary = _createLibraryWithUnit(librarySource, unit); | 7658 Library targetLibrary = _createLibraryWithUnit(librarySource, unit); |
| 7810 _coreLibrary = _libraryMap[_coreLibrarySource]; | 7659 _coreLibrary = _libraryMap[_coreLibrarySource]; |
| 7811 if (_coreLibrary == null) { | 7660 if (_coreLibrary == null) { |
| 7812 // This will only happen if the library being analyzed is the core | 7661 // This will only happen if the library being analyzed is the core |
| 7813 // library. | 7662 // library. |
| 7814 _coreLibrary = createLibrary(_coreLibrarySource); | 7663 _coreLibrary = createLibrary(_coreLibrarySource); |
| 7815 if (_coreLibrary == null) { | 7664 if (_coreLibrary == null) { |
| 7816 LibraryResolver2.missingCoreLibrary( | 7665 LibraryResolver2.missingCoreLibrary( |
| 7817 analysisContext, | 7666 analysisContext, _coreLibrarySource); |
| 7818 _coreLibrarySource); | |
| 7819 } | 7667 } |
| 7820 } | 7668 } |
| 7821 _asyncLibrary = _libraryMap[_asyncLibrarySource]; | 7669 _asyncLibrary = _libraryMap[_asyncLibrarySource]; |
| 7822 if (_asyncLibrary == null) { | 7670 if (_asyncLibrary == null) { |
| 7823 // This will only happen if the library being analyzed is the async | 7671 // This will only happen if the library being analyzed is the async |
| 7824 // library. | 7672 // library. |
| 7825 _asyncLibrary = createLibrary(_asyncLibrarySource); | 7673 _asyncLibrary = createLibrary(_asyncLibrarySource); |
| 7826 if (_asyncLibrary == null) { | 7674 if (_asyncLibrary == null) { |
| 7827 LibraryResolver2.missingAsyncLibrary( | 7675 LibraryResolver2.missingAsyncLibrary( |
| 7828 analysisContext, | 7676 analysisContext, _asyncLibrarySource); |
| 7829 _asyncLibrarySource); | |
| 7830 } | 7677 } |
| 7831 } | 7678 } |
| 7832 // | 7679 // |
| 7833 // Compute the set of libraries that need to be resolved together. | 7680 // Compute the set of libraries that need to be resolved together. |
| 7834 // | 7681 // |
| 7835 _computeEmbeddedLibraryDependencies(targetLibrary, unit); | 7682 _computeEmbeddedLibraryDependencies(targetLibrary, unit); |
| 7836 _librariesInCycles = _computeLibrariesInCycles(targetLibrary); | 7683 _librariesInCycles = _computeLibrariesInCycles(targetLibrary); |
| 7837 // | 7684 // |
| 7838 // Build the element models representing the libraries being resolved. | 7685 // Build the element models representing the libraries being resolved. |
| 7839 // This is done in three steps: | 7686 // This is done in three steps: |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7991 * @param dependencyMap a table mapping libraries to the collection of librari
es from which those | 7838 * @param dependencyMap a table mapping libraries to the collection of librari
es from which those |
| 7992 * libraries are referenced | 7839 * libraries are referenced |
| 7993 */ | 7840 */ |
| 7994 void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, | 7841 void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, |
| 7995 HashMap<Library, List<Library>> dependencyMap) { | 7842 HashMap<Library, List<Library>> dependencyMap) { |
| 7996 if (librariesInCycle.add(library)) { | 7843 if (librariesInCycle.add(library)) { |
| 7997 List<Library> dependentLibraries = dependencyMap[library]; | 7844 List<Library> dependentLibraries = dependencyMap[library]; |
| 7998 if (dependentLibraries != null) { | 7845 if (dependentLibraries != null) { |
| 7999 for (Library dependentLibrary in dependentLibraries) { | 7846 for (Library dependentLibrary in dependentLibraries) { |
| 8000 _addLibrariesInCycle( | 7847 _addLibrariesInCycle( |
| 8001 dependentLibrary, | 7848 dependentLibrary, librariesInCycle, dependencyMap); |
| 8002 librariesInCycle, | |
| 8003 dependencyMap); | |
| 8004 } | 7849 } |
| 8005 } | 7850 } |
| 8006 } | 7851 } |
| 8007 } | 7852 } |
| 8008 | 7853 |
| 8009 /** | 7854 /** |
| 8010 * Add the given library, and all libraries reachable from it that have not al
ready been visited, | 7855 * Add the given library, and all libraries reachable from it that have not al
ready been visited, |
| 8011 * to the given dependency map. | 7856 * to the given dependency map. |
| 8012 * | 7857 * |
| 8013 * @param library the library currently being added to the dependency map | 7858 * @param library the library currently being added to the dependency map |
| 8014 * @param dependencyMap the dependency map being computed | 7859 * @param dependencyMap the dependency map being computed |
| 8015 * @param visitedLibraries the libraries that have already been visited, used
to prevent infinite | 7860 * @param visitedLibraries the libraries that have already been visited, used
to prevent infinite |
| 8016 * recursion | 7861 * recursion |
| 8017 */ | 7862 */ |
| 8018 void _addToDependencyMap(Library library, HashMap<Library, | 7863 void _addToDependencyMap(Library library, |
| 8019 List<Library>> dependencyMap, Set<Library> visitedLibraries) { | 7864 HashMap<Library, List<Library>> dependencyMap, |
| 7865 Set<Library> visitedLibraries) { |
| 8020 if (visitedLibraries.add(library)) { | 7866 if (visitedLibraries.add(library)) { |
| 8021 bool asyncFound = false; | 7867 bool asyncFound = false; |
| 8022 for (Library referencedLibrary in library.importsAndExports) { | 7868 for (Library referencedLibrary in library.importsAndExports) { |
| 8023 _addDependencyToMap(dependencyMap, library, referencedLibrary); | 7869 _addDependencyToMap(dependencyMap, library, referencedLibrary); |
| 8024 _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries); | 7870 _addToDependencyMap(referencedLibrary, dependencyMap, visitedLibraries); |
| 8025 if (identical(referencedLibrary, _asyncLibrary)) { | 7871 if (identical(referencedLibrary, _asyncLibrary)) { |
| 8026 asyncFound = true; | 7872 asyncFound = true; |
| 8027 } | 7873 } |
| 8028 } | 7874 } |
| 8029 if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) { | 7875 if (!library.explicitlyImportsCore && !identical(library, _coreLibrary)) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8109 prefix = new PrefixElementImpl.forNode(prefixNode); | 7955 prefix = new PrefixElementImpl.forNode(prefixNode); |
| 8110 nameToPrefixMap[prefixName] = prefix; | 7956 nameToPrefixMap[prefixName] = prefix; |
| 8111 } | 7957 } |
| 8112 importElement.prefix = prefix; | 7958 importElement.prefix = prefix; |
| 8113 prefixNode.staticElement = prefix; | 7959 prefixNode.staticElement = prefix; |
| 8114 } | 7960 } |
| 8115 directive.element = importElement; | 7961 directive.element = importElement; |
| 8116 imports.add(importElement); | 7962 imports.add(importElement); |
| 8117 if (analysisContext.computeKindOf(importedSource) != | 7963 if (analysisContext.computeKindOf(importedSource) != |
| 8118 SourceKind.LIBRARY) { | 7964 SourceKind.LIBRARY) { |
| 8119 ErrorCode errorCode = (importElement.isDeferred ? | 7965 ErrorCode errorCode = (importElement.isDeferred |
| 8120 StaticWarningCode.IMPORT_OF_NON_LIBRARY : | 7966 ? StaticWarningCode.IMPORT_OF_NON_LIBRARY |
| 8121 CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); | 7967 : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); |
| 8122 _errorListener.onError( | 7968 _errorListener.onError(new AnalysisError.con2( |
| 8123 new AnalysisError.con2( | 7969 library.librarySource, uriLiteral.offset, uriLiteral.length, |
| 8124 library.librarySource, | 7970 errorCode, [uriLiteral.toSource()])); |
| 8125 uriLiteral.offset, | |
| 8126 uriLiteral.length, | |
| 8127 errorCode, | |
| 8128 [uriLiteral.toSource()])); | |
| 8129 } | 7971 } |
| 8130 } | 7972 } |
| 8131 } | 7973 } |
| 8132 } else if (directive is ExportDirective) { | 7974 } else if (directive is ExportDirective) { |
| 8133 ExportDirective exportDirective = directive; | 7975 ExportDirective exportDirective = directive; |
| 8134 Source exportedSource = exportDirective.source; | 7976 Source exportedSource = exportDirective.source; |
| 8135 if (exportedSource != null) { | 7977 if (exportedSource != null) { |
| 8136 // The exported source will be null if the URI in the export | 7978 // The exported source will be null if the URI in the export |
| 8137 // directive was invalid. | 7979 // directive was invalid. |
| 8138 Library exportedLibrary = _libraryMap[exportedSource]; | 7980 Library exportedLibrary = _libraryMap[exportedSource]; |
| 8139 if (exportedLibrary != null) { | 7981 if (exportedLibrary != null) { |
| 8140 ExportElementImpl exportElement = new ExportElementImpl(); | 7982 ExportElementImpl exportElement = new ExportElementImpl(); |
| 8141 StringLiteral uriLiteral = exportDirective.uri; | 7983 StringLiteral uriLiteral = exportDirective.uri; |
| 8142 exportElement.uriOffset = uriLiteral.offset; | 7984 exportElement.uriOffset = uriLiteral.offset; |
| 8143 exportElement.uriEnd = uriLiteral.end; | 7985 exportElement.uriEnd = uriLiteral.end; |
| 8144 exportElement.uri = exportDirective.uriContent; | 7986 exportElement.uri = exportDirective.uriContent; |
| 8145 exportElement.combinators = _buildCombinators(exportDirective); | 7987 exportElement.combinators = _buildCombinators(exportDirective); |
| 8146 LibraryElement exportedLibraryElement = | 7988 LibraryElement exportedLibraryElement = |
| 8147 exportedLibrary.libraryElement; | 7989 exportedLibrary.libraryElement; |
| 8148 if (exportedLibraryElement != null) { | 7990 if (exportedLibraryElement != null) { |
| 8149 exportElement.exportedLibrary = exportedLibraryElement; | 7991 exportElement.exportedLibrary = exportedLibraryElement; |
| 8150 } | 7992 } |
| 8151 directive.element = exportElement; | 7993 directive.element = exportElement; |
| 8152 exports.add(exportElement); | 7994 exports.add(exportElement); |
| 8153 if (analysisContext.computeKindOf(exportedSource) != | 7995 if (analysisContext.computeKindOf(exportedSource) != |
| 8154 SourceKind.LIBRARY) { | 7996 SourceKind.LIBRARY) { |
| 8155 _errorListener.onError( | 7997 _errorListener.onError(new AnalysisError.con2( |
| 8156 new AnalysisError.con2( | 7998 library.librarySource, uriLiteral.offset, uriLiteral.length, |
| 8157 library.librarySource, | 7999 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [ |
| 8158 uriLiteral.offset, | 8000 uriLiteral.toSource() |
| 8159 uriLiteral.length, | 8001 ])); |
| 8160 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, | |
| 8161 [uriLiteral.toSource()])); | |
| 8162 } | 8002 } |
| 8163 } | 8003 } |
| 8164 } | 8004 } |
| 8165 } | 8005 } |
| 8166 } | 8006 } |
| 8167 Source librarySource = library.librarySource; | 8007 Source librarySource = library.librarySource; |
| 8168 if (!library.explicitlyImportsCore && | 8008 if (!library.explicitlyImportsCore && |
| 8169 _coreLibrarySource != librarySource) { | 8009 _coreLibrarySource != librarySource) { |
| 8170 ImportElementImpl importElement = new ImportElementImpl(-1); | 8010 ImportElementImpl importElement = new ImportElementImpl(-1); |
| 8171 importElement.importedLibrary = _coreLibrary.libraryElement; | 8011 importElement.importedLibrary = _coreLibrary.libraryElement; |
| 8172 importElement.synthetic = true; | 8012 importElement.synthetic = true; |
| 8173 imports.add(importElement); | 8013 imports.add(importElement); |
| 8174 } | 8014 } |
| 8175 LibraryElementImpl libraryElement = library.libraryElement; | 8015 LibraryElementImpl libraryElement = library.libraryElement; |
| 8176 libraryElement.imports = imports; | 8016 libraryElement.imports = imports; |
| 8177 libraryElement.exports = exports; | 8017 libraryElement.exports = exports; |
| 8178 if (libraryElement.entryPoint == null) { | 8018 if (libraryElement.entryPoint == null) { |
| 8179 Namespace namespace = | 8019 Namespace namespace = new NamespaceBuilder() |
| 8180 new NamespaceBuilder().createExportNamespaceForLibrary(libraryElemen
t); | 8020 .createExportNamespaceForLibrary(libraryElement); |
| 8181 Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME); | 8021 Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME); |
| 8182 if (element is FunctionElement) { | 8022 if (element is FunctionElement) { |
| 8183 libraryElement.entryPoint = element; | 8023 libraryElement.entryPoint = element; |
| 8184 } | 8024 } |
| 8185 } | 8025 } |
| 8186 } | 8026 } |
| 8187 } | 8027 } |
| 8188 | 8028 |
| 8189 /** | 8029 /** |
| 8190 * Build element models for all of the libraries in the current cycle. | 8030 * Build element models for all of the libraries in the current cycle. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8223 * [ImplicitConstructorBuilder]. | 8063 * [ImplicitConstructorBuilder]. |
| 8224 * | 8064 * |
| 8225 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 8065 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 8226 */ | 8066 */ |
| 8227 void _buildImplicitConstructors() { | 8067 void _buildImplicitConstructors() { |
| 8228 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8068 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8229 ImplicitConstructorComputer computer = | 8069 ImplicitConstructorComputer computer = |
| 8230 new ImplicitConstructorComputer(_typeProvider); | 8070 new ImplicitConstructorComputer(_typeProvider); |
| 8231 for (Library library in _librariesInCycles) { | 8071 for (Library library in _librariesInCycles) { |
| 8232 for (Source source in library.compilationUnitSources) { | 8072 for (Source source in library.compilationUnitSources) { |
| 8233 computer.add( | 8073 computer.add(library.getAST(source), source, library.libraryElement, |
| 8234 library.getAST(source), | |
| 8235 source, | |
| 8236 library.libraryElement, | |
| 8237 library.libraryScope); | 8074 library.libraryScope); |
| 8238 } | 8075 } |
| 8239 } | 8076 } |
| 8240 computer.compute(); | 8077 computer.compute(); |
| 8241 }); | 8078 }); |
| 8242 } | 8079 } |
| 8243 | 8080 |
| 8244 /** | 8081 /** |
| 8245 * Resolve the types referenced by function type aliases across all of the fun
ction type aliases | 8082 * Resolve the types referenced by function type aliases across all of the fun
ction type aliases |
| 8246 * defined in the current cycle. | 8083 * defined in the current cycle. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 8258 if (member is FunctionTypeAlias) { | 8095 if (member is FunctionTypeAlias) { |
| 8259 typeAliases.add( | 8096 typeAliases.add( |
| 8260 new LibraryResolver_TypeAliasInfo(library, source, member)); | 8097 new LibraryResolver_TypeAliasInfo(library, source, member)); |
| 8261 } | 8098 } |
| 8262 } | 8099 } |
| 8263 } | 8100 } |
| 8264 } | 8101 } |
| 8265 // TODO(brianwilkerson) We need to sort the type aliases such that all | 8102 // TODO(brianwilkerson) We need to sort the type aliases such that all |
| 8266 // aliases referenced by an alias T are resolved before we resolve T. | 8103 // aliases referenced by an alias T are resolved before we resolve T. |
| 8267 for (LibraryResolver_TypeAliasInfo info in typeAliases) { | 8104 for (LibraryResolver_TypeAliasInfo info in typeAliases) { |
| 8268 TypeResolverVisitor visitor = | 8105 TypeResolverVisitor visitor = new TypeResolverVisitor.con1( |
| 8269 new TypeResolverVisitor.con1(info._library, info._source, _typeProvi
der); | 8106 info._library, info._source, _typeProvider); |
| 8270 info._typeAlias.accept(visitor); | 8107 info._typeAlias.accept(visitor); |
| 8271 } | 8108 } |
| 8272 }); | 8109 }); |
| 8273 } | 8110 } |
| 8274 | 8111 |
| 8275 /** | 8112 /** |
| 8276 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current | 8113 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current |
| 8277 * cycle. | 8114 * cycle. |
| 8278 * | 8115 * |
| 8279 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 8116 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 8280 */ | 8117 */ |
| 8281 void _buildTypeHierarchies() { | 8118 void _buildTypeHierarchies() { |
| 8282 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8119 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8283 for (Library library in _librariesInCycles) { | 8120 for (Library library in _librariesInCycles) { |
| 8284 for (Source source in library.compilationUnitSources) { | 8121 for (Source source in library.compilationUnitSources) { |
| 8285 TypeResolverVisitorFactory typeResolverVisitorFactory = | 8122 TypeResolverVisitorFactory typeResolverVisitorFactory = |
| 8286 analysisContext.typeResolverVisitorFactory; | 8123 analysisContext.typeResolverVisitorFactory; |
| 8287 TypeResolverVisitor visitor = (typeResolverVisitorFactory == null) ? | 8124 TypeResolverVisitor visitor = (typeResolverVisitorFactory == null) |
| 8288 new TypeResolverVisitor.con1(library, source, _typeProvider) : | 8125 ? new TypeResolverVisitor.con1(library, source, _typeProvider) |
| 8289 typeResolverVisitorFactory(library, source, _typeProvider); | 8126 : typeResolverVisitorFactory(library, source, _typeProvider); |
| 8290 library.getAST(source).accept(visitor); | 8127 library.getAST(source).accept(visitor); |
| 8291 } | 8128 } |
| 8292 } | 8129 } |
| 8293 }); | 8130 }); |
| 8294 } | 8131 } |
| 8295 | 8132 |
| 8296 /** | 8133 /** |
| 8297 * Compute a dependency map of libraries reachable from the given library. A d
ependency map is a | 8134 * Compute a dependency map of libraries reachable from the given library. A d
ependency map is a |
| 8298 * table that maps individual libraries to a list of the libraries that either
import or export | 8135 * table that maps individual libraries to a list of the libraries that either
import or export |
| 8299 * those libraries. | 8136 * those libraries. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 8311 return dependencyMap; | 8148 return dependencyMap; |
| 8312 } | 8149 } |
| 8313 | 8150 |
| 8314 /** | 8151 /** |
| 8315 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the | 8152 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the |
| 8316 * class [Library] to represent them, and record the references in the library
objects. | 8153 * class [Library] to represent them, and record the references in the library
objects. |
| 8317 * | 8154 * |
| 8318 * @param library the library to be processed to find libraries that have not
yet been traversed | 8155 * @param library the library to be processed to find libraries that have not
yet been traversed |
| 8319 * @throws AnalysisException if some portion of the library graph could not be
traversed | 8156 * @throws AnalysisException if some portion of the library graph could not be
traversed |
| 8320 */ | 8157 */ |
| 8321 void _computeEmbeddedLibraryDependencies(Library library, | 8158 void _computeEmbeddedLibraryDependencies( |
| 8322 CompilationUnit unit) { | 8159 Library library, CompilationUnit unit) { |
| 8323 Source librarySource = library.librarySource; | 8160 Source librarySource = library.librarySource; |
| 8324 HashSet<Source> exportedSources = new HashSet<Source>(); | 8161 HashSet<Source> exportedSources = new HashSet<Source>(); |
| 8325 HashSet<Source> importedSources = new HashSet<Source>(); | 8162 HashSet<Source> importedSources = new HashSet<Source>(); |
| 8326 for (Directive directive in unit.directives) { | 8163 for (Directive directive in unit.directives) { |
| 8327 if (directive is ExportDirective) { | 8164 if (directive is ExportDirective) { |
| 8328 Source exportSource = _resolveSource(librarySource, directive); | 8165 Source exportSource = _resolveSource(librarySource, directive); |
| 8329 if (exportSource != null) { | 8166 if (exportSource != null) { |
| 8330 exportedSources.add(exportSource); | 8167 exportedSources.add(exportSource); |
| 8331 } | 8168 } |
| 8332 } else if (directive is ImportDirective) { | 8169 } else if (directive is ImportDirective) { |
| 8333 Source importSource = _resolveSource(librarySource, directive); | 8170 Source importSource = _resolveSource(librarySource, directive); |
| 8334 if (importSource != null) { | 8171 if (importSource != null) { |
| 8335 importedSources.add(importSource); | 8172 importedSources.add(importSource); |
| 8336 } | 8173 } |
| 8337 } | 8174 } |
| 8338 } | 8175 } |
| 8339 _computeLibraryDependenciesFromDirectives( | 8176 _computeLibraryDependenciesFromDirectives(library, |
| 8340 library, | 8177 new List.from(importedSources), new List.from(exportedSources)); |
| 8341 new List.from(importedSources), | |
| 8342 new List.from(exportedSources)); | |
| 8343 } | 8178 } |
| 8344 | 8179 |
| 8345 /** | 8180 /** |
| 8346 * Return a collection containing all of the libraries reachable from the give
n library that are | 8181 * Return a collection containing all of the libraries reachable from the give
n library that are |
| 8347 * contained in a cycle that includes the given library. | 8182 * contained in a cycle that includes the given library. |
| 8348 * | 8183 * |
| 8349 * @param library the library that must be included in any cycles whose member
s are to be returned | 8184 * @param library the library that must be included in any cycles whose member
s are to be returned |
| 8350 * @return all of the libraries referenced by the given library that have a ci
rcular reference | 8185 * @return all of the libraries referenced by the given library that have a ci
rcular reference |
| 8351 * back to the given library | 8186 * back to the given library |
| 8352 */ | 8187 */ |
| 8353 Set<Library> _computeLibrariesInCycles(Library library) { | 8188 Set<Library> _computeLibrariesInCycles(Library library) { |
| 8354 HashMap<Library, List<Library>> dependencyMap = | 8189 HashMap<Library, List<Library>> dependencyMap = |
| 8355 _computeDependencyMap(library); | 8190 _computeDependencyMap(library); |
| 8356 Set<Library> librariesInCycle = new HashSet<Library>(); | 8191 Set<Library> librariesInCycle = new HashSet<Library>(); |
| 8357 _addLibrariesInCycle(library, librariesInCycle, dependencyMap); | 8192 _addLibrariesInCycle(library, librariesInCycle, dependencyMap); |
| 8358 return librariesInCycle; | 8193 return librariesInCycle; |
| 8359 } | 8194 } |
| 8360 | 8195 |
| 8361 /** | 8196 /** |
| 8362 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the | 8197 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the |
| 8363 * class [Library] to represent them, and record the references in the library
objects. | 8198 * class [Library] to represent them, and record the references in the library
objects. |
| 8364 * | 8199 * |
| 8365 * @param library the library to be processed to find libraries that have not
yet been traversed | 8200 * @param library the library to be processed to find libraries that have not
yet been traversed |
| 8366 * @throws AnalysisException if some portion of the library graph could not be
traversed | 8201 * @throws AnalysisException if some portion of the library graph could not be
traversed |
| 8367 */ | 8202 */ |
| 8368 void _computeLibraryDependencies(Library library) { | 8203 void _computeLibraryDependencies(Library library) { |
| 8369 Source librarySource = library.librarySource; | 8204 Source librarySource = library.librarySource; |
| 8370 _computeLibraryDependenciesFromDirectives( | 8205 _computeLibraryDependenciesFromDirectives(library, |
| 8371 library, | |
| 8372 analysisContext.computeImportedLibraries(librarySource), | 8206 analysisContext.computeImportedLibraries(librarySource), |
| 8373 analysisContext.computeExportedLibraries(librarySource)); | 8207 analysisContext.computeExportedLibraries(librarySource)); |
| 8374 } | 8208 } |
| 8375 | 8209 |
| 8376 /** | 8210 /** |
| 8377 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the | 8211 * Recursively traverse the libraries reachable from the given library, creati
ng instances of the |
| 8378 * class [Library] to represent them, and record the references in the library
objects. | 8212 * class [Library] to represent them, and record the references in the library
objects. |
| 8379 * | 8213 * |
| 8380 * @param library the library to be processed to find libraries that have not
yet been traversed | 8214 * @param library the library to be processed to find libraries that have not
yet been traversed |
| 8381 * @param importedSources an array containing the sources that are imported in
to the given library | 8215 * @param importedSources an array containing the sources that are imported in
to the given library |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8489 identifiers[i] = names[i].name; | 8323 identifiers[i] = names[i].name; |
| 8490 } | 8324 } |
| 8491 return identifiers; | 8325 return identifiers; |
| 8492 } | 8326 } |
| 8493 | 8327 |
| 8494 /** | 8328 /** |
| 8495 * Compute a value for all of the constants in the libraries being analyzed. | 8329 * Compute a value for all of the constants in the libraries being analyzed. |
| 8496 */ | 8330 */ |
| 8497 void _performConstantEvaluation() { | 8331 void _performConstantEvaluation() { |
| 8498 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8332 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8499 ConstantValueComputer computer = | 8333 ConstantValueComputer computer = new ConstantValueComputer( |
| 8500 new ConstantValueComputer(_typeProvider, analysisContext.declaredVaria
bles); | 8334 _typeProvider, analysisContext.declaredVariables); |
| 8501 for (Library library in _librariesInCycles) { | 8335 for (Library library in _librariesInCycles) { |
| 8502 for (Source source in library.compilationUnitSources) { | 8336 for (Source source in library.compilationUnitSources) { |
| 8503 try { | 8337 try { |
| 8504 CompilationUnit unit = library.getAST(source); | 8338 CompilationUnit unit = library.getAST(source); |
| 8505 if (unit != null) { | 8339 if (unit != null) { |
| 8506 computer.add(unit); | 8340 computer.add(unit); |
| 8507 } | 8341 } |
| 8508 } on AnalysisException catch (exception, stackTrace) { | 8342 } on AnalysisException catch (exception, stackTrace) { |
| 8509 AnalysisEngine.instance.logger.logError( | 8343 AnalysisEngine.instance.logger.logError( |
| 8510 "Internal Error: Could not access AST for ${source.fullName} dur
ing constant evaluation", | 8344 "Internal Error: Could not access AST for ${source.fullName} dur
ing constant evaluation", |
| 8511 new CaughtException(exception, stackTrace)); | 8345 new CaughtException(exception, stackTrace)); |
| 8512 } | 8346 } |
| 8513 } | 8347 } |
| 8514 } | 8348 } |
| 8515 computer.computeValues(); | 8349 computer.computeValues(); |
| 8516 // As a temporary workaround for issue 21572, run ConstantVerifier now. | 8350 // As a temporary workaround for issue 21572, run ConstantVerifier now. |
| 8517 // TODO(paulberry): remove this workaround once issue 21572 is fixed. | 8351 // TODO(paulberry): remove this workaround once issue 21572 is fixed. |
| 8518 for (Library library in _librariesInCycles) { | 8352 for (Library library in _librariesInCycles) { |
| 8519 for (Source source in library.compilationUnitSources) { | 8353 for (Source source in library.compilationUnitSources) { |
| 8520 try { | 8354 try { |
| 8521 CompilationUnit unit = library.getAST(source); | 8355 CompilationUnit unit = library.getAST(source); |
| 8522 ErrorReporter errorReporter = | 8356 ErrorReporter errorReporter = |
| 8523 new ErrorReporter(_errorListener, source); | 8357 new ErrorReporter(_errorListener, source); |
| 8524 ConstantVerifier constantVerifier = | 8358 ConstantVerifier constantVerifier = new ConstantVerifier( |
| 8525 new ConstantVerifier(errorReporter, library.libraryElement, _typ
eProvider); | 8359 errorReporter, library.libraryElement, _typeProvider); |
| 8526 unit.accept(constantVerifier); | 8360 unit.accept(constantVerifier); |
| 8527 } on AnalysisException catch (exception, stackTrace) { | 8361 } on AnalysisException catch (exception, stackTrace) { |
| 8528 AnalysisEngine.instance.logger.logError( | 8362 AnalysisEngine.instance.logger.logError( |
| 8529 "Internal Error: Could not access AST for ${source.fullName} " | 8363 "Internal Error: Could not access AST for ${source.fullName} " |
| 8530 "during constant verification", | 8364 "during constant verification", |
| 8531 new CaughtException(exception, stackTrace)); | 8365 new CaughtException(exception, stackTrace)); |
| 8532 } | 8366 } |
| 8533 } | 8367 } |
| 8534 } | 8368 } |
| 8535 }); | 8369 }); |
| 8536 } | 8370 } |
| 8537 | 8371 |
| 8538 /** | 8372 /** |
| 8539 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. | 8373 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. |
| 8540 * | 8374 * |
| (...skipping 14 matching lines...) Expand all Loading... |
| 8555 * the library cannot be analyzed | 8389 * the library cannot be analyzed |
| 8556 */ | 8390 */ |
| 8557 void _resolveReferencesAndTypesInLibrary(Library library) { | 8391 void _resolveReferencesAndTypesInLibrary(Library library) { |
| 8558 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8392 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8559 for (Source source in library.compilationUnitSources) { | 8393 for (Source source in library.compilationUnitSources) { |
| 8560 CompilationUnit ast = library.getAST(source); | 8394 CompilationUnit ast = library.getAST(source); |
| 8561 ast.accept( | 8395 ast.accept( |
| 8562 new VariableResolverVisitor.con1(library, source, _typeProvider)); | 8396 new VariableResolverVisitor.con1(library, source, _typeProvider)); |
| 8563 ResolverVisitorFactory visitorFactory = | 8397 ResolverVisitorFactory visitorFactory = |
| 8564 analysisContext.resolverVisitorFactory; | 8398 analysisContext.resolverVisitorFactory; |
| 8565 ResolverVisitor visitor = visitorFactory != null ? | 8399 ResolverVisitor visitor = visitorFactory != null |
| 8566 visitorFactory(library, source, _typeProvider) : | 8400 ? visitorFactory(library, source, _typeProvider) |
| 8567 new ResolverVisitor.con1(library, source, _typeProvider); | 8401 : new ResolverVisitor.con1(library, source, _typeProvider); |
| 8568 ast.accept(visitor); | 8402 ast.accept(visitor); |
| 8569 } | 8403 } |
| 8570 }); | 8404 }); |
| 8571 } | 8405 } |
| 8572 | 8406 |
| 8573 /** | 8407 /** |
| 8574 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the | 8408 * Return the result of resolving the URI of the given URI-based directive aga
inst the URI of the |
| 8575 * given library, or `null` if the URI is not valid. | 8409 * given library, or `null` if the URI is not valid. |
| 8576 * | 8410 * |
| 8577 * @param librarySource the source representing the library containing the dir
ective | 8411 * @param librarySource the source representing the library containing the dir
ective |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8678 * Note that because Dart allows circular imports between libraries, it is pos
sible that more than | 8512 * Note that because Dart allows circular imports between libraries, it is pos
sible that more than |
| 8679 * one library will need to be resolved. In such cases the error listener can
receive errors from | 8513 * one library will need to be resolved. In such cases the error listener can
receive errors from |
| 8680 * multiple libraries. | 8514 * multiple libraries. |
| 8681 * | 8515 * |
| 8682 * @param librarySource the source specifying the defining compilation unit of
the library to be | 8516 * @param librarySource the source specifying the defining compilation unit of
the library to be |
| 8683 * resolved | 8517 * resolved |
| 8684 * @param fullAnalysis `true` if a full analysis should be performed | 8518 * @param fullAnalysis `true` if a full analysis should be performed |
| 8685 * @return the element representing the resolved library | 8519 * @return the element representing the resolved library |
| 8686 * @throws AnalysisException if the library could not be resolved for some rea
son | 8520 * @throws AnalysisException if the library could not be resolved for some rea
son |
| 8687 */ | 8521 */ |
| 8688 LibraryElement resolveLibrary(Source librarySource, | 8522 LibraryElement resolveLibrary( |
| 8689 List<ResolvableLibrary> librariesInCycle) { | 8523 Source librarySource, List<ResolvableLibrary> librariesInCycle) { |
| 8690 // | 8524 // |
| 8691 // Build the map of libraries that are known. | 8525 // Build the map of libraries that are known. |
| 8692 // | 8526 // |
| 8693 this._librariesInCycle = librariesInCycle; | 8527 this._librariesInCycle = librariesInCycle; |
| 8694 _libraryMap = _buildLibraryMap(); | 8528 _libraryMap = _buildLibraryMap(); |
| 8695 ResolvableLibrary targetLibrary = _libraryMap[librarySource]; | 8529 ResolvableLibrary targetLibrary = _libraryMap[librarySource]; |
| 8696 _coreLibrary = _libraryMap[_coreLibrarySource]; | 8530 _coreLibrary = _libraryMap[_coreLibrarySource]; |
| 8697 _asyncLibrary = _libraryMap[_asyncLibrarySource]; | 8531 _asyncLibrary = _libraryMap[_asyncLibrarySource]; |
| 8698 // | 8532 // |
| 8699 // Build the element models representing the libraries being resolved. | 8533 // Build the element models representing the libraries being resolved. |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8824 prefix = new PrefixElementImpl.forNode(prefixNode); | 8658 prefix = new PrefixElementImpl.forNode(prefixNode); |
| 8825 nameToPrefixMap[prefixName] = prefix; | 8659 nameToPrefixMap[prefixName] = prefix; |
| 8826 } | 8660 } |
| 8827 importElement.prefix = prefix; | 8661 importElement.prefix = prefix; |
| 8828 prefixNode.staticElement = prefix; | 8662 prefixNode.staticElement = prefix; |
| 8829 } | 8663 } |
| 8830 directive.element = importElement; | 8664 directive.element = importElement; |
| 8831 imports.add(importElement); | 8665 imports.add(importElement); |
| 8832 if (analysisContext.computeKindOf(importedSource) != | 8666 if (analysisContext.computeKindOf(importedSource) != |
| 8833 SourceKind.LIBRARY) { | 8667 SourceKind.LIBRARY) { |
| 8834 ErrorCode errorCode = (importElement.isDeferred ? | 8668 ErrorCode errorCode = (importElement.isDeferred |
| 8835 StaticWarningCode.IMPORT_OF_NON_LIBRARY : | 8669 ? StaticWarningCode.IMPORT_OF_NON_LIBRARY |
| 8836 CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); | 8670 : CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY); |
| 8837 _errorListener.onError( | 8671 _errorListener.onError(new AnalysisError.con2( |
| 8838 new AnalysisError.con2( | 8672 library.librarySource, uriLiteral.offset, uriLiteral.length, |
| 8839 library.librarySource, | 8673 errorCode, [uriLiteral.toSource()])); |
| 8840 uriLiteral.offset, | |
| 8841 uriLiteral.length, | |
| 8842 errorCode, | |
| 8843 [uriLiteral.toSource()])); | |
| 8844 } | 8674 } |
| 8845 } | 8675 } |
| 8846 } | 8676 } |
| 8847 } else if (directive is ExportDirective) { | 8677 } else if (directive is ExportDirective) { |
| 8848 ExportDirective exportDirective = directive; | 8678 ExportDirective exportDirective = directive; |
| 8849 Source exportedSource = exportDirective.source; | 8679 Source exportedSource = exportDirective.source; |
| 8850 if (exportedSource != null && | 8680 if (exportedSource != null && |
| 8851 analysisContext.exists(exportedSource)) { | 8681 analysisContext.exists(exportedSource)) { |
| 8852 // The exported source will be null if the URI in the export | 8682 // The exported source will be null if the URI in the export |
| 8853 // directive was invalid. | 8683 // directive was invalid. |
| 8854 ResolvableLibrary exportedLibrary = _libraryMap[exportedSource]; | 8684 ResolvableLibrary exportedLibrary = _libraryMap[exportedSource]; |
| 8855 if (exportedLibrary != null) { | 8685 if (exportedLibrary != null) { |
| 8856 ExportElementImpl exportElement = new ExportElementImpl(); | 8686 ExportElementImpl exportElement = new ExportElementImpl(); |
| 8857 StringLiteral uriLiteral = exportDirective.uri; | 8687 StringLiteral uriLiteral = exportDirective.uri; |
| 8858 if (uriLiteral != null) { | 8688 if (uriLiteral != null) { |
| 8859 exportElement.uriOffset = uriLiteral.offset; | 8689 exportElement.uriOffset = uriLiteral.offset; |
| 8860 exportElement.uriEnd = uriLiteral.end; | 8690 exportElement.uriEnd = uriLiteral.end; |
| 8861 } | 8691 } |
| 8862 exportElement.uri = exportDirective.uriContent; | 8692 exportElement.uri = exportDirective.uriContent; |
| 8863 exportElement.combinators = _buildCombinators(exportDirective); | 8693 exportElement.combinators = _buildCombinators(exportDirective); |
| 8864 LibraryElement exportedLibraryElement = | 8694 LibraryElement exportedLibraryElement = |
| 8865 exportedLibrary.libraryElement; | 8695 exportedLibrary.libraryElement; |
| 8866 if (exportedLibraryElement != null) { | 8696 if (exportedLibraryElement != null) { |
| 8867 exportElement.exportedLibrary = exportedLibraryElement; | 8697 exportElement.exportedLibrary = exportedLibraryElement; |
| 8868 } | 8698 } |
| 8869 directive.element = exportElement; | 8699 directive.element = exportElement; |
| 8870 exports.add(exportElement); | 8700 exports.add(exportElement); |
| 8871 if (analysisContext.computeKindOf(exportedSource) != | 8701 if (analysisContext.computeKindOf(exportedSource) != |
| 8872 SourceKind.LIBRARY) { | 8702 SourceKind.LIBRARY) { |
| 8873 _errorListener.onError( | 8703 _errorListener.onError(new AnalysisError.con2( |
| 8874 new AnalysisError.con2( | 8704 library.librarySource, uriLiteral.offset, uriLiteral.length, |
| 8875 library.librarySource, | 8705 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, [ |
| 8876 uriLiteral.offset, | 8706 uriLiteral.toSource() |
| 8877 uriLiteral.length, | 8707 ])); |
| 8878 CompileTimeErrorCode.EXPORT_OF_NON_LIBRARY, | |
| 8879 [uriLiteral.toSource()])); | |
| 8880 } | 8708 } |
| 8881 } | 8709 } |
| 8882 } | 8710 } |
| 8883 } | 8711 } |
| 8884 } | 8712 } |
| 8885 Source librarySource = library.librarySource; | 8713 Source librarySource = library.librarySource; |
| 8886 if (!library.explicitlyImportsCore && | 8714 if (!library.explicitlyImportsCore && |
| 8887 _coreLibrarySource != librarySource) { | 8715 _coreLibrarySource != librarySource) { |
| 8888 ImportElementImpl importElement = new ImportElementImpl(-1); | 8716 ImportElementImpl importElement = new ImportElementImpl(-1); |
| 8889 importElement.importedLibrary = _coreLibrary.libraryElement; | 8717 importElement.importedLibrary = _coreLibrary.libraryElement; |
| 8890 importElement.synthetic = true; | 8718 importElement.synthetic = true; |
| 8891 imports.add(importElement); | 8719 imports.add(importElement); |
| 8892 } | 8720 } |
| 8893 LibraryElementImpl libraryElement = library.libraryElement; | 8721 LibraryElementImpl libraryElement = library.libraryElement; |
| 8894 libraryElement.imports = imports; | 8722 libraryElement.imports = imports; |
| 8895 libraryElement.exports = exports; | 8723 libraryElement.exports = exports; |
| 8896 if (libraryElement.entryPoint == null) { | 8724 if (libraryElement.entryPoint == null) { |
| 8897 Namespace namespace = | 8725 Namespace namespace = new NamespaceBuilder() |
| 8898 new NamespaceBuilder().createExportNamespaceForLibrary(libraryElemen
t); | 8726 .createExportNamespaceForLibrary(libraryElement); |
| 8899 Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME); | 8727 Element element = namespace.get(LibraryElementBuilder.ENTRY_POINT_NAME); |
| 8900 if (element is FunctionElement) { | 8728 if (element is FunctionElement) { |
| 8901 libraryElement.entryPoint = element; | 8729 libraryElement.entryPoint = element; |
| 8902 } | 8730 } |
| 8903 } | 8731 } |
| 8904 } | 8732 } |
| 8905 } | 8733 } |
| 8906 | 8734 |
| 8907 /** | 8735 /** |
| 8908 * Build element models for all of the libraries in the current cycle. | 8736 * Build element models for all of the libraries in the current cycle. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 8939 * Finish steps that the [buildTypeHierarchies] could not perform, see | 8767 * Finish steps that the [buildTypeHierarchies] could not perform, see |
| 8940 * [ImplicitConstructorBuilder]. | 8768 * [ImplicitConstructorBuilder]. |
| 8941 * | 8769 * |
| 8942 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 8770 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 8943 */ | 8771 */ |
| 8944 void _buildImplicitConstructors() { | 8772 void _buildImplicitConstructors() { |
| 8945 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8773 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8946 ImplicitConstructorComputer computer = | 8774 ImplicitConstructorComputer computer = |
| 8947 new ImplicitConstructorComputer(_typeProvider); | 8775 new ImplicitConstructorComputer(_typeProvider); |
| 8948 for (ResolvableLibrary library in _librariesInCycle) { | 8776 for (ResolvableLibrary library in _librariesInCycle) { |
| 8949 for (ResolvableCompilationUnit unit in | 8777 for (ResolvableCompilationUnit unit |
| 8950 library.resolvableCompilationUnits) { | 8778 in library.resolvableCompilationUnits) { |
| 8951 Source source = unit.source; | 8779 Source source = unit.source; |
| 8952 CompilationUnit ast = unit.compilationUnit; | 8780 CompilationUnit ast = unit.compilationUnit; |
| 8953 computer.add( | 8781 computer |
| 8954 ast, | 8782 .add(ast, source, library.libraryElement, library.libraryScope); |
| 8955 source, | |
| 8956 library.libraryElement, | |
| 8957 library.libraryScope); | |
| 8958 } | 8783 } |
| 8959 } | 8784 } |
| 8960 computer.compute(); | 8785 computer.compute(); |
| 8961 }); | 8786 }); |
| 8962 } | 8787 } |
| 8963 | 8788 |
| 8964 HashMap<Source, ResolvableLibrary> _buildLibraryMap() { | 8789 HashMap<Source, ResolvableLibrary> _buildLibraryMap() { |
| 8965 HashMap<Source, ResolvableLibrary> libraryMap = | 8790 HashMap<Source, ResolvableLibrary> libraryMap = |
| 8966 new HashMap<Source, ResolvableLibrary>(); | 8791 new HashMap<Source, ResolvableLibrary>(); |
| 8967 int libraryCount = _librariesInCycle.length; | 8792 int libraryCount = _librariesInCycle.length; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 8984 * Resolve the types referenced by function type aliases across all of the fun
ction type aliases | 8809 * Resolve the types referenced by function type aliases across all of the fun
ction type aliases |
| 8985 * defined in the current cycle. | 8810 * defined in the current cycle. |
| 8986 * | 8811 * |
| 8987 * @throws AnalysisException if any of the function type aliases could not be
resolved | 8812 * @throws AnalysisException if any of the function type aliases could not be
resolved |
| 8988 */ | 8813 */ |
| 8989 void _buildTypeAliases() { | 8814 void _buildTypeAliases() { |
| 8990 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8815 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 8991 List<LibraryResolver2_TypeAliasInfo> typeAliases = | 8816 List<LibraryResolver2_TypeAliasInfo> typeAliases = |
| 8992 new List<LibraryResolver2_TypeAliasInfo>(); | 8817 new List<LibraryResolver2_TypeAliasInfo>(); |
| 8993 for (ResolvableLibrary library in _librariesInCycle) { | 8818 for (ResolvableLibrary library in _librariesInCycle) { |
| 8994 for (ResolvableCompilationUnit unit in | 8819 for (ResolvableCompilationUnit unit |
| 8995 library.resolvableCompilationUnits) { | 8820 in library.resolvableCompilationUnits) { |
| 8996 for (CompilationUnitMember member in | 8821 for (CompilationUnitMember member |
| 8997 unit.compilationUnit.declarations) { | 8822 in unit.compilationUnit.declarations) { |
| 8998 if (member is FunctionTypeAlias) { | 8823 if (member is FunctionTypeAlias) { |
| 8999 typeAliases.add( | 8824 typeAliases.add(new LibraryResolver2_TypeAliasInfo( |
| 9000 new LibraryResolver2_TypeAliasInfo(library, unit.source, membe
r)); | 8825 library, unit.source, member)); |
| 9001 } | 8826 } |
| 9002 } | 8827 } |
| 9003 } | 8828 } |
| 9004 } | 8829 } |
| 9005 // TODO(brianwilkerson) We need to sort the type aliases such that all | 8830 // TODO(brianwilkerson) We need to sort the type aliases such that all |
| 9006 // aliases referenced by an alias T are resolved before we resolve T. | 8831 // aliases referenced by an alias T are resolved before we resolve T. |
| 9007 for (LibraryResolver2_TypeAliasInfo info in typeAliases) { | 8832 for (LibraryResolver2_TypeAliasInfo info in typeAliases) { |
| 9008 TypeResolverVisitor visitor = | 8833 TypeResolverVisitor visitor = new TypeResolverVisitor.con4( |
| 9009 new TypeResolverVisitor.con4(info._library, info._source, _typeProvi
der); | 8834 info._library, info._source, _typeProvider); |
| 9010 info._typeAlias.accept(visitor); | 8835 info._typeAlias.accept(visitor); |
| 9011 } | 8836 } |
| 9012 }); | 8837 }); |
| 9013 } | 8838 } |
| 9014 | 8839 |
| 9015 /** | 8840 /** |
| 9016 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current | 8841 * Resolve the type hierarchy across all of the types declared in the librarie
s in the current |
| 9017 * cycle. | 8842 * cycle. |
| 9018 * | 8843 * |
| 9019 * @throws AnalysisException if any of the type hierarchies could not be resol
ved | 8844 * @throws AnalysisException if any of the type hierarchies could not be resol
ved |
| 9020 */ | 8845 */ |
| 9021 void _buildTypeHierarchies() { | 8846 void _buildTypeHierarchies() { |
| 9022 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8847 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 9023 for (ResolvableLibrary library in _librariesInCycle) { | 8848 for (ResolvableLibrary library in _librariesInCycle) { |
| 9024 for (ResolvableCompilationUnit unit in | 8849 for (ResolvableCompilationUnit unit |
| 9025 library.resolvableCompilationUnits) { | 8850 in library.resolvableCompilationUnits) { |
| 9026 Source source = unit.source; | 8851 Source source = unit.source; |
| 9027 CompilationUnit ast = unit.compilationUnit; | 8852 CompilationUnit ast = unit.compilationUnit; |
| 9028 TypeResolverVisitor visitor = | 8853 TypeResolverVisitor visitor = |
| 9029 new TypeResolverVisitor.con4(library, source, _typeProvider); | 8854 new TypeResolverVisitor.con4(library, source, _typeProvider); |
| 9030 ast.accept(visitor); | 8855 ast.accept(visitor); |
| 9031 } | 8856 } |
| 9032 } | 8857 } |
| 9033 }); | 8858 }); |
| 9034 } | 8859 } |
| 9035 | 8860 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 9046 identifiers[i] = names[i].name; | 8871 identifiers[i] = names[i].name; |
| 9047 } | 8872 } |
| 9048 return identifiers; | 8873 return identifiers; |
| 9049 } | 8874 } |
| 9050 | 8875 |
| 9051 /** | 8876 /** |
| 9052 * Compute a value for all of the constants in the libraries being analyzed. | 8877 * Compute a value for all of the constants in the libraries being analyzed. |
| 9053 */ | 8878 */ |
| 9054 void _performConstantEvaluation() { | 8879 void _performConstantEvaluation() { |
| 9055 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8880 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 9056 ConstantValueComputer computer = | 8881 ConstantValueComputer computer = new ConstantValueComputer( |
| 9057 new ConstantValueComputer(_typeProvider, analysisContext.declaredVaria
bles); | 8882 _typeProvider, analysisContext.declaredVariables); |
| 9058 for (ResolvableLibrary library in _librariesInCycle) { | 8883 for (ResolvableLibrary library in _librariesInCycle) { |
| 9059 for (ResolvableCompilationUnit unit in | 8884 for (ResolvableCompilationUnit unit |
| 9060 library.resolvableCompilationUnits) { | 8885 in library.resolvableCompilationUnits) { |
| 9061 CompilationUnit ast = unit.compilationUnit; | 8886 CompilationUnit ast = unit.compilationUnit; |
| 9062 if (ast != null) { | 8887 if (ast != null) { |
| 9063 computer.add(ast); | 8888 computer.add(ast); |
| 9064 } | 8889 } |
| 9065 } | 8890 } |
| 9066 } | 8891 } |
| 9067 computer.computeValues(); | 8892 computer.computeValues(); |
| 9068 // As a temporary workaround for issue 21572, run ConstantVerifier now. | 8893 // As a temporary workaround for issue 21572, run ConstantVerifier now. |
| 9069 // TODO(paulberry): remove this workaround once issue 21572 is fixed. | 8894 // TODO(paulberry): remove this workaround once issue 21572 is fixed. |
| 9070 for (ResolvableLibrary library in _librariesInCycle) { | 8895 for (ResolvableLibrary library in _librariesInCycle) { |
| 9071 for (ResolvableCompilationUnit unit in | 8896 for (ResolvableCompilationUnit unit |
| 9072 library.resolvableCompilationUnits) { | 8897 in library.resolvableCompilationUnits) { |
| 9073 CompilationUnit ast = unit.compilationUnit; | 8898 CompilationUnit ast = unit.compilationUnit; |
| 9074 ErrorReporter errorReporter = | 8899 ErrorReporter errorReporter = |
| 9075 new ErrorReporter(_errorListener, unit.source); | 8900 new ErrorReporter(_errorListener, unit.source); |
| 9076 ConstantVerifier constantVerifier = | 8901 ConstantVerifier constantVerifier = new ConstantVerifier( |
| 9077 new ConstantVerifier(errorReporter, library.libraryElement, _typeP
rovider); | 8902 errorReporter, library.libraryElement, _typeProvider); |
| 9078 ast.accept(constantVerifier); | 8903 ast.accept(constantVerifier); |
| 9079 } | 8904 } |
| 9080 } | 8905 } |
| 9081 }); | 8906 }); |
| 9082 } | 8907 } |
| 9083 | 8908 |
| 9084 /** | 8909 /** |
| 9085 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. | 8910 * Resolve the identifiers and perform type analysis in the libraries in the c
urrent cycle. |
| 9086 * | 8911 * |
| 9087 * @throws AnalysisException if any of the identifiers could not be resolved o
r if any of the | 8912 * @throws AnalysisException if any of the identifiers could not be resolved o
r if any of the |
| 9088 * libraries could not have their types analyzed | 8913 * libraries could not have their types analyzed |
| 9089 */ | 8914 */ |
| 9090 void _resolveReferencesAndTypes() { | 8915 void _resolveReferencesAndTypes() { |
| 9091 for (ResolvableLibrary library in _librariesInCycle) { | 8916 for (ResolvableLibrary library in _librariesInCycle) { |
| 9092 _resolveReferencesAndTypesInLibrary(library); | 8917 _resolveReferencesAndTypesInLibrary(library); |
| 9093 } | 8918 } |
| 9094 } | 8919 } |
| 9095 | 8920 |
| 9096 /** | 8921 /** |
| 9097 * Resolve the identifiers and perform type analysis in the given library. | 8922 * Resolve the identifiers and perform type analysis in the given library. |
| 9098 * | 8923 * |
| 9099 * @param library the library to be resolved | 8924 * @param library the library to be resolved |
| 9100 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in | 8925 * @throws AnalysisException if any of the identifiers could not be resolved o
r if the types in |
| 9101 * the library cannot be analyzed | 8926 * the library cannot be analyzed |
| 9102 */ | 8927 */ |
| 9103 void _resolveReferencesAndTypesInLibrary(ResolvableLibrary library) { | 8928 void _resolveReferencesAndTypesInLibrary(ResolvableLibrary library) { |
| 9104 PerformanceStatistics.resolve.makeCurrentWhile(() { | 8929 PerformanceStatistics.resolve.makeCurrentWhile(() { |
| 9105 for (ResolvableCompilationUnit unit in library.resolvableCompilationUnits) | 8930 for (ResolvableCompilationUnit unit |
| 9106 { | 8931 in library.resolvableCompilationUnits) { |
| 9107 Source source = unit.source; | 8932 Source source = unit.source; |
| 9108 CompilationUnit ast = unit.compilationUnit; | 8933 CompilationUnit ast = unit.compilationUnit; |
| 9109 ast.accept( | 8934 ast.accept( |
| 9110 new VariableResolverVisitor.con3(library, source, _typeProvider)); | 8935 new VariableResolverVisitor.con3(library, source, _typeProvider)); |
| 9111 ResolverVisitor visitor = | 8936 ResolverVisitor visitor = |
| 9112 new ResolverVisitor.con4(library, source, _typeProvider); | 8937 new ResolverVisitor.con4(library, source, _typeProvider); |
| 9113 ast.accept(visitor); | 8938 ast.accept(visitor); |
| 9114 } | 8939 } |
| 9115 }); | 8940 }); |
| 9116 } | 8941 } |
| 9117 | 8942 |
| 9118 /** | 8943 /** |
| 9119 * Report that the async library could not be resolved in the given | 8944 * Report that the async library could not be resolved in the given |
| 9120 * [analysisContext] and throw an exception. [asyncLibrarySource] is the sour
ce | 8945 * [analysisContext] and throw an exception. [asyncLibrarySource] is the sour
ce |
| 9121 * representing the async library. | 8946 * representing the async library. |
| 9122 */ | 8947 */ |
| 9123 static void missingAsyncLibrary(AnalysisContext analysisContext, | 8948 static void missingAsyncLibrary( |
| 9124 Source asyncLibrarySource) { | 8949 AnalysisContext analysisContext, Source asyncLibrarySource) { |
| 9125 throw new AnalysisException("Could not resolve dart:async"); | 8950 throw new AnalysisException("Could not resolve dart:async"); |
| 9126 } | 8951 } |
| 9127 | 8952 |
| 9128 /** | 8953 /** |
| 9129 * Report that the core library could not be resolved in the given analysis co
ntext and throw an | 8954 * Report that the core library could not be resolved in the given analysis co
ntext and throw an |
| 9130 * exception. | 8955 * exception. |
| 9131 * | 8956 * |
| 9132 * @param analysisContext the analysis context in which the failure occurred | 8957 * @param analysisContext the analysis context in which the failure occurred |
| 9133 * @param coreLibrarySource the source representing the core library | 8958 * @param coreLibrarySource the source representing the core library |
| 9134 * @throws AnalysisException always | 8959 * @throws AnalysisException always |
| 9135 */ | 8960 */ |
| 9136 static void missingCoreLibrary(AnalysisContext analysisContext, | 8961 static void missingCoreLibrary( |
| 9137 Source coreLibrarySource) { | 8962 AnalysisContext analysisContext, Source coreLibrarySource) { |
| 9138 throw new AnalysisException("Could not resolve dart:core"); | 8963 throw new AnalysisException("Could not resolve dart:core"); |
| 9139 } | 8964 } |
| 9140 } | 8965 } |
| 9141 | 8966 |
| 9142 | |
| 9143 /** | 8967 /** |
| 9144 * Instances of the class `TypeAliasInfo` hold information about a [TypeAlias]. | 8968 * Instances of the class `TypeAliasInfo` hold information about a [TypeAlias]. |
| 9145 */ | 8969 */ |
| 9146 class LibraryResolver2_TypeAliasInfo { | 8970 class LibraryResolver2_TypeAliasInfo { |
| 9147 final ResolvableLibrary _library; | 8971 final ResolvableLibrary _library; |
| 9148 | 8972 |
| 9149 final Source _source; | 8973 final Source _source; |
| 9150 | 8974 |
| 9151 final FunctionTypeAlias _typeAlias; | 8975 final FunctionTypeAlias _typeAlias; |
| 9152 | 8976 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9184 * Instances of the class `LibraryScope` implement a scope containing all of the
names defined | 9008 * Instances of the class `LibraryScope` implement a scope containing all of the
names defined |
| 9185 * in a given library. | 9009 * in a given library. |
| 9186 */ | 9010 */ |
| 9187 class LibraryScope extends EnclosedScope { | 9011 class LibraryScope extends EnclosedScope { |
| 9188 /** | 9012 /** |
| 9189 * Initialize a newly created scope representing the names defined in the give
n library. | 9013 * Initialize a newly created scope representing the names defined in the give
n library. |
| 9190 * | 9014 * |
| 9191 * @param definingLibrary the element representing the library represented by
this scope | 9015 * @param definingLibrary the element representing the library represented by
this scope |
| 9192 * @param errorListener the listener that is to be informed when an error is e
ncountered | 9016 * @param errorListener the listener that is to be informed when an error is e
ncountered |
| 9193 */ | 9017 */ |
| 9194 LibraryScope(LibraryElement definingLibrary, | 9018 LibraryScope( |
| 9195 AnalysisErrorListener errorListener) | 9019 LibraryElement definingLibrary, AnalysisErrorListener errorListener) |
| 9196 : super(new LibraryImportScope(definingLibrary, errorListener)) { | 9020 : super(new LibraryImportScope(definingLibrary, errorListener)) { |
| 9197 _defineTopLevelNames(definingLibrary); | 9021 _defineTopLevelNames(definingLibrary); |
| 9198 } | 9022 } |
| 9199 | 9023 |
| 9200 @override | 9024 @override |
| 9201 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { | 9025 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { |
| 9202 if (existing is PrefixElement) { | 9026 if (existing is PrefixElement) { |
| 9203 // TODO(scheglov) consider providing actual 'nameOffset' from the | 9027 // TODO(scheglov) consider providing actual 'nameOffset' from the |
| 9204 // synthetic accessor | 9028 // synthetic accessor |
| 9205 int offset = duplicate.nameOffset; | 9029 int offset = duplicate.nameOffset; |
| 9206 if (duplicate is PropertyAccessorElement) { | 9030 if (duplicate is PropertyAccessorElement) { |
| 9207 PropertyAccessorElement accessor = duplicate; | 9031 PropertyAccessorElement accessor = duplicate; |
| 9208 if (accessor.isSynthetic) { | 9032 if (accessor.isSynthetic) { |
| 9209 offset = accessor.variable.nameOffset; | 9033 offset = accessor.variable.nameOffset; |
| 9210 } | 9034 } |
| 9211 } | 9035 } |
| 9212 return new AnalysisError.con2( | 9036 return new AnalysisError.con2(duplicate.source, offset, |
| 9213 duplicate.source, | |
| 9214 offset, | |
| 9215 duplicate.displayName.length, | 9037 duplicate.displayName.length, |
| 9216 CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, | 9038 CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER, [ |
| 9217 [existing.displayName]); | 9039 existing.displayName |
| 9040 ]); |
| 9218 } | 9041 } |
| 9219 return super.getErrorForDuplicate(existing, duplicate); | 9042 return super.getErrorForDuplicate(existing, duplicate); |
| 9220 } | 9043 } |
| 9221 | 9044 |
| 9222 /** | 9045 /** |
| 9223 * Add to this scope all of the public top-level names that are defined in the
given compilation | 9046 * Add to this scope all of the public top-level names that are defined in the
given compilation |
| 9224 * unit. | 9047 * unit. |
| 9225 * | 9048 * |
| 9226 * @param compilationUnit the compilation unit defining the top-level names to
be added to this | 9049 * @param compilationUnit the compilation unit defining the top-level names to
be added to this |
| 9227 * scope | 9050 * scope |
| 9228 */ | 9051 */ |
| 9229 void _defineLocalNames(CompilationUnitElement compilationUnit) { | 9052 void _defineLocalNames(CompilationUnitElement compilationUnit) { |
| 9230 for (PropertyAccessorElement element in compilationUnit.accessors) { | 9053 for (PropertyAccessorElement element in compilationUnit.accessors) { |
| 9231 define(element); | 9054 define(element); |
| 9232 } | 9055 } |
| 9233 for (ClassElement element in compilationUnit.enums) { | 9056 for (ClassElement element in compilationUnit.enums) { |
| 9234 define(element); | 9057 define(element); |
| 9235 } | 9058 } |
| 9236 for (FunctionElement element in compilationUnit.functions) { | 9059 for (FunctionElement element in compilationUnit.functions) { |
| 9237 define(element); | 9060 define(element); |
| 9238 } | 9061 } |
| 9239 for (FunctionTypeAliasElement element in | 9062 for (FunctionTypeAliasElement element |
| 9240 compilationUnit.functionTypeAliases) { | 9063 in compilationUnit.functionTypeAliases) { |
| 9241 define(element); | 9064 define(element); |
| 9242 } | 9065 } |
| 9243 for (ClassElement element in compilationUnit.types) { | 9066 for (ClassElement element in compilationUnit.types) { |
| 9244 define(element); | 9067 define(element); |
| 9245 } | 9068 } |
| 9246 } | 9069 } |
| 9247 | 9070 |
| 9248 /** | 9071 /** |
| 9249 * Add to this scope all of the names that are explicitly defined in the given
library. | 9072 * Add to this scope all of the names that are explicitly defined in the given
library. |
| 9250 * | 9073 * |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9495 return new Namespace(definedNames); | 9318 return new Namespace(definedNames); |
| 9496 } | 9319 } |
| 9497 | 9320 |
| 9498 /** | 9321 /** |
| 9499 * Create a namespace representing the export namespace of the given library. | 9322 * Create a namespace representing the export namespace of the given library. |
| 9500 * | 9323 * |
| 9501 * @param library the library whose export namespace is to be created | 9324 * @param library the library whose export namespace is to be created |
| 9502 * @return the export namespace that was created | 9325 * @return the export namespace that was created |
| 9503 */ | 9326 */ |
| 9504 Namespace createExportNamespaceForLibrary(LibraryElement library) => | 9327 Namespace createExportNamespaceForLibrary(LibraryElement library) => |
| 9505 new Namespace(_createExportMapping(library, new HashSet<LibraryElement>())
); | 9328 new Namespace( |
| 9329 _createExportMapping(library, new HashSet<LibraryElement>())); |
| 9506 | 9330 |
| 9507 /** | 9331 /** |
| 9508 * Create a namespace representing the import namespace of the given library. | 9332 * Create a namespace representing the import namespace of the given library. |
| 9509 * | 9333 * |
| 9510 * @param library the library whose import namespace is to be created | 9334 * @param library the library whose import namespace is to be created |
| 9511 * @return the import namespace that was created | 9335 * @return the import namespace that was created |
| 9512 */ | 9336 */ |
| 9513 Namespace createImportNamespaceForDirective(ImportElement element) { | 9337 Namespace createImportNamespaceForDirective(ImportElement element) { |
| 9514 LibraryElement importedLibrary = element.importedLibrary; | 9338 LibraryElement importedLibrary = element.importedLibrary; |
| 9515 if (importedLibrary == null) { | 9339 if (importedLibrary == null) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 9540 } | 9364 } |
| 9541 return new Namespace(definedNames); | 9365 return new Namespace(definedNames); |
| 9542 } | 9366 } |
| 9543 | 9367 |
| 9544 /** | 9368 /** |
| 9545 * Add all of the names in the given namespace to the given mapping table. | 9369 * Add all of the names in the given namespace to the given mapping table. |
| 9546 * | 9370 * |
| 9547 * @param definedNames the mapping table to which the names in the given names
pace are to be added | 9371 * @param definedNames the mapping table to which the names in the given names
pace are to be added |
| 9548 * @param namespace the namespace containing the names to be added to this nam
espace | 9372 * @param namespace the namespace containing the names to be added to this nam
espace |
| 9549 */ | 9373 */ |
| 9550 void _addAllFromMap(Map<String, Element> definedNames, Map<String, | 9374 void _addAllFromMap( |
| 9551 Element> newNames) { | 9375 Map<String, Element> definedNames, Map<String, Element> newNames) { |
| 9552 newNames.forEach((String name, Element element) { | 9376 newNames.forEach((String name, Element element) { |
| 9553 definedNames[name] = element; | 9377 definedNames[name] = element; |
| 9554 }); | 9378 }); |
| 9555 } | 9379 } |
| 9556 | 9380 |
| 9557 /** | 9381 /** |
| 9558 * Add all of the names in the given namespace to the given mapping table. | 9382 * Add all of the names in the given namespace to the given mapping table. |
| 9559 * | 9383 * |
| 9560 * @param definedNames the mapping table to which the names in the given names
pace are to be added | 9384 * @param definedNames the mapping table to which the names in the given names
pace are to be added |
| 9561 * @param namespace the namespace containing the names to be added to this nam
espace | 9385 * @param namespace the namespace containing the names to be added to this nam
espace |
| 9562 */ | 9386 */ |
| 9563 void _addAllFromNamespace(Map<String, Element> definedNames, | 9387 void _addAllFromNamespace( |
| 9564 Namespace namespace) { | 9388 Map<String, Element> definedNames, Namespace namespace) { |
| 9565 if (namespace != null) { | 9389 if (namespace != null) { |
| 9566 _addAllFromMap(definedNames, namespace.definedNames); | 9390 _addAllFromMap(definedNames, namespace.definedNames); |
| 9567 } | 9391 } |
| 9568 } | 9392 } |
| 9569 | 9393 |
| 9570 /** | 9394 /** |
| 9571 * Add the given element to the given mapping table if it has a publicly visib
le name. | 9395 * Add the given element to the given mapping table if it has a publicly visib
le name. |
| 9572 * | 9396 * |
| 9573 * @param definedNames the mapping table to which the public name is to be add
ed | 9397 * @param definedNames the mapping table to which the public name is to be add
ed |
| 9574 * @param element the element to be added | 9398 * @param element the element to be added |
| (...skipping 17 matching lines...) Expand all Loading... |
| 9592 CompilationUnitElement compilationUnit) { | 9416 CompilationUnitElement compilationUnit) { |
| 9593 for (PropertyAccessorElement element in compilationUnit.accessors) { | 9417 for (PropertyAccessorElement element in compilationUnit.accessors) { |
| 9594 _addIfPublic(definedNames, element); | 9418 _addIfPublic(definedNames, element); |
| 9595 } | 9419 } |
| 9596 for (ClassElement element in compilationUnit.enums) { | 9420 for (ClassElement element in compilationUnit.enums) { |
| 9597 _addIfPublic(definedNames, element); | 9421 _addIfPublic(definedNames, element); |
| 9598 } | 9422 } |
| 9599 for (FunctionElement element in compilationUnit.functions) { | 9423 for (FunctionElement element in compilationUnit.functions) { |
| 9600 _addIfPublic(definedNames, element); | 9424 _addIfPublic(definedNames, element); |
| 9601 } | 9425 } |
| 9602 for (FunctionTypeAliasElement element in | 9426 for (FunctionTypeAliasElement element |
| 9603 compilationUnit.functionTypeAliases) { | 9427 in compilationUnit.functionTypeAliases) { |
| 9604 _addIfPublic(definedNames, element); | 9428 _addIfPublic(definedNames, element); |
| 9605 } | 9429 } |
| 9606 for (ClassElement element in compilationUnit.types) { | 9430 for (ClassElement element in compilationUnit.types) { |
| 9607 _addIfPublic(definedNames, element); | 9431 _addIfPublic(definedNames, element); |
| 9608 } | 9432 } |
| 9609 } | 9433 } |
| 9610 | 9434 |
| 9611 /** | 9435 /** |
| 9612 * Apply the given combinators to all of the names in the given mapping table. | 9436 * Apply the given combinators to all of the names in the given mapping table. |
| 9613 * | 9437 * |
| 9614 * @param definedNames the mapping table to which the namespace operations are
to be applied | 9438 * @param definedNames the mapping table to which the namespace operations are
to be applied |
| 9615 * @param combinators the combinators to be applied | 9439 * @param combinators the combinators to be applied |
| 9616 */ | 9440 */ |
| 9617 HashMap<String, Element> _applyCombinators(HashMap<String, | 9441 HashMap<String, Element> _applyCombinators( |
| 9618 Element> definedNames, List<NamespaceCombinator> combinators) { | 9442 HashMap<String, Element> definedNames, |
| 9443 List<NamespaceCombinator> combinators) { |
| 9619 for (NamespaceCombinator combinator in combinators) { | 9444 for (NamespaceCombinator combinator in combinators) { |
| 9620 if (combinator is HideElementCombinator) { | 9445 if (combinator is HideElementCombinator) { |
| 9621 _hide(definedNames, combinator.hiddenNames); | 9446 _hide(definedNames, combinator.hiddenNames); |
| 9622 } else if (combinator is ShowElementCombinator) { | 9447 } else if (combinator is ShowElementCombinator) { |
| 9623 definedNames = _show(definedNames, combinator.shownNames); | 9448 definedNames = _show(definedNames, combinator.shownNames); |
| 9624 } else { | 9449 } else { |
| 9625 // Internal error. | 9450 // Internal error. |
| 9626 AnalysisEngine.instance.logger.logError( | 9451 AnalysisEngine.instance.logger |
| 9627 "Unknown type of combinator: ${combinator.runtimeType}"); | 9452 .logError("Unknown type of combinator: ${combinator.runtimeType}"); |
| 9628 } | 9453 } |
| 9629 } | 9454 } |
| 9630 return definedNames; | 9455 return definedNames; |
| 9631 } | 9456 } |
| 9632 | 9457 |
| 9633 /** | 9458 /** |
| 9634 * Apply the given prefix to all of the names in the table of defined names. | 9459 * Apply the given prefix to all of the names in the table of defined names. |
| 9635 * | 9460 * |
| 9636 * @param definedNames the names that were defined before this operation | 9461 * @param definedNames the names that were defined before this operation |
| 9637 * @param prefixElement the element defining the prefix to be added to the nam
es | 9462 * @param prefixElement the element defining the prefix to be added to the nam
es |
| 9638 */ | 9463 */ |
| 9639 HashMap<String, Element> _applyPrefix(HashMap<String, Element> definedNames, | 9464 HashMap<String, Element> _applyPrefix( |
| 9640 PrefixElement prefixElement) { | 9465 HashMap<String, Element> definedNames, PrefixElement prefixElement) { |
| 9641 if (prefixElement != null) { | 9466 if (prefixElement != null) { |
| 9642 String prefix = prefixElement.name; | 9467 String prefix = prefixElement.name; |
| 9643 HashMap<String, Element> newNames = new HashMap<String, Element>(); | 9468 HashMap<String, Element> newNames = new HashMap<String, Element>(); |
| 9644 definedNames.forEach((String name, Element element) { | 9469 definedNames.forEach((String name, Element element) { |
| 9645 newNames["$prefix.$name"] = element; | 9470 newNames["$prefix.$name"] = element; |
| 9646 }); | 9471 }); |
| 9647 return newNames; | 9472 return newNames; |
| 9648 } else { | 9473 } else { |
| 9649 return definedNames; | 9474 return definedNames; |
| 9650 } | 9475 } |
| 9651 } | 9476 } |
| 9652 | 9477 |
| 9653 /** | 9478 /** |
| 9654 * Create a mapping table representing the export namespace of the given libra
ry. | 9479 * Create a mapping table representing the export namespace of the given libra
ry. |
| 9655 * | 9480 * |
| 9656 * @param library the library whose public namespace is to be created | 9481 * @param library the library whose public namespace is to be created |
| 9657 * @param visitedElements a set of libraries that do not need to be visited wh
en processing the | 9482 * @param visitedElements a set of libraries that do not need to be visited wh
en processing the |
| 9658 * export directives of the given library because all of the names de
fined by them will | 9483 * export directives of the given library because all of the names de
fined by them will |
| 9659 * be added by another library | 9484 * be added by another library |
| 9660 * @return the mapping table that was created | 9485 * @return the mapping table that was created |
| 9661 */ | 9486 */ |
| 9662 HashMap<String, Element> _createExportMapping(LibraryElement library, | 9487 HashMap<String, Element> _createExportMapping( |
| 9663 HashSet<LibraryElement> visitedElements) { | 9488 LibraryElement library, HashSet<LibraryElement> visitedElements) { |
| 9664 visitedElements.add(library); | 9489 visitedElements.add(library); |
| 9665 try { | 9490 try { |
| 9666 HashMap<String, Element> definedNames = new HashMap<String, Element>(); | 9491 HashMap<String, Element> definedNames = new HashMap<String, Element>(); |
| 9667 for (ExportElement element in library.exports) { | 9492 for (ExportElement element in library.exports) { |
| 9668 LibraryElement exportedLibrary = element.exportedLibrary; | 9493 LibraryElement exportedLibrary = element.exportedLibrary; |
| 9669 if (exportedLibrary != null && | 9494 if (exportedLibrary != null && |
| 9670 !visitedElements.contains(exportedLibrary)) { | 9495 !visitedElements.contains(exportedLibrary)) { |
| 9671 // | 9496 // |
| 9672 // The exported library will be null if the URI does not reference a | 9497 // The exported library will be null if the URI does not reference a |
| 9673 // valid library. | 9498 // valid library. |
| 9674 // | 9499 // |
| 9675 HashMap<String, Element> exportedNames = | 9500 HashMap<String, Element> exportedNames = |
| 9676 _createExportMapping(exportedLibrary, visitedElements); | 9501 _createExportMapping(exportedLibrary, visitedElements); |
| 9677 exportedNames = _applyCombinators(exportedNames, element.combinators); | 9502 exportedNames = _applyCombinators(exportedNames, element.combinators); |
| 9678 _addAllFromMap(definedNames, exportedNames); | 9503 _addAllFromMap(definedNames, exportedNames); |
| 9679 } | 9504 } |
| 9680 } | 9505 } |
| 9681 _addAllFromNamespace( | 9506 _addAllFromNamespace(definedNames, |
| 9682 definedNames, | 9507 (library.context as InternalAnalysisContext) |
| 9683 (library.context as InternalAnalysisContext).getPublicNamespace(librar
y)); | 9508 .getPublicNamespace(library)); |
| 9684 return definedNames; | 9509 return definedNames; |
| 9685 } finally { | 9510 } finally { |
| 9686 visitedElements.remove(library); | 9511 visitedElements.remove(library); |
| 9687 } | 9512 } |
| 9688 } | 9513 } |
| 9689 | 9514 |
| 9690 /** | 9515 /** |
| 9691 * Hide all of the given names by removing them from the given collection of d
efined names. | 9516 * Hide all of the given names by removing them from the given collection of d
efined names. |
| 9692 * | 9517 * |
| 9693 * @param definedNames the names that were defined before this operation | 9518 * @param definedNames the names that were defined before this operation |
| 9694 * @param hiddenNames the names to be hidden | 9519 * @param hiddenNames the names to be hidden |
| 9695 */ | 9520 */ |
| 9696 void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) { | 9521 void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) { |
| 9697 for (String name in hiddenNames) { | 9522 for (String name in hiddenNames) { |
| 9698 definedNames.remove(name); | 9523 definedNames.remove(name); |
| 9699 definedNames.remove("$name="); | 9524 definedNames.remove("$name="); |
| 9700 } | 9525 } |
| 9701 } | 9526 } |
| 9702 | 9527 |
| 9703 /** | 9528 /** |
| 9704 * Show only the given names by removing all other names from the given collec
tion of defined | 9529 * Show only the given names by removing all other names from the given collec
tion of defined |
| 9705 * names. | 9530 * names. |
| 9706 * | 9531 * |
| 9707 * @param definedNames the names that were defined before this operation | 9532 * @param definedNames the names that were defined before this operation |
| 9708 * @param shownNames the names to be shown | 9533 * @param shownNames the names to be shown |
| 9709 */ | 9534 */ |
| 9710 HashMap<String, Element> _show(HashMap<String, Element> definedNames, | 9535 HashMap<String, Element> _show( |
| 9711 List<String> shownNames) { | 9536 HashMap<String, Element> definedNames, List<String> shownNames) { |
| 9712 HashMap<String, Element> newNames = new HashMap<String, Element>(); | 9537 HashMap<String, Element> newNames = new HashMap<String, Element>(); |
| 9713 for (String name in shownNames) { | 9538 for (String name in shownNames) { |
| 9714 Element element = definedNames[name]; | 9539 Element element = definedNames[name]; |
| 9715 if (element != null) { | 9540 if (element != null) { |
| 9716 newNames[name] = element; | 9541 newNames[name] = element; |
| 9717 } | 9542 } |
| 9718 String setterName = "$name="; | 9543 String setterName = "$name="; |
| 9719 element = definedNames[setterName]; | 9544 element = definedNames[setterName]; |
| 9720 if (element != null) { | 9545 if (element != null) { |
| 9721 newNames[setterName] = element; | 9546 newNames[setterName] = element; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 9748 */ | 9573 */ |
| 9749 OverrideVerifier(this._manager, this._errorReporter); | 9574 OverrideVerifier(this._manager, this._errorReporter); |
| 9750 | 9575 |
| 9751 @override | 9576 @override |
| 9752 Object visitMethodDeclaration(MethodDeclaration node) { | 9577 Object visitMethodDeclaration(MethodDeclaration node) { |
| 9753 ExecutableElement element = node.element; | 9578 ExecutableElement element = node.element; |
| 9754 if (_isOverride(element)) { | 9579 if (_isOverride(element)) { |
| 9755 if (_getOverriddenMember(element) == null) { | 9580 if (_getOverriddenMember(element) == null) { |
| 9756 if (element is MethodElement) { | 9581 if (element is MethodElement) { |
| 9757 _errorReporter.reportErrorForNode( | 9582 _errorReporter.reportErrorForNode( |
| 9758 HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, | 9583 HintCode.OVERRIDE_ON_NON_OVERRIDING_METHOD, node.name); |
| 9759 node.name); | |
| 9760 } else if (element is PropertyAccessorElement) { | 9584 } else if (element is PropertyAccessorElement) { |
| 9761 if (element.isGetter) { | 9585 if (element.isGetter) { |
| 9762 _errorReporter.reportErrorForNode( | 9586 _errorReporter.reportErrorForNode( |
| 9763 HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, | 9587 HintCode.OVERRIDE_ON_NON_OVERRIDING_GETTER, node.name); |
| 9764 node.name); | |
| 9765 } else { | 9588 } else { |
| 9766 _errorReporter.reportErrorForNode( | 9589 _errorReporter.reportErrorForNode( |
| 9767 HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, | 9590 HintCode.OVERRIDE_ON_NON_OVERRIDING_SETTER, node.name); |
| 9768 node.name); | |
| 9769 } | 9591 } |
| 9770 } | 9592 } |
| 9771 } | 9593 } |
| 9772 } | 9594 } |
| 9773 return super.visitMethodDeclaration(node); | 9595 return super.visitMethodDeclaration(node); |
| 9774 } | 9596 } |
| 9775 | 9597 |
| 9776 /** | 9598 /** |
| 9777 * Return the member that overrides the given member. | 9599 * Return the member that overrides the given member. |
| 9778 * | 9600 * |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10280 | 10102 |
| 10281 /** | 10103 /** |
| 10282 * The enumeration `ResolverErrorCode` defines the error codes used for errors | 10104 * The enumeration `ResolverErrorCode` defines the error codes used for errors |
| 10283 * detected by the resolver. The convention for this class is for the name of | 10105 * detected by the resolver. The convention for this class is for the name of |
| 10284 * the error code to indicate the problem that caused the error to be generated | 10106 * the error code to indicate the problem that caused the error to be generated |
| 10285 * and for the error message to explain what is wrong and, when appropriate, how | 10107 * and for the error message to explain what is wrong and, when appropriate, how |
| 10286 * the problem can be corrected. | 10108 * the problem can be corrected. |
| 10287 */ | 10109 */ |
| 10288 class ResolverErrorCode extends ErrorCode { | 10110 class ResolverErrorCode extends ErrorCode { |
| 10289 static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = | 10111 static const ResolverErrorCode BREAK_LABEL_ON_SWITCH_MEMBER = |
| 10290 const ResolverErrorCode( | 10112 const ResolverErrorCode('BREAK_LABEL_ON_SWITCH_MEMBER', |
| 10291 'BREAK_LABEL_ON_SWITCH_MEMBER', | |
| 10292 "Break label resolves to case or default statement"); | 10113 "Break label resolves to case or default statement"); |
| 10293 | 10114 |
| 10294 static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = | 10115 static const ResolverErrorCode CONTINUE_LABEL_ON_SWITCH = |
| 10295 const ResolverErrorCode( | 10116 const ResolverErrorCode('CONTINUE_LABEL_ON_SWITCH', |
| 10296 'CONTINUE_LABEL_ON_SWITCH', | |
| 10297 "A continue label resolves to switch, must be loop or switch member"); | 10117 "A continue label resolves to switch, must be loop or switch member"); |
| 10298 | 10118 |
| 10299 static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = | 10119 static const ResolverErrorCode MISSING_LIBRARY_DIRECTIVE_WITH_PART = |
| 10300 const ResolverErrorCode( | 10120 const ResolverErrorCode('MISSING_LIBRARY_DIRECTIVE_WITH_PART', |
| 10301 'MISSING_LIBRARY_DIRECTIVE_WITH_PART', | |
| 10302 "Libraries that have parts must have a library directive"); | 10121 "Libraries that have parts must have a library directive"); |
| 10303 | 10122 |
| 10304 /** | 10123 /** |
| 10305 * Initialize a newly created error code to have the given [name]. The message | 10124 * Initialize a newly created error code to have the given [name]. The message |
| 10306 * associated with the error will be created from the given [message] | 10125 * associated with the error will be created from the given [message] |
| 10307 * template. The correction associated with the error will be created from the | 10126 * template. The correction associated with the error will be created from the |
| 10308 * given [correction] template. | 10127 * given [correction] template. |
| 10309 */ | 10128 */ |
| 10310 const ResolverErrorCode(String name, String message, [String correction]) | 10129 const ResolverErrorCode(String name, String message, [String correction]) |
| 10311 : super(name, message, correction); | 10130 : super(name, message, correction); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10387 */ | 10206 */ |
| 10388 bool resolveOnlyCommentInFunctionBody = false; | 10207 bool resolveOnlyCommentInFunctionBody = false; |
| 10389 | 10208 |
| 10390 /** | 10209 /** |
| 10391 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 10210 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 10392 * | 10211 * |
| 10393 * @param library the library containing the compilation unit being resolved | 10212 * @param library the library containing the compilation unit being resolved |
| 10394 * @param source the source representing the compilation unit being visited | 10213 * @param source the source representing the compilation unit being visited |
| 10395 * @param typeProvider the object used to access the types from the core libra
ry | 10214 * @param typeProvider the object used to access the types from the core libra
ry |
| 10396 */ | 10215 */ |
| 10397 ResolverVisitor.con1(Library library, Source source, | 10216 ResolverVisitor.con1( |
| 10398 TypeProvider typeProvider, {StaticTypeAnalyzer typeAnalyzer, | 10217 Library library, Source source, TypeProvider typeProvider, |
| 10218 {StaticTypeAnalyzer typeAnalyzer, |
| 10399 StaticTypeAnalyzerFactory typeAnalyzerFactory}) | 10219 StaticTypeAnalyzerFactory typeAnalyzerFactory}) |
| 10400 : super.con1(library, source, typeProvider) { | 10220 : super.con1(library, source, typeProvider) { |
| 10401 this._inheritanceManager = library.inheritanceManager; | 10221 this._inheritanceManager = library.inheritanceManager; |
| 10402 this._elementResolver = new ElementResolver(this); | 10222 this._elementResolver = new ElementResolver(this); |
| 10403 this._typeAnalyzer = typeAnalyzer != null ? | 10223 this._typeAnalyzer = typeAnalyzer != null |
| 10404 typeAnalyzer : | 10224 ? typeAnalyzer |
| 10405 (typeAnalyzerFactory != null ? | 10225 : (typeAnalyzerFactory != null |
| 10406 typeAnalyzerFactory(this) : | 10226 ? typeAnalyzerFactory(this) |
| 10407 new StaticTypeAnalyzer(this)); | 10227 : new StaticTypeAnalyzer(this)); |
| 10408 } | 10228 } |
| 10409 | 10229 |
| 10410 | |
| 10411 /** | 10230 /** |
| 10412 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 10231 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 10413 * | 10232 * |
| 10414 * @param definingLibrary the element for the library containing the compilati
on unit being | 10233 * @param definingLibrary the element for the library containing the compilati
on unit being |
| 10415 * visited | 10234 * visited |
| 10416 * @param source the source representing the compilation unit being visited | 10235 * @param source the source representing the compilation unit being visited |
| 10417 * @param typeProvider the object used to access the types from the core libra
ry | 10236 * @param typeProvider the object used to access the types from the core libra
ry |
| 10418 * @param errorListener the error listener that will be informed of any errors
that are found | 10237 * @param errorListener the error listener that will be informed of any errors
that are found |
| 10419 * during resolution | 10238 * during resolution |
| 10420 */ | 10239 */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 10431 * Initialize a newly created visitor to resolve the nodes in an AST node. | 10250 * Initialize a newly created visitor to resolve the nodes in an AST node. |
| 10432 * | 10251 * |
| 10433 * @param definingLibrary the element for the library containing the node bein
g visited | 10252 * @param definingLibrary the element for the library containing the node bein
g visited |
| 10434 * @param source the source representing the compilation unit containing the n
ode being visited | 10253 * @param source the source representing the compilation unit containing the n
ode being visited |
| 10435 * @param typeProvider the object used to access the types from the core libra
ry | 10254 * @param typeProvider the object used to access the types from the core libra
ry |
| 10436 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited | 10255 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited |
| 10437 * @param errorListener the error listener that will be informed of any errors
that are found | 10256 * @param errorListener the error listener that will be informed of any errors
that are found |
| 10438 * during resolution | 10257 * during resolution |
| 10439 */ | 10258 */ |
| 10440 ResolverVisitor.con3(LibraryElement definingLibrary, Source source, | 10259 ResolverVisitor.con3(LibraryElement definingLibrary, Source source, |
| 10441 TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorLis
tener) | 10260 TypeProvider typeProvider, Scope nameScope, |
| 10261 AnalysisErrorListener errorListener) |
| 10442 : super.con3( | 10262 : super.con3( |
| 10443 definingLibrary, | 10263 definingLibrary, source, typeProvider, nameScope, errorListener) { |
| 10444 source, | |
| 10445 typeProvider, | |
| 10446 nameScope, | |
| 10447 errorListener) { | |
| 10448 this._inheritanceManager = new InheritanceManager(definingLibrary); | 10264 this._inheritanceManager = new InheritanceManager(definingLibrary); |
| 10449 this._elementResolver = new ElementResolver(this); | 10265 this._elementResolver = new ElementResolver(this); |
| 10450 this._typeAnalyzer = new StaticTypeAnalyzer(this); | 10266 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 10451 } | 10267 } |
| 10452 | 10268 |
| 10453 /** | 10269 /** |
| 10454 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 10270 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 10455 * | 10271 * |
| 10456 * @param library the library containing the compilation unit being resolved | 10272 * @param library the library containing the compilation unit being resolved |
| 10457 * @param source the source representing the compilation unit being visited | 10273 * @param source the source representing the compilation unit being visited |
| 10458 * @param typeProvider the object used to access the types from the core libra
ry | 10274 * @param typeProvider the object used to access the types from the core libra
ry |
| 10459 */ | 10275 */ |
| 10460 ResolverVisitor.con4(ResolvableLibrary library, Source source, | 10276 ResolverVisitor.con4( |
| 10461 TypeProvider typeProvider) | 10277 ResolvableLibrary library, Source source, TypeProvider typeProvider) |
| 10462 : super.con4(library, source, typeProvider) { | 10278 : super.con4(library, source, typeProvider) { |
| 10463 this._inheritanceManager = library.inheritanceManager; | 10279 this._inheritanceManager = library.inheritanceManager; |
| 10464 this._elementResolver = new ElementResolver(this); | 10280 this._elementResolver = new ElementResolver(this); |
| 10465 this._typeAnalyzer = new StaticTypeAnalyzer(this); | 10281 this._typeAnalyzer = new StaticTypeAnalyzer(this); |
| 10466 } | 10282 } |
| 10467 | 10283 |
| 10468 get elementResolver_J2DAccessor => _elementResolver; | 10284 get elementResolver_J2DAccessor => _elementResolver; |
| 10469 | 10285 |
| 10470 set elementResolver_J2DAccessor(__v) => _elementResolver = __v; | 10286 set elementResolver_J2DAccessor(__v) => _elementResolver = __v; |
| 10471 | 10287 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10586 /** | 10402 /** |
| 10587 * If it is appropriate to do so, override the current type of the static and
propagated elements | 10403 * If it is appropriate to do so, override the current type of the static and
propagated elements |
| 10588 * associated with the given expression with the given type. Generally speakin
g, it is appropriate | 10404 * associated with the given expression with the given type. Generally speakin
g, it is appropriate |
| 10589 * if the given type is more specific than the current type. | 10405 * if the given type is more specific than the current type. |
| 10590 * | 10406 * |
| 10591 * @param expression the expression used to access the static and propagated e
lements whose types | 10407 * @param expression the expression used to access the static and propagated e
lements whose types |
| 10592 * might be overridden | 10408 * might be overridden |
| 10593 * @param potentialType the potential type of the elements | 10409 * @param potentialType the potential type of the elements |
| 10594 * @param allowPrecisionLoss see @{code overrideVariable} docs | 10410 * @param allowPrecisionLoss see @{code overrideVariable} docs |
| 10595 */ | 10411 */ |
| 10596 void overrideExpression(Expression expression, DartType potentialType, | 10412 void overrideExpression( |
| 10597 bool allowPrecisionLoss) { | 10413 Expression expression, DartType potentialType, bool allowPrecisionLoss) { |
| 10598 VariableElement element = getOverridableStaticElement(expression); | 10414 VariableElement element = getOverridableStaticElement(expression); |
| 10599 if (element != null) { | 10415 if (element != null) { |
| 10600 overrideVariable(element, potentialType, allowPrecisionLoss); | 10416 overrideVariable(element, potentialType, allowPrecisionLoss); |
| 10601 } | 10417 } |
| 10602 element = getOverridablePropagatedElement(expression); | 10418 element = getOverridablePropagatedElement(expression); |
| 10603 if (element != null) { | 10419 if (element != null) { |
| 10604 overrideVariable(element, potentialType, allowPrecisionLoss); | 10420 overrideVariable(element, potentialType, allowPrecisionLoss); |
| 10605 } | 10421 } |
| 10606 } | 10422 } |
| 10607 | 10423 |
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11297 // We visit the target, but do not visit the property name because it needs | 11113 // We visit the target, but do not visit the property name because it needs |
| 11298 // to be visited in the context of the property access node. | 11114 // to be visited in the context of the property access node. |
| 11299 // | 11115 // |
| 11300 safelyVisit(node.target); | 11116 safelyVisit(node.target); |
| 11301 node.accept(_elementResolver); | 11117 node.accept(_elementResolver); |
| 11302 node.accept(_typeAnalyzer); | 11118 node.accept(_typeAnalyzer); |
| 11303 return null; | 11119 return null; |
| 11304 } | 11120 } |
| 11305 | 11121 |
| 11306 @override | 11122 @override |
| 11307 Object | 11123 Object visitRedirectingConstructorInvocation( |
| 11308 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation nod
e) { | 11124 RedirectingConstructorInvocation node) { |
| 11309 // | 11125 // |
| 11310 // We visit the argument list, but do not visit the optional identifier | 11126 // We visit the argument list, but do not visit the optional identifier |
| 11311 // because it needs to be visited in the context of the constructor | 11127 // because it needs to be visited in the context of the constructor |
| 11312 // invocation. | 11128 // invocation. |
| 11313 // | 11129 // |
| 11314 safelyVisit(node.argumentList); | 11130 safelyVisit(node.argumentList); |
| 11315 node.accept(_elementResolver); | 11131 node.accept(_elementResolver); |
| 11316 node.accept(_typeAnalyzer); | 11132 node.accept(_typeAnalyzer); |
| 11317 return null; | 11133 return null; |
| 11318 } | 11134 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11401 return null; | 11217 return null; |
| 11402 } | 11218 } |
| 11403 | 11219 |
| 11404 /** | 11220 /** |
| 11405 * Checks each promoted variable in the current scope for compliance with the
following | 11221 * Checks each promoted variable in the current scope for compliance with the
following |
| 11406 * specification statement: | 11222 * specification statement: |
| 11407 * | 11223 * |
| 11408 * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> t
hen the variable | 11224 * If the variable <i>v</i> is accessed by a closure in <i>s<sub>1</sub></i> t
hen the variable |
| 11409 * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>. | 11225 * <i>v</i> is not potentially mutated anywhere in the scope of <i>v</i>. |
| 11410 */ | 11226 */ |
| 11411 void | 11227 void _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated( |
| 11412 _clearTypePromotionsIfAccessedInClosureAndProtentiallyMutated(AstNode targ
et) { | 11228 AstNode target) { |
| 11413 for (Element element in _promoteManager.promotedElements) { | 11229 for (Element element in _promoteManager.promotedElements) { |
| 11414 if ((element as VariableElementImpl).isPotentiallyMutatedInScope) { | 11230 if ((element as VariableElementImpl).isPotentiallyMutatedInScope) { |
| 11415 if (_isVariableAccessedInClosure(element, target)) { | 11231 if (_isVariableAccessedInClosure(element, target)) { |
| 11416 _promoteManager.setType(element, null); | 11232 _promoteManager.setType(element, null); |
| 11417 } | 11233 } |
| 11418 } | 11234 } |
| 11419 } | 11235 } |
| 11420 } | 11236 } |
| 11421 | 11237 |
| 11422 /** | 11238 /** |
| (...skipping 24 matching lines...) Expand all Loading... |
| 11447 InterfaceType interfaceType = expressionType; | 11263 InterfaceType interfaceType = expressionType; |
| 11448 FunctionType iteratorFunction = | 11264 FunctionType iteratorFunction = |
| 11449 _inheritanceManager.lookupMemberType(interfaceType, "iterator"); | 11265 _inheritanceManager.lookupMemberType(interfaceType, "iterator"); |
| 11450 if (iteratorFunction == null) { | 11266 if (iteratorFunction == null) { |
| 11451 // TODO(brianwilkerson) Should we report this error? | 11267 // TODO(brianwilkerson) Should we report this error? |
| 11452 return null; | 11268 return null; |
| 11453 } | 11269 } |
| 11454 DartType iteratorType = iteratorFunction.returnType; | 11270 DartType iteratorType = iteratorFunction.returnType; |
| 11455 if (iteratorType is InterfaceType) { | 11271 if (iteratorType is InterfaceType) { |
| 11456 InterfaceType iteratorInterfaceType = iteratorType; | 11272 InterfaceType iteratorInterfaceType = iteratorType; |
| 11457 FunctionType currentFunction = | 11273 FunctionType currentFunction = _inheritanceManager.lookupMemberType( |
| 11458 _inheritanceManager.lookupMemberType(iteratorInterfaceType, "current
"); | 11274 iteratorInterfaceType, "current"); |
| 11459 if (currentFunction == null) { | 11275 if (currentFunction == null) { |
| 11460 // TODO(brianwilkerson) Should we report this error? | 11276 // TODO(brianwilkerson) Should we report this error? |
| 11461 return null; | 11277 return null; |
| 11462 } | 11278 } |
| 11463 return currentFunction.returnType; | 11279 return currentFunction.returnType; |
| 11464 } | 11280 } |
| 11465 } | 11281 } |
| 11466 return null; | 11282 return null; |
| 11467 } | 11283 } |
| 11468 | 11284 |
| 11469 /** | 11285 /** |
| 11470 * If given "mayBeClosure" is [FunctionExpression] without explicit parameters
types and its | 11286 * If given "mayBeClosure" is [FunctionExpression] without explicit parameters
types and its |
| 11471 * required type is [FunctionType], then infer parameters types from [Function
Type]. | 11287 * required type is [FunctionType], then infer parameters types from [Function
Type]. |
| 11472 */ | 11288 */ |
| 11473 void _inferFunctionExpressionParametersTypes(Expression mayBeClosure, | 11289 void _inferFunctionExpressionParametersTypes( |
| 11474 DartType mayByFunctionType) { | 11290 Expression mayBeClosure, DartType mayByFunctionType) { |
| 11475 // prepare closure | 11291 // prepare closure |
| 11476 if (mayBeClosure is! FunctionExpression) { | 11292 if (mayBeClosure is! FunctionExpression) { |
| 11477 return; | 11293 return; |
| 11478 } | 11294 } |
| 11479 FunctionExpression closure = mayBeClosure as FunctionExpression; | 11295 FunctionExpression closure = mayBeClosure as FunctionExpression; |
| 11480 // prepare expected closure type | 11296 // prepare expected closure type |
| 11481 if (mayByFunctionType is! FunctionType) { | 11297 if (mayByFunctionType is! FunctionType) { |
| 11482 return; | 11298 return; |
| 11483 } | 11299 } |
| 11484 FunctionType expectedClosureType = mayByFunctionType as FunctionType; | 11300 FunctionType expectedClosureType = mayByFunctionType as FunctionType; |
| 11485 // If the expectedClosureType is not more specific than the static type, | 11301 // If the expectedClosureType is not more specific than the static type, |
| 11486 // return. | 11302 // return. |
| 11487 DartType staticClosureType = | 11303 DartType staticClosureType = |
| 11488 (closure.element != null ? closure.element.type : null) as DartType; | 11304 (closure.element != null ? closure.element.type : null) as DartType; |
| 11489 if (staticClosureType != null && | 11305 if (staticClosureType != null && |
| 11490 !expectedClosureType.isMoreSpecificThan(staticClosureType)) { | 11306 !expectedClosureType.isMoreSpecificThan(staticClosureType)) { |
| 11491 return; | 11307 return; |
| 11492 } | 11308 } |
| 11493 // set propagated type for the closure | 11309 // set propagated type for the closure |
| 11494 closure.propagatedType = expectedClosureType; | 11310 closure.propagatedType = expectedClosureType; |
| 11495 // set inferred types for parameters | 11311 // set inferred types for parameters |
| 11496 NodeList<FormalParameter> parameters = closure.parameters.parameters; | 11312 NodeList<FormalParameter> parameters = closure.parameters.parameters; |
| 11497 List<ParameterElement> expectedParameters = expectedClosureType.parameters; | 11313 List<ParameterElement> expectedParameters = expectedClosureType.parameters; |
| 11498 for (int i = | 11314 for (int i = 0; |
| 11499 0; i < parameters.length && i < expectedParameters.length; i++) { | 11315 i < parameters.length && i < expectedParameters.length; |
| 11316 i++) { |
| 11500 FormalParameter parameter = parameters[i]; | 11317 FormalParameter parameter = parameters[i]; |
| 11501 ParameterElement element = parameter.element; | 11318 ParameterElement element = parameter.element; |
| 11502 DartType currentType = _overrideManager.getBestType(element); | 11319 DartType currentType = _overrideManager.getBestType(element); |
| 11503 // may be override the type | 11320 // may be override the type |
| 11504 DartType expectedType = expectedParameters[i].type; | 11321 DartType expectedType = expectedParameters[i].type; |
| 11505 if (currentType == null || expectedType.isMoreSpecificThan(currentType)) { | 11322 if (currentType == null || expectedType.isMoreSpecificThan(currentType)) { |
| 11506 _overrideManager.setType(element, expectedType); | 11323 _overrideManager.setType(element, expectedType); |
| 11507 } | 11324 } |
| 11508 } | 11325 } |
| 11509 } | 11326 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11566 return true; | 11383 return true; |
| 11567 } else if (statement is ExpressionStatement) { | 11384 } else if (statement is ExpressionStatement) { |
| 11568 return _isAbruptTerminationExpression(statement.expression); | 11385 return _isAbruptTerminationExpression(statement.expression); |
| 11569 } else if (statement is Block) { | 11386 } else if (statement is Block) { |
| 11570 NodeList<Statement> statements = statement.statements; | 11387 NodeList<Statement> statements = statement.statements; |
| 11571 int size = statements.length; | 11388 int size = statements.length; |
| 11572 if (size == 0) { | 11389 if (size == 0) { |
| 11573 return false; | 11390 return false; |
| 11574 } | 11391 } |
| 11575 | 11392 |
| 11576 | |
| 11577 // This last-statement-is-return heuristic is unsound for adversarial | 11393 // This last-statement-is-return heuristic is unsound for adversarial |
| 11578 // code, but probably works well in the common case: | 11394 // code, but probably works well in the common case: |
| 11579 // | 11395 // |
| 11580 // var x = 123; | 11396 // var x = 123; |
| 11581 // var c = true; | 11397 // var c = true; |
| 11582 // L: if (c) { | 11398 // L: if (c) { |
| 11583 // x = "hello"; | 11399 // x = "hello"; |
| 11584 // c = false; | 11400 // c = false; |
| 11585 // break L; | 11401 // break L; |
| 11586 // return; | 11402 // return; |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11824 * in this scope, then an error will be generated and the original element wil
l continue to be | 11640 * in this scope, then an error will be generated and the original element wil
l continue to be |
| 11825 * mapped to the name. If there is an element with the given name in an enclos
ing scope, then a | 11641 * mapped to the name. If there is an element with the given name in an enclos
ing scope, then a |
| 11826 * warning will be generated but the given element will hide the inherited ele
ment. | 11642 * warning will be generated but the given element will hide the inherited ele
ment. |
| 11827 * | 11643 * |
| 11828 * @param element the element to be added to this scope | 11644 * @param element the element to be added to this scope |
| 11829 */ | 11645 */ |
| 11830 void define(Element element) { | 11646 void define(Element element) { |
| 11831 String name = _getName(element); | 11647 String name = _getName(element); |
| 11832 if (name != null && !name.isEmpty) { | 11648 if (name != null && !name.isEmpty) { |
| 11833 if (_definedNames.containsKey(name)) { | 11649 if (_definedNames.containsKey(name)) { |
| 11834 errorListener.onError( | 11650 errorListener |
| 11835 getErrorForDuplicate(_definedNames[name], element)); | 11651 .onError(getErrorForDuplicate(_definedNames[name], element)); |
| 11836 } else { | 11652 } else { |
| 11837 _definedNames[name] = element; | 11653 _definedNames[name] = element; |
| 11838 _hasName = true; | 11654 _hasName = true; |
| 11839 } | 11655 } |
| 11840 } | 11656 } |
| 11841 } | 11657 } |
| 11842 | 11658 |
| 11843 /** | 11659 /** |
| 11844 * Add the given element to this scope without checking for duplication or hid
ing. | 11660 * Add the given element to this scope without checking for duplication or hid
ing. |
| 11845 * | 11661 * |
| (...skipping 22 matching lines...) Expand all Loading... |
| 11868 * @param existing the first element to be declared with the conflicting name | 11684 * @param existing the first element to be declared with the conflicting name |
| 11869 * @param duplicate another element declared with the conflicting name | 11685 * @param duplicate another element declared with the conflicting name |
| 11870 * @return the error code used to report duplicate names within a scope | 11686 * @return the error code used to report duplicate names within a scope |
| 11871 */ | 11687 */ |
| 11872 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { | 11688 AnalysisError getErrorForDuplicate(Element existing, Element duplicate) { |
| 11873 // TODO(brianwilkerson) Customize the error message based on the types of | 11689 // TODO(brianwilkerson) Customize the error message based on the types of |
| 11874 // elements that share the same name. | 11690 // elements that share the same name. |
| 11875 // TODO(jwren) There are 4 error codes for duplicate, but only 1 is being | 11691 // TODO(jwren) There are 4 error codes for duplicate, but only 1 is being |
| 11876 // generated. | 11692 // generated. |
| 11877 Source source = duplicate.source; | 11693 Source source = duplicate.source; |
| 11878 return new AnalysisError.con2( | 11694 return new AnalysisError.con2(source, duplicate.nameOffset, |
| 11879 source, | 11695 duplicate.displayName.length, CompileTimeErrorCode.DUPLICATE_DEFINITION, |
| 11880 duplicate.nameOffset, | |
| 11881 duplicate.displayName.length, | |
| 11882 CompileTimeErrorCode.DUPLICATE_DEFINITION, | |
| 11883 [existing.displayName]); | 11696 [existing.displayName]); |
| 11884 } | 11697 } |
| 11885 | 11698 |
| 11886 /** | 11699 /** |
| 11887 * Return the source that contains the given identifier, or the source associa
ted with this scope | 11700 * Return the source that contains the given identifier, or the source associa
ted with this scope |
| 11888 * if the source containing the identifier could not be determined. | 11701 * if the source containing the identifier could not be determined. |
| 11889 * | 11702 * |
| 11890 * @param identifier the identifier whose source is to be returned | 11703 * @param identifier the identifier whose source is to be returned |
| 11891 * @return the source that contains the given identifier | 11704 * @return the source that contains the given identifier |
| 11892 */ | 11705 */ |
| (...skipping 12 matching lines...) Expand all Loading... |
| 11905 * Return the element with which the given name is associated, or `null` if th
e name is not | 11718 * Return the element with which the given name is associated, or `null` if th
e name is not |
| 11906 * defined within this scope. | 11719 * defined within this scope. |
| 11907 * | 11720 * |
| 11908 * @param identifier the identifier node to lookup element for, used to report
correct kind of a | 11721 * @param identifier the identifier node to lookup element for, used to report
correct kind of a |
| 11909 * problem and associate problem with | 11722 * problem and associate problem with |
| 11910 * @param name the name associated with the element to be returned | 11723 * @param name the name associated with the element to be returned |
| 11911 * @param referencingLibrary the library that contains the reference to the na
me, used to | 11724 * @param referencingLibrary the library that contains the reference to the na
me, used to |
| 11912 * implement library-level privacy | 11725 * implement library-level privacy |
| 11913 * @return the element with which the given name is associated | 11726 * @return the element with which the given name is associated |
| 11914 */ | 11727 */ |
| 11915 Element internalLookup(Identifier identifier, String name, | 11728 Element internalLookup( |
| 11916 LibraryElement referencingLibrary); | 11729 Identifier identifier, String name, LibraryElement referencingLibrary); |
| 11917 | 11730 |
| 11918 /** | 11731 /** |
| 11919 * Return the element with which the given name is associated, or `null` if th
e name is not | 11732 * Return the element with which the given name is associated, or `null` if th
e name is not |
| 11920 * defined within this scope. This method only returns elements that are direc
tly defined within | 11733 * defined within this scope. This method only returns elements that are direc
tly defined within |
| 11921 * this scope, not elements that are defined in an enclosing scope. | 11734 * this scope, not elements that are defined in an enclosing scope. |
| 11922 * | 11735 * |
| 11923 * @param name the name associated with the element to be returned | 11736 * @param name the name associated with the element to be returned |
| 11924 * @param referencingLibrary the library that contains the reference to the na
me, used to | 11737 * @param referencingLibrary the library that contains the reference to the na
me, used to |
| 11925 * implement library-level privacy | 11738 * implement library-level privacy |
| 11926 * @return the element with which the given name is associated | 11739 * @return the element with which the given name is associated |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12066 this._nameScope = nameScope; | 11879 this._nameScope = nameScope; |
| 12067 } | 11880 } |
| 12068 | 11881 |
| 12069 /** | 11882 /** |
| 12070 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 11883 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 12071 * | 11884 * |
| 12072 * @param library the library containing the compilation unit being resolved | 11885 * @param library the library containing the compilation unit being resolved |
| 12073 * @param source the source representing the compilation unit being visited | 11886 * @param source the source representing the compilation unit being visited |
| 12074 * @param typeProvider the object used to access the types from the core libra
ry | 11887 * @param typeProvider the object used to access the types from the core libra
ry |
| 12075 */ | 11888 */ |
| 12076 ScopedVisitor.con4(ResolvableLibrary library, this.source, this.typeProvider) | 11889 ScopedVisitor.con4( |
| 12077 { | 11890 ResolvableLibrary library, this.source, this.typeProvider) { |
| 12078 this._definingLibrary = library.libraryElement; | 11891 this._definingLibrary = library.libraryElement; |
| 12079 LibraryScope libraryScope = library.libraryScope; | 11892 LibraryScope libraryScope = library.libraryScope; |
| 12080 this._errorListener = libraryScope.errorListener; | 11893 this._errorListener = libraryScope.errorListener; |
| 12081 this._nameScope = libraryScope; | 11894 this._nameScope = libraryScope; |
| 12082 } | 11895 } |
| 12083 | 11896 |
| 12084 /** | 11897 /** |
| 12085 * Return the library element for the library containing the compilation unit
being resolved. | 11898 * Return the library element for the library containing the compilation unit
being resolved. |
| 12086 * | 11899 * |
| 12087 * @return the library element for the library containing the compilation unit
being resolved | 11900 * @return the library element for the library containing the compilation unit
being resolved |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12131 | 11944 |
| 12132 /** | 11945 /** |
| 12133 * Report an error with the given error code and arguments. | 11946 * Report an error with the given error code and arguments. |
| 12134 * | 11947 * |
| 12135 * @param errorCode the error code of the error to be reported | 11948 * @param errorCode the error code of the error to be reported |
| 12136 * @param node the node specifying the location of the error | 11949 * @param node the node specifying the location of the error |
| 12137 * @param arguments the arguments to the error, used to compose the error mess
age | 11950 * @param arguments the arguments to the error, used to compose the error mess
age |
| 12138 */ | 11951 */ |
| 12139 void reportErrorForNode(ErrorCode errorCode, AstNode node, | 11952 void reportErrorForNode(ErrorCode errorCode, AstNode node, |
| 12140 [List<Object> arguments]) { | 11953 [List<Object> arguments]) { |
| 12141 _errorListener.onError( | 11954 _errorListener.onError(new AnalysisError.con2( |
| 12142 new AnalysisError.con2(source, node.offset, node.length, errorCode, argu
ments)); | 11955 source, node.offset, node.length, errorCode, arguments)); |
| 12143 } | 11956 } |
| 12144 | 11957 |
| 12145 /** | 11958 /** |
| 12146 * Report an error with the given error code and arguments. | 11959 * Report an error with the given error code and arguments. |
| 12147 * | 11960 * |
| 12148 * @param errorCode the error code of the error to be reported | 11961 * @param errorCode the error code of the error to be reported |
| 12149 * @param offset the offset of the location of the error | 11962 * @param offset the offset of the location of the error |
| 12150 * @param length the length of the location of the error | 11963 * @param length the length of the location of the error |
| 12151 * @param arguments the arguments to the error, used to compose the error mess
age | 11964 * @param arguments the arguments to the error, used to compose the error mess
age |
| 12152 */ | 11965 */ |
| 12153 void reportErrorForOffset(ErrorCode errorCode, int offset, int length, | 11966 void reportErrorForOffset(ErrorCode errorCode, int offset, int length, |
| 12154 [List<Object> arguments]) { | 11967 [List<Object> arguments]) { |
| 12155 _errorListener.onError( | 11968 _errorListener.onError( |
| 12156 new AnalysisError.con2(source, offset, length, errorCode, arguments)); | 11969 new AnalysisError.con2(source, offset, length, errorCode, arguments)); |
| 12157 } | 11970 } |
| 12158 | 11971 |
| 12159 /** | 11972 /** |
| 12160 * Report an error with the given error code and arguments. | 11973 * Report an error with the given error code and arguments. |
| 12161 * | 11974 * |
| 12162 * @param errorCode the error code of the error to be reported | 11975 * @param errorCode the error code of the error to be reported |
| 12163 * @param token the token specifying the location of the error | 11976 * @param token the token specifying the location of the error |
| 12164 * @param arguments the arguments to the error, used to compose the error mess
age | 11977 * @param arguments the arguments to the error, used to compose the error mess
age |
| 12165 */ | 11978 */ |
| 12166 void reportErrorForToken(ErrorCode errorCode, sc.Token token, | 11979 void reportErrorForToken(ErrorCode errorCode, sc.Token token, |
| 12167 [List<Object> arguments]) { | 11980 [List<Object> arguments]) { |
| 12168 _errorListener.onError( | 11981 _errorListener.onError(new AnalysisError.con2( |
| 12169 new AnalysisError.con2( | 11982 source, token.offset, token.length, errorCode, arguments)); |
| 12170 source, | |
| 12171 token.offset, | |
| 12172 token.length, | |
| 12173 errorCode, | |
| 12174 arguments)); | |
| 12175 } | 11983 } |
| 12176 | 11984 |
| 12177 /** | 11985 /** |
| 12178 * Visit the given AST node if it is not null. | 11986 * Visit the given AST node if it is not null. |
| 12179 * | 11987 * |
| 12180 * @param node the node to be visited | 11988 * @param node the node to be visited |
| 12181 */ | 11989 */ |
| 12182 void safelyVisit(AstNode node) { | 11990 void safelyVisit(AstNode node) { |
| 12183 if (node != null) { | 11991 if (node != null) { |
| 12184 node.accept(this); | 11992 node.accept(this); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12298 if (constructorElement == null) { | 12106 if (constructorElement == null) { |
| 12299 StringBuffer buffer = new StringBuffer(); | 12107 StringBuffer buffer = new StringBuffer(); |
| 12300 buffer.write("Missing element for constructor "); | 12108 buffer.write("Missing element for constructor "); |
| 12301 buffer.write(node.returnType.name); | 12109 buffer.write(node.returnType.name); |
| 12302 if (node.name != null) { | 12110 if (node.name != null) { |
| 12303 buffer.write("."); | 12111 buffer.write("."); |
| 12304 buffer.write(node.name.name); | 12112 buffer.write(node.name.name); |
| 12305 } | 12113 } |
| 12306 buffer.write(" in "); | 12114 buffer.write(" in "); |
| 12307 buffer.write(definingLibrary.source.fullName); | 12115 buffer.write(definingLibrary.source.fullName); |
| 12308 AnalysisEngine.instance.logger.logInformation( | 12116 AnalysisEngine.instance.logger.logInformation(buffer.toString(), |
| 12309 buffer.toString(), | |
| 12310 new CaughtException(new AnalysisException(), null)); | 12117 new CaughtException(new AnalysisException(), null)); |
| 12311 } else { | 12118 } else { |
| 12312 _nameScope = new FunctionScope(_nameScope, constructorElement); | 12119 _nameScope = new FunctionScope(_nameScope, constructorElement); |
| 12313 } | 12120 } |
| 12314 super.visitConstructorDeclaration(node); | 12121 super.visitConstructorDeclaration(node); |
| 12315 } finally { | 12122 } finally { |
| 12316 _nameScope = outerScope; | 12123 _nameScope = outerScope; |
| 12317 } | 12124 } |
| 12318 return null; | 12125 return null; |
| 12319 } | 12126 } |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12450 Scope outerScope = _nameScope; | 12257 Scope outerScope = _nameScope; |
| 12451 try { | 12258 try { |
| 12452 ExecutableElement functionElement = node.element; | 12259 ExecutableElement functionElement = node.element; |
| 12453 if (functionElement == null) { | 12260 if (functionElement == null) { |
| 12454 StringBuffer buffer = new StringBuffer(); | 12261 StringBuffer buffer = new StringBuffer(); |
| 12455 buffer.write("Missing element for function "); | 12262 buffer.write("Missing element for function "); |
| 12456 AstNode parent = node.parent; | 12263 AstNode parent = node.parent; |
| 12457 while (parent != null) { | 12264 while (parent != null) { |
| 12458 if (parent is Declaration) { | 12265 if (parent is Declaration) { |
| 12459 Element parentElement = (parent as Declaration).element; | 12266 Element parentElement = (parent as Declaration).element; |
| 12460 buffer.write( | 12267 buffer.write(parentElement == null |
| 12461 parentElement == null ? "<unknown> " : "${parentElement.name}
"); | 12268 ? "<unknown> " |
| 12269 : "${parentElement.name} "); |
| 12462 } | 12270 } |
| 12463 parent = parent.parent; | 12271 parent = parent.parent; |
| 12464 } | 12272 } |
| 12465 buffer.write("in "); | 12273 buffer.write("in "); |
| 12466 buffer.write(definingLibrary.source.fullName); | 12274 buffer.write(definingLibrary.source.fullName); |
| 12467 AnalysisEngine.instance.logger.logInformation( | 12275 AnalysisEngine.instance.logger.logInformation(buffer.toString(), |
| 12468 buffer.toString(), | |
| 12469 new CaughtException(new AnalysisException(), null)); | 12276 new CaughtException(new AnalysisException(), null)); |
| 12470 } else { | 12277 } else { |
| 12471 _nameScope = new FunctionScope(_nameScope, functionElement); | 12278 _nameScope = new FunctionScope(_nameScope, functionElement); |
| 12472 } | 12279 } |
| 12473 super.visitFunctionExpression(node); | 12280 super.visitFunctionExpression(node); |
| 12474 } finally { | 12281 } finally { |
| 12475 _nameScope = outerScope; | 12282 _nameScope = outerScope; |
| 12476 } | 12283 } |
| 12477 } | 12284 } |
| 12478 return null; | 12285 return null; |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12688 * | 12495 * |
| 12689 * @param classElement the class to recursively return the set of subtypes of | 12496 * @param classElement the class to recursively return the set of subtypes of |
| 12690 */ | 12497 */ |
| 12691 HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) { | 12498 HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) { |
| 12692 // Ensure that we have generated the subtype map for the library | 12499 // Ensure that we have generated the subtype map for the library |
| 12693 _computeSubtypesInLibrary(classElement.library); | 12500 _computeSubtypesInLibrary(classElement.library); |
| 12694 // use the subtypeMap to compute the set of all subtypes and subtype's | 12501 // use the subtypeMap to compute the set of all subtypes and subtype's |
| 12695 // subtypes | 12502 // subtypes |
| 12696 HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>(); | 12503 HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>(); |
| 12697 _safelyComputeAllSubtypes( | 12504 _safelyComputeAllSubtypes( |
| 12698 classElement, | 12505 classElement, new HashSet<ClassElement>(), allSubtypes); |
| 12699 new HashSet<ClassElement>(), | |
| 12700 allSubtypes); | |
| 12701 return allSubtypes; | 12506 return allSubtypes; |
| 12702 } | 12507 } |
| 12703 | 12508 |
| 12704 /** | 12509 /** |
| 12705 * Given some [LibraryElement], visit all of the types in the library, the pas
sed library, | 12510 * Given some [LibraryElement], visit all of the types in the library, the pas
sed library, |
| 12706 * and any imported libraries, will be in the [visitedLibraries] set. | 12511 * and any imported libraries, will be in the [visitedLibraries] set. |
| 12707 * | 12512 * |
| 12708 * @param libraryElement the library to visit, it it hasn't been visited alrea
dy | 12513 * @param libraryElement the library to visit, it it hasn't been visited alrea
dy |
| 12709 */ | 12514 */ |
| 12710 void ensureLibraryVisited(LibraryElement libraryElement) { | 12515 void ensureLibraryVisited(LibraryElement libraryElement) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12782 _computeSubtypesInLibrary(exportElt.library); | 12587 _computeSubtypesInLibrary(exportElt.library); |
| 12783 } | 12588 } |
| 12784 } | 12589 } |
| 12785 | 12590 |
| 12786 /** | 12591 /** |
| 12787 * Add some key/ value pair into the [subtypeMap] map. | 12592 * Add some key/ value pair into the [subtypeMap] map. |
| 12788 * | 12593 * |
| 12789 * @param supertypeElement the key for the [subtypeMap] map | 12594 * @param supertypeElement the key for the [subtypeMap] map |
| 12790 * @param subtypeElement the value for the [subtypeMap] map | 12595 * @param subtypeElement the value for the [subtypeMap] map |
| 12791 */ | 12596 */ |
| 12792 void _putInSubtypeMap(ClassElement supertypeElement, | 12597 void _putInSubtypeMap( |
| 12793 ClassElement subtypeElement) { | 12598 ClassElement supertypeElement, ClassElement subtypeElement) { |
| 12794 HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement]; | 12599 HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement]; |
| 12795 if (subtypes == null) { | 12600 if (subtypes == null) { |
| 12796 subtypes = new HashSet<ClassElement>(); | 12601 subtypes = new HashSet<ClassElement>(); |
| 12797 _subtypeMap[supertypeElement] = subtypes; | 12602 _subtypeMap[supertypeElement] = subtypes; |
| 12798 } | 12603 } |
| 12799 subtypes.add(subtypeElement); | 12604 subtypes.add(subtypeElement); |
| 12800 } | 12605 } |
| 12801 | 12606 |
| 12802 /** | 12607 /** |
| 12803 * Given some [ClassElement] and a [HashSet<ClassElement>], this method recurs
ively | 12608 * Given some [ClassElement] and a [HashSet<ClassElement>], this method recurs
ively |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12873 /** | 12678 /** |
| 12874 * Look for user defined tasks in comments and convert them into info level an
alysis issues. | 12679 * Look for user defined tasks in comments and convert them into info level an
alysis issues. |
| 12875 * | 12680 * |
| 12876 * @param commentToken the comment token to analyze | 12681 * @param commentToken the comment token to analyze |
| 12877 */ | 12682 */ |
| 12878 void _scrapeTodoComment(sc.Token commentToken) { | 12683 void _scrapeTodoComment(sc.Token commentToken) { |
| 12879 JavaPatternMatcher matcher = | 12684 JavaPatternMatcher matcher = |
| 12880 new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme); | 12685 new JavaPatternMatcher(TodoCode.TODO_REGEX, commentToken.lexeme); |
| 12881 if (matcher.find()) { | 12686 if (matcher.find()) { |
| 12882 int offset = | 12687 int offset = |
| 12883 commentToken.offset + | 12688 commentToken.offset + matcher.start() + matcher.group(1).length; |
| 12884 matcher.start() + | |
| 12885 matcher.group(1).length; | |
| 12886 int length = matcher.group(2).length; | 12689 int length = matcher.group(2).length; |
| 12887 _errorReporter.reportErrorForOffset( | 12690 _errorReporter.reportErrorForOffset( |
| 12888 TodoCode.TODO, | 12691 TodoCode.TODO, offset, length, [matcher.group(2)]); |
| 12889 offset, | |
| 12890 length, | |
| 12891 [matcher.group(2)]); | |
| 12892 } | 12692 } |
| 12893 } | 12693 } |
| 12894 } | 12694 } |
| 12895 | 12695 |
| 12896 /** | 12696 /** |
| 12897 * Instances of the class `TypeOverrideManager` manage the ability to override t
he type of an | 12697 * Instances of the class `TypeOverrideManager` manage the ability to override t
he type of an |
| 12898 * element within a given context. | 12698 * element within a given context. |
| 12899 */ | 12699 */ |
| 12900 class TypeOverrideManager { | 12700 class TypeOverrideManager { |
| 12901 /** | 12701 /** |
| (...skipping 27 matching lines...) Expand all Loading... |
| 12929 return _currentScope.captureLocalOverrides(); | 12729 return _currentScope.captureLocalOverrides(); |
| 12930 } | 12730 } |
| 12931 | 12731 |
| 12932 /** | 12732 /** |
| 12933 * Return a map from the elements for the variables in the given list that hav
e their types | 12733 * Return a map from the elements for the variables in the given list that hav
e their types |
| 12934 * overridden to the overriding type. | 12734 * overridden to the overriding type. |
| 12935 * | 12735 * |
| 12936 * @param variableList the list of variables whose overriding types are to be
captured | 12736 * @param variableList the list of variables whose overriding types are to be
captured |
| 12937 * @return a table mapping elements to their overriding types | 12737 * @return a table mapping elements to their overriding types |
| 12938 */ | 12738 */ |
| 12939 Map<VariableElement, DartType> | 12739 Map<VariableElement, DartType> captureOverrides( |
| 12940 captureOverrides(VariableDeclarationList variableList) { | 12740 VariableDeclarationList variableList) { |
| 12941 if (_currentScope == null) { | 12741 if (_currentScope == null) { |
| 12942 throw new IllegalStateException( | 12742 throw new IllegalStateException( |
| 12943 "Cannot capture overrides without a scope"); | 12743 "Cannot capture overrides without a scope"); |
| 12944 } | 12744 } |
| 12945 return _currentScope.captureOverrides(variableList); | 12745 return _currentScope.captureOverrides(variableList); |
| 12946 } | 12746 } |
| 12947 | 12747 |
| 12948 /** | 12748 /** |
| 12949 * Enter a new override scope. | 12749 * Enter a new override scope. |
| 12950 */ | 12750 */ |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13117 */ | 12917 */ |
| 13118 Map<VariableElement, DartType> captureLocalOverrides() => _overridenTypes; | 12918 Map<VariableElement, DartType> captureLocalOverrides() => _overridenTypes; |
| 13119 | 12919 |
| 13120 /** | 12920 /** |
| 13121 * Return a map from the elements for the variables in the given list that hav
e their types | 12921 * Return a map from the elements for the variables in the given list that hav
e their types |
| 13122 * overridden to the overriding type. | 12922 * overridden to the overriding type. |
| 13123 * | 12923 * |
| 13124 * @param variableList the list of variables whose overriding types are to be
captured | 12924 * @param variableList the list of variables whose overriding types are to be
captured |
| 13125 * @return a table mapping elements to their overriding types | 12925 * @return a table mapping elements to their overriding types |
| 13126 */ | 12926 */ |
| 13127 Map<VariableElement, DartType> | 12927 Map<VariableElement, DartType> captureOverrides( |
| 13128 captureOverrides(VariableDeclarationList variableList) { | 12928 VariableDeclarationList variableList) { |
| 13129 Map<VariableElement, DartType> overrides = | 12929 Map<VariableElement, DartType> overrides = |
| 13130 new HashMap<VariableElement, DartType>(); | 12930 new HashMap<VariableElement, DartType>(); |
| 13131 if (variableList.isConst || variableList.isFinal) { | 12931 if (variableList.isConst || variableList.isFinal) { |
| 13132 for (VariableDeclaration variable in variableList.variables) { | 12932 for (VariableDeclaration variable in variableList.variables) { |
| 13133 VariableElement element = variable.element; | 12933 VariableElement element = variable.element; |
| 13134 if (element != null) { | 12934 if (element != null) { |
| 13135 DartType type = _overridenTypes[element]; | 12935 DartType type = _overridenTypes[element]; |
| 13136 if (type != null) { | 12936 if (type != null) { |
| 13137 overrides[element] = type; | 12937 overrides[element] = type; |
| 13138 } | 12938 } |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13703 * Return the type with the given name from the given namespace, or `null` if
there is no | 13503 * Return the type with the given name from the given namespace, or `null` if
there is no |
| 13704 * class with the given name. | 13504 * class with the given name. |
| 13705 * | 13505 * |
| 13706 * @param namespace the namespace in which to search for the given name | 13506 * @param namespace the namespace in which to search for the given name |
| 13707 * @param typeName the name of the type being searched for | 13507 * @param typeName the name of the type being searched for |
| 13708 * @return the type that was found | 13508 * @return the type that was found |
| 13709 */ | 13509 */ |
| 13710 InterfaceType _getType(Namespace namespace, String typeName) { | 13510 InterfaceType _getType(Namespace namespace, String typeName) { |
| 13711 Element element = namespace.get(typeName); | 13511 Element element = namespace.get(typeName); |
| 13712 if (element == null) { | 13512 if (element == null) { |
| 13713 AnalysisEngine.instance.logger.logInformation( | 13513 AnalysisEngine.instance.logger |
| 13714 "No definition of type $typeName"); | 13514 .logInformation("No definition of type $typeName"); |
| 13715 return null; | 13515 return null; |
| 13716 } | 13516 } |
| 13717 return (element as ClassElement).type; | 13517 return (element as ClassElement).type; |
| 13718 } | 13518 } |
| 13719 | 13519 |
| 13720 /** | 13520 /** |
| 13721 * Initialize the types provided by this type provider from the given library. | 13521 * Initialize the types provided by this type provider from the given library. |
| 13722 * | 13522 * |
| 13723 * @param library the library containing the definitions of the core types | 13523 * @param library the library containing the definitions of the core types |
| 13724 */ | 13524 */ |
| 13725 void _initializeFrom(LibraryElement coreLibrary, | 13525 void _initializeFrom( |
| 13726 LibraryElement asyncLibrary) { | 13526 LibraryElement coreLibrary, LibraryElement asyncLibrary) { |
| 13727 Namespace coreNamespace = | 13527 Namespace coreNamespace = |
| 13728 new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary); | 13528 new NamespaceBuilder().createPublicNamespaceForLibrary(coreLibrary); |
| 13729 Namespace asyncNamespace = | 13529 Namespace asyncNamespace = |
| 13730 new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary); | 13530 new NamespaceBuilder().createPublicNamespaceForLibrary(asyncLibrary); |
| 13731 _boolType = _getType(coreNamespace, "bool"); | 13531 _boolType = _getType(coreNamespace, "bool"); |
| 13732 _bottomType = BottomTypeImpl.instance; | 13532 _bottomType = BottomTypeImpl.instance; |
| 13733 _deprecatedType = _getType(coreNamespace, "Deprecated"); | 13533 _deprecatedType = _getType(coreNamespace, "Deprecated"); |
| 13734 _doubleType = _getType(coreNamespace, "double"); | 13534 _doubleType = _getType(coreNamespace, "double"); |
| 13735 _dynamicType = DynamicTypeImpl.instance; | 13535 _dynamicType = DynamicTypeImpl.instance; |
| 13736 _functionType = _getType(coreNamespace, "Function"); | 13536 _functionType = _getType(coreNamespace, "Function"); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13777 */ | 13577 */ |
| 13778 bool _hasReferenceToSuper = false; | 13578 bool _hasReferenceToSuper = false; |
| 13779 | 13579 |
| 13780 /** | 13580 /** |
| 13781 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 13581 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 13782 * | 13582 * |
| 13783 * @param library the library containing the compilation unit being resolved | 13583 * @param library the library containing the compilation unit being resolved |
| 13784 * @param source the source representing the compilation unit being visited | 13584 * @param source the source representing the compilation unit being visited |
| 13785 * @param typeProvider the object used to access the types from the core libra
ry | 13585 * @param typeProvider the object used to access the types from the core libra
ry |
| 13786 */ | 13586 */ |
| 13787 TypeResolverVisitor.con1(Library library, Source source, | 13587 TypeResolverVisitor.con1( |
| 13788 TypeProvider typeProvider) | 13588 Library library, Source source, TypeProvider typeProvider) |
| 13789 : super.con1(library, source, typeProvider) { | 13589 : super.con1(library, source, typeProvider) { |
| 13790 _dynamicType = typeProvider.dynamicType; | 13590 _dynamicType = typeProvider.dynamicType; |
| 13791 _undefinedType = typeProvider.undefinedType; | 13591 _undefinedType = typeProvider.undefinedType; |
| 13792 } | 13592 } |
| 13793 | 13593 |
| 13794 /** | 13594 /** |
| 13795 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 13595 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 13796 * | 13596 * |
| 13797 * @param definingLibrary the element for the library containing the compilati
on unit being | 13597 * @param definingLibrary the element for the library containing the compilati
on unit being |
| 13798 * visited | 13598 * visited |
| (...skipping 13 matching lines...) Expand all Loading... |
| 13812 * Initialize a newly created visitor to resolve the nodes in an AST node. | 13612 * Initialize a newly created visitor to resolve the nodes in an AST node. |
| 13813 * | 13613 * |
| 13814 * @param definingLibrary the element for the library containing the node bein
g visited | 13614 * @param definingLibrary the element for the library containing the node bein
g visited |
| 13815 * @param source the source representing the compilation unit containing the n
ode being visited | 13615 * @param source the source representing the compilation unit containing the n
ode being visited |
| 13816 * @param typeProvider the object used to access the types from the core libra
ry | 13616 * @param typeProvider the object used to access the types from the core libra
ry |
| 13817 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited | 13617 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited |
| 13818 * @param errorListener the error listener that will be informed of any errors
that are found | 13618 * @param errorListener the error listener that will be informed of any errors
that are found |
| 13819 * during resolution | 13619 * during resolution |
| 13820 */ | 13620 */ |
| 13821 TypeResolverVisitor.con3(LibraryElement definingLibrary, Source source, | 13621 TypeResolverVisitor.con3(LibraryElement definingLibrary, Source source, |
| 13822 TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorLis
tener) | 13622 TypeProvider typeProvider, Scope nameScope, |
| 13623 AnalysisErrorListener errorListener) |
| 13823 : super.con3( | 13624 : super.con3( |
| 13824 definingLibrary, | 13625 definingLibrary, source, typeProvider, nameScope, errorListener) { |
| 13825 source, | |
| 13826 typeProvider, | |
| 13827 nameScope, | |
| 13828 errorListener) { | |
| 13829 _dynamicType = typeProvider.dynamicType; | 13626 _dynamicType = typeProvider.dynamicType; |
| 13830 _undefinedType = typeProvider.undefinedType; | 13627 _undefinedType = typeProvider.undefinedType; |
| 13831 } | 13628 } |
| 13832 | 13629 |
| 13833 /** | 13630 /** |
| 13834 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 13631 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 13835 * | 13632 * |
| 13836 * @param library the library containing the compilation unit being resolved | 13633 * @param library the library containing the compilation unit being resolved |
| 13837 * @param source the source representing the compilation unit being visited | 13634 * @param source the source representing the compilation unit being visited |
| 13838 * @param typeProvider the object used to access the types from the core libra
ry | 13635 * @param typeProvider the object used to access the types from the core libra
ry |
| 13839 */ | 13636 */ |
| 13840 TypeResolverVisitor.con4(ResolvableLibrary library, Source source, | 13637 TypeResolverVisitor.con4( |
| 13841 TypeProvider typeProvider) | 13638 ResolvableLibrary library, Source source, TypeProvider typeProvider) |
| 13842 : super.con4(library, source, typeProvider) { | 13639 : super.con4(library, source, typeProvider) { |
| 13843 _dynamicType = typeProvider.dynamicType; | 13640 _dynamicType = typeProvider.dynamicType; |
| 13844 _undefinedType = typeProvider.undefinedType; | 13641 _undefinedType = typeProvider.undefinedType; |
| 13845 } | 13642 } |
| 13846 | 13643 |
| 13847 @override | 13644 @override |
| 13848 Object visitAnnotation(Annotation node) { | 13645 Object visitAnnotation(Annotation node) { |
| 13849 // | 13646 // |
| 13850 // Visit annotations, if the annotation is @proxy, on a class, and "proxy" | 13647 // Visit annotations, if the annotation is @proxy, on a class, and "proxy" |
| 13851 // resolves to the proxy annotation in dart.core, then create create the | 13648 // resolves to the proxy annotation in dart.core, then create create the |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13920 | 13717 |
| 13921 @override | 13718 @override |
| 13922 void visitClassDeclarationInScope(ClassDeclaration node) { | 13719 void visitClassDeclarationInScope(ClassDeclaration node) { |
| 13923 super.visitClassDeclarationInScope(node); | 13720 super.visitClassDeclarationInScope(node); |
| 13924 ExtendsClause extendsClause = node.extendsClause; | 13721 ExtendsClause extendsClause = node.extendsClause; |
| 13925 WithClause withClause = node.withClause; | 13722 WithClause withClause = node.withClause; |
| 13926 ImplementsClause implementsClause = node.implementsClause; | 13723 ImplementsClause implementsClause = node.implementsClause; |
| 13927 ClassElementImpl classElement = _getClassElement(node.name); | 13724 ClassElementImpl classElement = _getClassElement(node.name); |
| 13928 InterfaceType superclassType = null; | 13725 InterfaceType superclassType = null; |
| 13929 if (extendsClause != null) { | 13726 if (extendsClause != null) { |
| 13930 ErrorCode errorCode = (withClause == null ? | 13727 ErrorCode errorCode = (withClause == null |
| 13931 CompileTimeErrorCode.EXTENDS_NON_CLASS : | 13728 ? CompileTimeErrorCode.EXTENDS_NON_CLASS |
| 13932 CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS); | 13729 : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS); |
| 13933 superclassType = _resolveType( | 13730 superclassType = _resolveType(extendsClause.superclass, errorCode, |
| 13934 extendsClause.superclass, | 13731 CompileTimeErrorCode.EXTENDS_ENUM, errorCode); |
| 13935 errorCode, | |
| 13936 CompileTimeErrorCode.EXTENDS_ENUM, | |
| 13937 errorCode); | |
| 13938 if (!identical(superclassType, typeProvider.objectType)) { | 13732 if (!identical(superclassType, typeProvider.objectType)) { |
| 13939 classElement.validMixin = false; | 13733 classElement.validMixin = false; |
| 13940 } | 13734 } |
| 13941 } | 13735 } |
| 13942 if (classElement != null) { | 13736 if (classElement != null) { |
| 13943 if (superclassType == null) { | 13737 if (superclassType == null) { |
| 13944 InterfaceType objectType = typeProvider.objectType; | 13738 InterfaceType objectType = typeProvider.objectType; |
| 13945 if (!identical(classElement.type, objectType)) { | 13739 if (!identical(classElement.type, objectType)) { |
| 13946 superclassType = objectType; | 13740 superclassType = objectType; |
| 13947 } | 13741 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 13964 int count = nonFields.length; | 13758 int count = nonFields.length; |
| 13965 for (int i = 0; i < count; i++) { | 13759 for (int i = 0; i < count; i++) { |
| 13966 nonFields[i].accept(this); | 13760 nonFields[i].accept(this); |
| 13967 } | 13761 } |
| 13968 } | 13762 } |
| 13969 | 13763 |
| 13970 @override | 13764 @override |
| 13971 Object visitClassTypeAlias(ClassTypeAlias node) { | 13765 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 13972 super.visitClassTypeAlias(node); | 13766 super.visitClassTypeAlias(node); |
| 13973 ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS; | 13767 ErrorCode errorCode = CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS; |
| 13974 InterfaceType superclassType = _resolveType( | 13768 InterfaceType superclassType = _resolveType(node.superclass, errorCode, |
| 13975 node.superclass, | 13769 CompileTimeErrorCode.EXTENDS_ENUM, errorCode); |
| 13976 errorCode, | |
| 13977 CompileTimeErrorCode.EXTENDS_ENUM, | |
| 13978 errorCode); | |
| 13979 if (superclassType == null) { | 13770 if (superclassType == null) { |
| 13980 superclassType = typeProvider.objectType; | 13771 superclassType = typeProvider.objectType; |
| 13981 } | 13772 } |
| 13982 ClassElementImpl classElement = _getClassElement(node.name); | 13773 ClassElementImpl classElement = _getClassElement(node.name); |
| 13983 if (classElement != null) { | 13774 if (classElement != null) { |
| 13984 classElement.supertype = superclassType; | 13775 classElement.supertype = superclassType; |
| 13985 } | 13776 } |
| 13986 _resolve(classElement, node.withClause, node.implementsClause); | 13777 _resolve(classElement, node.withClause, node.implementsClause); |
| 13987 return null; | 13778 return null; |
| 13988 } | 13779 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 13999 buffer.write(node.name == null ? "<unnamed>" : node.name.name); | 13790 buffer.write(node.name == null ? "<unnamed>" : node.name.name); |
| 14000 buffer.write(" in "); | 13791 buffer.write(" in "); |
| 14001 if (classNode == null) { | 13792 if (classNode == null) { |
| 14002 buffer.write("<unknown class>"); | 13793 buffer.write("<unknown class>"); |
| 14003 } else { | 13794 } else { |
| 14004 buffer.write(classNode.name.name); | 13795 buffer.write(classNode.name.name); |
| 14005 } | 13796 } |
| 14006 buffer.write(" in "); | 13797 buffer.write(" in "); |
| 14007 buffer.write(source.fullName); | 13798 buffer.write(source.fullName); |
| 14008 buffer.write(" was not set while trying to resolve types."); | 13799 buffer.write(" was not set while trying to resolve types."); |
| 14009 AnalysisEngine.instance.logger.logError( | 13800 AnalysisEngine.instance.logger.logError(buffer.toString(), |
| 14010 buffer.toString(), | |
| 14011 new CaughtException(new AnalysisException(), null)); | 13801 new CaughtException(new AnalysisException(), null)); |
| 14012 } else { | 13802 } else { |
| 14013 ClassElement definingClass = element.enclosingElement as ClassElement; | 13803 ClassElement definingClass = element.enclosingElement as ClassElement; |
| 14014 element.returnType = definingClass.type; | 13804 element.returnType = definingClass.type; |
| 14015 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); | 13805 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); |
| 14016 type.typeArguments = definingClass.type.typeArguments; | 13806 type.typeArguments = definingClass.type.typeArguments; |
| 14017 element.type = type; | 13807 element.type = type; |
| 14018 } | 13808 } |
| 14019 return null; | 13809 return null; |
| 14020 } | 13810 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14070 Object visitFunctionDeclaration(FunctionDeclaration node) { | 13860 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 14071 super.visitFunctionDeclaration(node); | 13861 super.visitFunctionDeclaration(node); |
| 14072 ExecutableElementImpl element = node.element as ExecutableElementImpl; | 13862 ExecutableElementImpl element = node.element as ExecutableElementImpl; |
| 14073 if (element == null) { | 13863 if (element == null) { |
| 14074 StringBuffer buffer = new StringBuffer(); | 13864 StringBuffer buffer = new StringBuffer(); |
| 14075 buffer.write("The element for the top-level function "); | 13865 buffer.write("The element for the top-level function "); |
| 14076 buffer.write(node.name); | 13866 buffer.write(node.name); |
| 14077 buffer.write(" in "); | 13867 buffer.write(" in "); |
| 14078 buffer.write(source.fullName); | 13868 buffer.write(source.fullName); |
| 14079 buffer.write(" was not set while trying to resolve types."); | 13869 buffer.write(" was not set while trying to resolve types."); |
| 14080 AnalysisEngine.instance.logger.logError( | 13870 AnalysisEngine.instance.logger.logError(buffer.toString(), |
| 14081 buffer.toString(), | |
| 14082 new CaughtException(new AnalysisException(), null)); | 13871 new CaughtException(new AnalysisException(), null)); |
| 14083 } | 13872 } |
| 14084 element.returnType = _computeReturnType(node.returnType); | 13873 element.returnType = _computeReturnType(node.returnType); |
| 14085 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); | 13874 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); |
| 14086 ClassElement definingClass = | 13875 ClassElement definingClass = |
| 14087 element.getAncestor((element) => element is ClassElement); | 13876 element.getAncestor((element) => element is ClassElement); |
| 14088 if (definingClass != null) { | 13877 if (definingClass != null) { |
| 14089 type.typeArguments = definingClass.type.typeArguments; | 13878 type.typeArguments = definingClass.type.typeArguments; |
| 14090 } | 13879 } |
| 14091 element.type = type; | 13880 element.type = type; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14128 buffer.write(node.name.name); | 13917 buffer.write(node.name.name); |
| 14129 buffer.write(" in "); | 13918 buffer.write(" in "); |
| 14130 if (classNode == null) { | 13919 if (classNode == null) { |
| 14131 buffer.write("<unknown class>"); | 13920 buffer.write("<unknown class>"); |
| 14132 } else { | 13921 } else { |
| 14133 buffer.write(classNode.name.name); | 13922 buffer.write(classNode.name.name); |
| 14134 } | 13923 } |
| 14135 buffer.write(" in "); | 13924 buffer.write(" in "); |
| 14136 buffer.write(source.fullName); | 13925 buffer.write(source.fullName); |
| 14137 buffer.write(" was not set while trying to resolve types."); | 13926 buffer.write(" was not set while trying to resolve types."); |
| 14138 AnalysisEngine.instance.logger.logError( | 13927 AnalysisEngine.instance.logger.logError(buffer.toString(), |
| 14139 buffer.toString(), | |
| 14140 new CaughtException(new AnalysisException(), null)); | 13928 new CaughtException(new AnalysisException(), null)); |
| 14141 } | 13929 } |
| 14142 element.returnType = _computeReturnType(node.returnType); | 13930 element.returnType = _computeReturnType(node.returnType); |
| 14143 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); | 13931 FunctionTypeImpl type = new FunctionTypeImpl.con1(element); |
| 14144 ClassElement definingClass = | 13932 ClassElement definingClass = |
| 14145 element.getAncestor((element) => element is ClassElement); | 13933 element.getAncestor((element) => element is ClassElement); |
| 14146 if (definingClass != null) { | 13934 if (definingClass != null) { |
| 14147 type.typeArguments = definingClass.type.typeArguments; | 13935 type.typeArguments = definingClass.type.typeArguments; |
| 14148 } | 13936 } |
| 14149 element.type = type; | 13937 element.type = type; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14234 if (name.name == null) { | 14022 if (name.name == null) { |
| 14235 PrefixedIdentifier prefixedIdentifier = | 14023 PrefixedIdentifier prefixedIdentifier = |
| 14236 typeName as PrefixedIdentifier; | 14024 typeName as PrefixedIdentifier; |
| 14237 SimpleIdentifier prefix = prefixedIdentifier.prefix; | 14025 SimpleIdentifier prefix = prefixedIdentifier.prefix; |
| 14238 element = nameScope.lookup(prefix, definingLibrary); | 14026 element = nameScope.lookup(prefix, definingLibrary); |
| 14239 if (element is PrefixElement) { | 14027 if (element is PrefixElement) { |
| 14240 if (parent.parent is InstanceCreationExpression && | 14028 if (parent.parent is InstanceCreationExpression && |
| 14241 (parent.parent as InstanceCreationExpression).isConst) { | 14029 (parent.parent as InstanceCreationExpression).isConst) { |
| 14242 // If, if this is a const expression, then generate a | 14030 // If, if this is a const expression, then generate a |
| 14243 // CompileTimeErrorCode.CONST_WITH_NON_TYPE error. | 14031 // CompileTimeErrorCode.CONST_WITH_NON_TYPE error. |
| 14244 reportErrorForNode( | 14032 reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_TYPE, |
| 14245 CompileTimeErrorCode.CONST_WITH_NON_TYPE, | |
| 14246 prefixedIdentifier.identifier, | 14033 prefixedIdentifier.identifier, |
| 14247 [prefixedIdentifier.identifier.name]); | 14034 [prefixedIdentifier.identifier.name]); |
| 14248 } else { | 14035 } else { |
| 14249 // Else, if this expression is a new expression, report a | 14036 // Else, if this expression is a new expression, report a |
| 14250 // NEW_WITH_NON_TYPE warning. | 14037 // NEW_WITH_NON_TYPE warning. |
| 14251 reportErrorForNode( | 14038 reportErrorForNode(StaticWarningCode.NEW_WITH_NON_TYPE, |
| 14252 StaticWarningCode.NEW_WITH_NON_TYPE, | 14039 prefixedIdentifier.identifier, [ |
| 14253 prefixedIdentifier.identifier, | 14040 prefixedIdentifier.identifier.name |
| 14254 [prefixedIdentifier.identifier.name]); | 14041 ]); |
| 14255 } | 14042 } |
| 14256 _setElement(prefix, element); | 14043 _setElement(prefix, element); |
| 14257 return null; | 14044 return null; |
| 14258 } else if (element != null) { | 14045 } else if (element != null) { |
| 14259 // | 14046 // |
| 14260 // Rewrite the constructor name. The parser, when it sees a | 14047 // Rewrite the constructor name. The parser, when it sees a |
| 14261 // constructor named "a.b", cannot tell whether "a" is a prefix and | 14048 // constructor named "a.b", cannot tell whether "a" is a prefix and |
| 14262 // "b" is a class name, or whether "a" is a class name and "b" is a | 14049 // "b" is a class name, or whether "a" is a class name and "b" is a |
| 14263 // constructor name. It arbitrarily chooses the former, but in this | 14050 // constructor name. It arbitrarily chooses the former, but in this |
| 14264 // case was wrong. | 14051 // case was wrong. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 14275 bool elementValid = element is! MultiplyDefinedElement; | 14062 bool elementValid = element is! MultiplyDefinedElement; |
| 14276 if (elementValid && | 14063 if (elementValid && |
| 14277 element is! ClassElement && | 14064 element is! ClassElement && |
| 14278 _isTypeNameInInstanceCreationExpression(node)) { | 14065 _isTypeNameInInstanceCreationExpression(node)) { |
| 14279 SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName); | 14066 SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName); |
| 14280 InstanceCreationExpression creation = | 14067 InstanceCreationExpression creation = |
| 14281 node.parent.parent as InstanceCreationExpression; | 14068 node.parent.parent as InstanceCreationExpression; |
| 14282 if (creation.isConst) { | 14069 if (creation.isConst) { |
| 14283 if (element == null) { | 14070 if (element == null) { |
| 14284 reportErrorForNode( | 14071 reportErrorForNode( |
| 14285 CompileTimeErrorCode.UNDEFINED_CLASS, | 14072 CompileTimeErrorCode.UNDEFINED_CLASS, typeNameSimple, [typeName]); |
| 14286 typeNameSimple, | |
| 14287 [typeName]); | |
| 14288 } else { | 14073 } else { |
| 14289 reportErrorForNode( | 14074 reportErrorForNode(CompileTimeErrorCode.CONST_WITH_NON_TYPE, |
| 14290 CompileTimeErrorCode.CONST_WITH_NON_TYPE, | 14075 typeNameSimple, [typeName]); |
| 14291 typeNameSimple, | |
| 14292 [typeName]); | |
| 14293 } | 14076 } |
| 14294 elementValid = false; | 14077 elementValid = false; |
| 14295 } else { | 14078 } else { |
| 14296 if (element != null) { | 14079 if (element != null) { |
| 14297 reportErrorForNode( | 14080 reportErrorForNode( |
| 14298 StaticWarningCode.NEW_WITH_NON_TYPE, | 14081 StaticWarningCode.NEW_WITH_NON_TYPE, typeNameSimple, [typeName]); |
| 14299 typeNameSimple, | |
| 14300 [typeName]); | |
| 14301 elementValid = false; | 14082 elementValid = false; |
| 14302 } | 14083 } |
| 14303 } | 14084 } |
| 14304 } | 14085 } |
| 14305 if (elementValid && element == null) { | 14086 if (elementValid && element == null) { |
| 14306 // We couldn't resolve the type name. | 14087 // We couldn't resolve the type name. |
| 14307 // TODO(jwren) Consider moving the check for | 14088 // TODO(jwren) Consider moving the check for |
| 14308 // CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE from the | 14089 // CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE from the |
| 14309 // ErrorVerifier, so that we don't have two errors on a built in | 14090 // ErrorVerifier, so that we don't have two errors on a built in |
| 14310 // identifier being used as a class name. | 14091 // identifier being used as a class name. |
| 14311 // See CompileTimeErrorCodeTest.test_builtInIdentifierAsType(). | 14092 // See CompileTimeErrorCodeTest.test_builtInIdentifierAsType(). |
| 14312 SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName); | 14093 SimpleIdentifier typeNameSimple = _getTypeSimpleIdentifier(typeName); |
| 14313 RedirectingConstructorKind redirectingConstructorKind; | 14094 RedirectingConstructorKind redirectingConstructorKind; |
| 14314 if (_isBuiltInIdentifier(node) && _isTypeAnnotation(node)) { | 14095 if (_isBuiltInIdentifier(node) && _isTypeAnnotation(node)) { |
| 14315 reportErrorForNode( | 14096 reportErrorForNode(CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, |
| 14316 CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPE, | 14097 typeName, [typeName.name]); |
| 14317 typeName, | |
| 14318 [typeName.name]); | |
| 14319 } else if (typeNameSimple.name == "boolean") { | 14098 } else if (typeNameSimple.name == "boolean") { |
| 14320 reportErrorForNode( | 14099 reportErrorForNode( |
| 14321 StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, | 14100 StaticWarningCode.UNDEFINED_CLASS_BOOLEAN, typeNameSimple, []); |
| 14322 typeNameSimple, | |
| 14323 []); | |
| 14324 } else if (_isTypeNameInCatchClause(node)) { | 14101 } else if (_isTypeNameInCatchClause(node)) { |
| 14325 reportErrorForNode( | 14102 reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, |
| 14326 StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, | |
| 14327 typeName, | |
| 14328 [typeName.name]); | 14103 [typeName.name]); |
| 14329 } else if (_isTypeNameInAsExpression(node)) { | 14104 } else if (_isTypeNameInAsExpression(node)) { |
| 14330 reportErrorForNode( | 14105 reportErrorForNode( |
| 14331 StaticWarningCode.CAST_TO_NON_TYPE, | 14106 StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]); |
| 14332 typeName, | |
| 14333 [typeName.name]); | |
| 14334 } else if (_isTypeNameInIsExpression(node)) { | 14107 } else if (_isTypeNameInIsExpression(node)) { |
| 14335 reportErrorForNode( | 14108 reportErrorForNode(StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME, |
| 14336 StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME, | 14109 typeName, [typeName.name]); |
| 14337 typeName, | |
| 14338 [typeName.name]); | |
| 14339 } else if ((redirectingConstructorKind = | 14110 } else if ((redirectingConstructorKind = |
| 14340 _getRedirectingConstructorKind(node)) != null) { | 14111 _getRedirectingConstructorKind(node)) != |
| 14341 ErrorCode errorCode = | 14112 null) { |
| 14342 (redirectingConstructorKind == RedirectingConstructorKind.CONST ? | 14113 ErrorCode errorCode = (redirectingConstructorKind == |
| 14343 CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : | 14114 RedirectingConstructorKind.CONST |
| 14344 StaticWarningCode.REDIRECT_TO_NON_CLASS); | 14115 ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS |
| 14116 : StaticWarningCode.REDIRECT_TO_NON_CLASS); |
| 14345 reportErrorForNode(errorCode, typeName, [typeName.name]); | 14117 reportErrorForNode(errorCode, typeName, [typeName.name]); |
| 14346 } else if (_isTypeNameInTypeArgumentList(node)) { | 14118 } else if (_isTypeNameInTypeArgumentList(node)) { |
| 14347 reportErrorForNode( | 14119 reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, |
| 14348 StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, | 14120 typeName, [typeName.name]); |
| 14349 typeName, | |
| 14350 [typeName.name]); | |
| 14351 } else { | 14121 } else { |
| 14352 reportErrorForNode( | 14122 reportErrorForNode( |
| 14353 StaticWarningCode.UNDEFINED_CLASS, | 14123 StaticWarningCode.UNDEFINED_CLASS, typeName, [typeName.name]); |
| 14354 typeName, | |
| 14355 [typeName.name]); | |
| 14356 } | 14124 } |
| 14357 elementValid = false; | 14125 elementValid = false; |
| 14358 } | 14126 } |
| 14359 if (!elementValid) { | 14127 if (!elementValid) { |
| 14360 if (element is MultiplyDefinedElement) { | 14128 if (element is MultiplyDefinedElement) { |
| 14361 _setElement(typeName, element); | 14129 _setElement(typeName, element); |
| 14362 } else { | 14130 } else { |
| 14363 _setElement(typeName, _dynamicType.element); | 14131 _setElement(typeName, _dynamicType.element); |
| 14364 } | 14132 } |
| 14365 typeName.staticType = _undefinedType; | 14133 typeName.staticType = _undefinedType; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 14385 List<Element> elements = | 14153 List<Element> elements = |
| 14386 (element as MultiplyDefinedElement).conflictingElements; | 14154 (element as MultiplyDefinedElement).conflictingElements; |
| 14387 type = _getTypeWhenMultiplyDefined(elements); | 14155 type = _getTypeWhenMultiplyDefined(elements); |
| 14388 if (type != null) { | 14156 if (type != null) { |
| 14389 node.type = type; | 14157 node.type = type; |
| 14390 } | 14158 } |
| 14391 } else { | 14159 } else { |
| 14392 // The name does not represent a type. | 14160 // The name does not represent a type. |
| 14393 RedirectingConstructorKind redirectingConstructorKind; | 14161 RedirectingConstructorKind redirectingConstructorKind; |
| 14394 if (_isTypeNameInCatchClause(node)) { | 14162 if (_isTypeNameInCatchClause(node)) { |
| 14395 reportErrorForNode( | 14163 reportErrorForNode(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, typeName, |
| 14396 StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, | |
| 14397 typeName, | |
| 14398 [typeName.name]); | 14164 [typeName.name]); |
| 14399 } else if (_isTypeNameInAsExpression(node)) { | 14165 } else if (_isTypeNameInAsExpression(node)) { |
| 14400 reportErrorForNode( | 14166 reportErrorForNode( |
| 14401 StaticWarningCode.CAST_TO_NON_TYPE, | 14167 StaticWarningCode.CAST_TO_NON_TYPE, typeName, [typeName.name]); |
| 14402 typeName, | |
| 14403 [typeName.name]); | |
| 14404 } else if (_isTypeNameInIsExpression(node)) { | 14168 } else if (_isTypeNameInIsExpression(node)) { |
| 14405 reportErrorForNode( | 14169 reportErrorForNode(StaticWarningCode.TYPE_TEST_WITH_NON_TYPE, typeName, |
| 14406 StaticWarningCode.TYPE_TEST_WITH_NON_TYPE, | |
| 14407 typeName, | |
| 14408 [typeName.name]); | 14170 [typeName.name]); |
| 14409 } else if ((redirectingConstructorKind = | 14171 } else if ((redirectingConstructorKind = |
| 14410 _getRedirectingConstructorKind(node)) != null) { | 14172 _getRedirectingConstructorKind(node)) != |
| 14411 ErrorCode errorCode = | 14173 null) { |
| 14412 (redirectingConstructorKind == RedirectingConstructorKind.CONST ? | 14174 ErrorCode errorCode = (redirectingConstructorKind == |
| 14413 CompileTimeErrorCode.REDIRECT_TO_NON_CLASS : | 14175 RedirectingConstructorKind.CONST |
| 14414 StaticWarningCode.REDIRECT_TO_NON_CLASS); | 14176 ? CompileTimeErrorCode.REDIRECT_TO_NON_CLASS |
| 14177 : StaticWarningCode.REDIRECT_TO_NON_CLASS); |
| 14415 reportErrorForNode(errorCode, typeName, [typeName.name]); | 14178 reportErrorForNode(errorCode, typeName, [typeName.name]); |
| 14416 } else if (_isTypeNameInTypeArgumentList(node)) { | 14179 } else if (_isTypeNameInTypeArgumentList(node)) { |
| 14417 reportErrorForNode( | 14180 reportErrorForNode(StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, |
| 14418 StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT, | 14181 typeName, [typeName.name]); |
| 14419 typeName, | |
| 14420 [typeName.name]); | |
| 14421 } else { | 14182 } else { |
| 14422 AstNode parent = typeName.parent; | 14183 AstNode parent = typeName.parent; |
| 14423 while (parent is TypeName) { | 14184 while (parent is TypeName) { |
| 14424 parent = parent.parent; | 14185 parent = parent.parent; |
| 14425 } | 14186 } |
| 14426 if (parent is ExtendsClause || | 14187 if (parent is ExtendsClause || |
| 14427 parent is ImplementsClause || | 14188 parent is ImplementsClause || |
| 14428 parent is WithClause || | 14189 parent is WithClause || |
| 14429 parent is ClassTypeAlias) { | 14190 parent is ClassTypeAlias) { |
| 14430 // Ignored. The error will be reported elsewhere. | 14191 // Ignored. The error will be reported elsewhere. |
| 14431 } else { | 14192 } else { |
| 14432 reportErrorForNode( | 14193 reportErrorForNode( |
| 14433 StaticWarningCode.NOT_A_TYPE, | 14194 StaticWarningCode.NOT_A_TYPE, typeName, [typeName.name]); |
| 14434 typeName, | |
| 14435 [typeName.name]); | |
| 14436 } | 14195 } |
| 14437 } | 14196 } |
| 14438 _setElement(typeName, _dynamicType.element); | 14197 _setElement(typeName, _dynamicType.element); |
| 14439 typeName.staticType = _dynamicType; | 14198 typeName.staticType = _dynamicType; |
| 14440 node.type = _dynamicType; | 14199 node.type = _dynamicType; |
| 14441 return null; | 14200 return null; |
| 14442 } | 14201 } |
| 14443 if (argumentList != null) { | 14202 if (argumentList != null) { |
| 14444 NodeList<TypeName> arguments = argumentList.arguments; | 14203 NodeList<TypeName> arguments = argumentList.arguments; |
| 14445 int argumentCount = arguments.length; | 14204 int argumentCount = arguments.length; |
| 14446 List<DartType> parameters = _getTypeArguments(type); | 14205 List<DartType> parameters = _getTypeArguments(type); |
| 14447 int parameterCount = parameters.length; | 14206 int parameterCount = parameters.length; |
| 14448 List<DartType> typeArguments = new List<DartType>(parameterCount); | 14207 List<DartType> typeArguments = new List<DartType>(parameterCount); |
| 14449 if (argumentCount == parameterCount) { | 14208 if (argumentCount == parameterCount) { |
| 14450 for (int i = 0; i < parameterCount; i++) { | 14209 for (int i = 0; i < parameterCount; i++) { |
| 14451 TypeName argumentTypeName = arguments[i]; | 14210 TypeName argumentTypeName = arguments[i]; |
| 14452 DartType argumentType = _getType(argumentTypeName); | 14211 DartType argumentType = _getType(argumentTypeName); |
| 14453 if (argumentType == null) { | 14212 if (argumentType == null) { |
| 14454 argumentType = _dynamicType; | 14213 argumentType = _dynamicType; |
| 14455 } | 14214 } |
| 14456 typeArguments[i] = argumentType; | 14215 typeArguments[i] = argumentType; |
| 14457 } | 14216 } |
| 14458 } else { | 14217 } else { |
| 14459 reportErrorForNode( | 14218 reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node, [ |
| 14460 _getInvalidTypeParametersErrorCode(node), | 14219 typeName.name, |
| 14461 node, | 14220 parameterCount, |
| 14462 [typeName.name, parameterCount, argumentCount]); | 14221 argumentCount |
| 14222 ]); |
| 14463 for (int i = 0; i < parameterCount; i++) { | 14223 for (int i = 0; i < parameterCount; i++) { |
| 14464 typeArguments[i] = _dynamicType; | 14224 typeArguments[i] = _dynamicType; |
| 14465 } | 14225 } |
| 14466 } | 14226 } |
| 14467 if (type is InterfaceTypeImpl) { | 14227 if (type is InterfaceTypeImpl) { |
| 14468 InterfaceTypeImpl interfaceType = type as InterfaceTypeImpl; | 14228 InterfaceTypeImpl interfaceType = type as InterfaceTypeImpl; |
| 14469 type = interfaceType.substitute4(typeArguments); | 14229 type = interfaceType.substitute4(typeArguments); |
| 14470 } else if (type is FunctionTypeImpl) { | 14230 } else if (type is FunctionTypeImpl) { |
| 14471 FunctionTypeImpl functionType = type as FunctionTypeImpl; | 14231 FunctionTypeImpl functionType = type as FunctionTypeImpl; |
| 14472 type = functionType.substitute3(typeArguments); | 14232 type = functionType.substitute3(typeArguments); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14646 */ | 14406 */ |
| 14647 RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) { | 14407 RedirectingConstructorKind _getRedirectingConstructorKind(TypeName typeName) { |
| 14648 AstNode parent = typeName.parent; | 14408 AstNode parent = typeName.parent; |
| 14649 if (parent is ConstructorName) { | 14409 if (parent is ConstructorName) { |
| 14650 ConstructorName constructorName = parent as ConstructorName; | 14410 ConstructorName constructorName = parent as ConstructorName; |
| 14651 parent = constructorName.parent; | 14411 parent = constructorName.parent; |
| 14652 if (parent is ConstructorDeclaration) { | 14412 if (parent is ConstructorDeclaration) { |
| 14653 ConstructorDeclaration constructorDeclaration = | 14413 ConstructorDeclaration constructorDeclaration = |
| 14654 parent as ConstructorDeclaration; | 14414 parent as ConstructorDeclaration; |
| 14655 if (identical( | 14415 if (identical( |
| 14656 constructorDeclaration.redirectedConstructor, | 14416 constructorDeclaration.redirectedConstructor, constructorName)) { |
| 14657 constructorName)) { | |
| 14658 if (constructorDeclaration.constKeyword != null) { | 14417 if (constructorDeclaration.constKeyword != null) { |
| 14659 return RedirectingConstructorKind.CONST; | 14418 return RedirectingConstructorKind.CONST; |
| 14660 } | 14419 } |
| 14661 return RedirectingConstructorKind.NORMAL; | 14420 return RedirectingConstructorKind.NORMAL; |
| 14662 } | 14421 } |
| 14663 } | 14422 } |
| 14664 } | 14423 } |
| 14665 return null; | 14424 return null; |
| 14666 } | 14425 } |
| 14667 | 14426 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14820 * given class element. | 14579 * given class element. |
| 14821 * | 14580 * |
| 14822 * @param classElement the class element with which the mixin and interface ty
pes are to be | 14581 * @param classElement the class element with which the mixin and interface ty
pes are to be |
| 14823 * associated | 14582 * associated |
| 14824 * @param withClause the with clause to be resolved | 14583 * @param withClause the with clause to be resolved |
| 14825 * @param implementsClause the implements clause to be resolved | 14584 * @param implementsClause the implements clause to be resolved |
| 14826 */ | 14585 */ |
| 14827 void _resolve(ClassElementImpl classElement, WithClause withClause, | 14586 void _resolve(ClassElementImpl classElement, WithClause withClause, |
| 14828 ImplementsClause implementsClause) { | 14587 ImplementsClause implementsClause) { |
| 14829 if (withClause != null) { | 14588 if (withClause != null) { |
| 14830 List<InterfaceType> mixinTypes = _resolveTypes( | 14589 List<InterfaceType> mixinTypes = _resolveTypes(withClause.mixinTypes, |
| 14831 withClause.mixinTypes, | |
| 14832 CompileTimeErrorCode.MIXIN_OF_NON_CLASS, | 14590 CompileTimeErrorCode.MIXIN_OF_NON_CLASS, |
| 14833 CompileTimeErrorCode.MIXIN_OF_ENUM, | 14591 CompileTimeErrorCode.MIXIN_OF_ENUM, |
| 14834 CompileTimeErrorCode.MIXIN_OF_NON_CLASS); | 14592 CompileTimeErrorCode.MIXIN_OF_NON_CLASS); |
| 14835 if (classElement != null) { | 14593 if (classElement != null) { |
| 14836 classElement.mixins = mixinTypes; | 14594 classElement.mixins = mixinTypes; |
| 14837 } | 14595 } |
| 14838 } | 14596 } |
| 14839 if (implementsClause != null) { | 14597 if (implementsClause != null) { |
| 14840 NodeList<TypeName> interfaces = implementsClause.interfaces; | 14598 NodeList<TypeName> interfaces = implementsClause.interfaces; |
| 14841 List<InterfaceType> interfaceTypes = _resolveTypes( | 14599 List<InterfaceType> interfaceTypes = _resolveTypes(interfaces, |
| 14842 interfaces, | |
| 14843 CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, | 14600 CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, |
| 14844 CompileTimeErrorCode.IMPLEMENTS_ENUM, | 14601 CompileTimeErrorCode.IMPLEMENTS_ENUM, |
| 14845 CompileTimeErrorCode.IMPLEMENTS_DYNAMIC); | 14602 CompileTimeErrorCode.IMPLEMENTS_DYNAMIC); |
| 14846 if (classElement != null) { | 14603 if (classElement != null) { |
| 14847 classElement.interfaces = interfaceTypes; | 14604 classElement.interfaces = interfaceTypes; |
| 14848 } | 14605 } |
| 14849 // TODO(brianwilkerson) Move the following checks to ErrorVerifier. | 14606 // TODO(brianwilkerson) Move the following checks to ErrorVerifier. |
| 14850 int count = interfaces.length; | 14607 int count = interfaces.length; |
| 14851 List<bool> detectedRepeatOnIndex = new List<bool>.filled(count, false); | 14608 List<bool> detectedRepeatOnIndex = new List<bool>.filled(count, false); |
| 14852 for (int i = 0; i < detectedRepeatOnIndex.length; i++) { | 14609 for (int i = 0; i < detectedRepeatOnIndex.length; i++) { |
| 14853 detectedRepeatOnIndex[i] = false; | 14610 detectedRepeatOnIndex[i] = false; |
| 14854 } | 14611 } |
| 14855 for (int i = 0; i < count; i++) { | 14612 for (int i = 0; i < count; i++) { |
| 14856 TypeName typeName = interfaces[i]; | 14613 TypeName typeName = interfaces[i]; |
| 14857 if (!detectedRepeatOnIndex[i]) { | 14614 if (!detectedRepeatOnIndex[i]) { |
| 14858 Element element = typeName.name.staticElement; | 14615 Element element = typeName.name.staticElement; |
| 14859 for (int j = i + 1; j < count; j++) { | 14616 for (int j = i + 1; j < count; j++) { |
| 14860 TypeName typeName2 = interfaces[j]; | 14617 TypeName typeName2 = interfaces[j]; |
| 14861 Identifier identifier2 = typeName2.name; | 14618 Identifier identifier2 = typeName2.name; |
| 14862 String name2 = identifier2.name; | 14619 String name2 = identifier2.name; |
| 14863 Element element2 = identifier2.staticElement; | 14620 Element element2 = identifier2.staticElement; |
| 14864 if (element != null && element == element2) { | 14621 if (element != null && element == element2) { |
| 14865 detectedRepeatOnIndex[j] = true; | 14622 detectedRepeatOnIndex[j] = true; |
| 14866 reportErrorForNode( | 14623 reportErrorForNode( |
| 14867 CompileTimeErrorCode.IMPLEMENTS_REPEATED, | 14624 CompileTimeErrorCode.IMPLEMENTS_REPEATED, typeName2, [name2]); |
| 14868 typeName2, | |
| 14869 [name2]); | |
| 14870 } | 14625 } |
| 14871 } | 14626 } |
| 14872 } | 14627 } |
| 14873 } | 14628 } |
| 14874 } | 14629 } |
| 14875 } | 14630 } |
| 14876 | 14631 |
| 14877 /** | 14632 /** |
| 14878 * Return the type specified by the given name. | 14633 * Return the type specified by the given name. |
| 14879 * | 14634 * |
| (...skipping 30 matching lines...) Expand all Loading... |
| 14910 * Resolve the types in the given list of type names. | 14665 * Resolve the types in the given list of type names. |
| 14911 * | 14666 * |
| 14912 * @param typeNames the type names to be resolved | 14667 * @param typeNames the type names to be resolved |
| 14913 * @param nonTypeError the error to produce if the type name is defined to be
something other than | 14668 * @param nonTypeError the error to produce if the type name is defined to be
something other than |
| 14914 * a type | 14669 * a type |
| 14915 * @param enumTypeError the error to produce if the type name is defined to be
an enum | 14670 * @param enumTypeError the error to produce if the type name is defined to be
an enum |
| 14916 * @param dynamicTypeError the error to produce if the type name is "dynamic" | 14671 * @param dynamicTypeError the error to produce if the type name is "dynamic" |
| 14917 * @return an array containing all of the types that were resolved. | 14672 * @return an array containing all of the types that were resolved. |
| 14918 */ | 14673 */ |
| 14919 List<InterfaceType> _resolveTypes(NodeList<TypeName> typeNames, | 14674 List<InterfaceType> _resolveTypes(NodeList<TypeName> typeNames, |
| 14920 ErrorCode nonTypeError, ErrorCode enumTypeError, ErrorCode dynamicTypeErro
r) { | 14675 ErrorCode nonTypeError, ErrorCode enumTypeError, |
| 14676 ErrorCode dynamicTypeError) { |
| 14921 List<InterfaceType> types = new List<InterfaceType>(); | 14677 List<InterfaceType> types = new List<InterfaceType>(); |
| 14922 for (TypeName typeName in typeNames) { | 14678 for (TypeName typeName in typeNames) { |
| 14923 InterfaceType type = | 14679 InterfaceType type = |
| 14924 _resolveType(typeName, nonTypeError, enumTypeError, dynamicTypeError); | 14680 _resolveType(typeName, nonTypeError, enumTypeError, dynamicTypeError); |
| 14925 if (type != null) { | 14681 if (type != null) { |
| 14926 types.add(type); | 14682 types.add(type); |
| 14927 } | 14683 } |
| 14928 } | 14684 } |
| 14929 return types; | 14685 return types; |
| 14930 } | 14686 } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15027 */ | 14783 */ |
| 15028 ExecutableElement _enclosingFunction; | 14784 ExecutableElement _enclosingFunction; |
| 15029 | 14785 |
| 15030 /** | 14786 /** |
| 15031 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 14787 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 15032 * | 14788 * |
| 15033 * @param library the library containing the compilation unit being resolved | 14789 * @param library the library containing the compilation unit being resolved |
| 15034 * @param source the source representing the compilation unit being visited | 14790 * @param source the source representing the compilation unit being visited |
| 15035 * @param typeProvider the object used to access the types from the core libra
ry | 14791 * @param typeProvider the object used to access the types from the core libra
ry |
| 15036 */ | 14792 */ |
| 15037 VariableResolverVisitor.con1(Library library, Source source, | 14793 VariableResolverVisitor.con1( |
| 15038 TypeProvider typeProvider) | 14794 Library library, Source source, TypeProvider typeProvider) |
| 15039 : super.con1(library, source, typeProvider); | 14795 : super.con1(library, source, typeProvider); |
| 15040 | 14796 |
| 15041 /** | 14797 /** |
| 15042 * Initialize a newly created visitor to resolve the nodes in an AST node. | 14798 * Initialize a newly created visitor to resolve the nodes in an AST node. |
| 15043 * | 14799 * |
| 15044 * @param definingLibrary the element for the library containing the node bein
g visited | 14800 * @param definingLibrary the element for the library containing the node bein
g visited |
| 15045 * @param source the source representing the compilation unit containing the n
ode being visited | 14801 * @param source the source representing the compilation unit containing the n
ode being visited |
| 15046 * @param typeProvider the object used to access the types from the core libra
ry | 14802 * @param typeProvider the object used to access the types from the core libra
ry |
| 15047 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited | 14803 * @param nameScope the scope used to resolve identifiers in the node that wil
l first be visited |
| 15048 * @param errorListener the error listener that will be informed of any errors
that are found | 14804 * @param errorListener the error listener that will be informed of any errors
that are found |
| 15049 * during resolution | 14805 * during resolution |
| 15050 */ | 14806 */ |
| 15051 VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, | 14807 VariableResolverVisitor.con2(LibraryElement definingLibrary, Source source, |
| 15052 TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorLis
tener) | 14808 TypeProvider typeProvider, Scope nameScope, |
| 14809 AnalysisErrorListener errorListener) |
| 15053 : super.con3( | 14810 : super.con3( |
| 15054 definingLibrary, | 14811 definingLibrary, source, typeProvider, nameScope, errorListener); |
| 15055 source, | |
| 15056 typeProvider, | |
| 15057 nameScope, | |
| 15058 errorListener); | |
| 15059 | 14812 |
| 15060 /** | 14813 /** |
| 15061 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. | 14814 * Initialize a newly created visitor to resolve the nodes in a compilation un
it. |
| 15062 * | 14815 * |
| 15063 * @param library the library containing the compilation unit being resolved | 14816 * @param library the library containing the compilation unit being resolved |
| 15064 * @param source the source representing the compilation unit being visited | 14817 * @param source the source representing the compilation unit being visited |
| 15065 * @param typeProvider the object used to access the types from the core libra
ry | 14818 * @param typeProvider the object used to access the types from the core libra
ry |
| 15066 */ | 14819 */ |
| 15067 VariableResolverVisitor.con3(ResolvableLibrary library, Source source, | 14820 VariableResolverVisitor.con3( |
| 15068 TypeProvider typeProvider) | 14821 ResolvableLibrary library, Source source, TypeProvider typeProvider) |
| 15069 : super.con4(library, source, typeProvider); | 14822 : super.con4(library, source, typeProvider); |
| 15070 | 14823 |
| 15071 @override | 14824 @override |
| 15072 Object visitExportDirective(ExportDirective node) => null; | 14825 Object visitExportDirective(ExportDirective node) => null; |
| 15073 | 14826 |
| 15074 @override | 14827 @override |
| 15075 Object visitFunctionDeclaration(FunctionDeclaration node) { | 14828 Object visitFunctionDeclaration(FunctionDeclaration node) { |
| 15076 ExecutableElement outerFunction = _enclosingFunction; | 14829 ExecutableElement outerFunction = _enclosingFunction; |
| 15077 try { | 14830 try { |
| 15078 _enclosingFunction = node.element; | 14831 _enclosingFunction = node.element; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15170 | 14923 |
| 15171 @override | 14924 @override |
| 15172 DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) { | 14925 DartObjectImpl visitSimpleIdentifier(SimpleIdentifier node) { |
| 15173 Element element = node.staticElement; | 14926 Element element = node.staticElement; |
| 15174 for (ParameterElement parameterElement in parameterElements) { | 14927 for (ParameterElement parameterElement in parameterElements) { |
| 15175 if (identical(parameterElement, element) && parameterElement != null) { | 14928 if (identical(parameterElement, element) && parameterElement != null) { |
| 15176 DartType type = parameterElement.type; | 14929 DartType type = parameterElement.type; |
| 15177 if (type != null) { | 14930 if (type != null) { |
| 15178 if (type.isDynamic) { | 14931 if (type.isDynamic) { |
| 15179 return new DartObjectImpl( | 14932 return new DartObjectImpl( |
| 15180 verifier._typeProvider.objectType, | 14933 verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE); |
| 15181 DynamicState.DYNAMIC_STATE); | |
| 15182 } else if (type.isSubtypeOf(verifier._boolType)) { | 14934 } else if (type.isSubtypeOf(verifier._boolType)) { |
| 15183 return new DartObjectImpl( | 14935 return new DartObjectImpl( |
| 15184 verifier._typeProvider.boolType, | 14936 verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE); |
| 15185 BoolState.UNKNOWN_VALUE); | |
| 15186 } else if (type.isSubtypeOf(verifier._typeProvider.doubleType)) { | 14937 } else if (type.isSubtypeOf(verifier._typeProvider.doubleType)) { |
| 15187 return new DartObjectImpl( | 14938 return new DartObjectImpl( |
| 15188 verifier._typeProvider.doubleType, | 14939 verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE); |
| 15189 DoubleState.UNKNOWN_VALUE); | |
| 15190 } else if (type.isSubtypeOf(verifier._intType)) { | 14940 } else if (type.isSubtypeOf(verifier._intType)) { |
| 15191 return new DartObjectImpl( | 14941 return new DartObjectImpl( |
| 15192 verifier._typeProvider.intType, | 14942 verifier._typeProvider.intType, IntState.UNKNOWN_VALUE); |
| 15193 IntState.UNKNOWN_VALUE); | |
| 15194 } else if (type.isSubtypeOf(verifier._numType)) { | 14943 } else if (type.isSubtypeOf(verifier._numType)) { |
| 15195 return new DartObjectImpl( | 14944 return new DartObjectImpl( |
| 15196 verifier._typeProvider.numType, | 14945 verifier._typeProvider.numType, NumState.UNKNOWN_VALUE); |
| 15197 NumState.UNKNOWN_VALUE); | |
| 15198 } else if (type.isSubtypeOf(verifier._stringType)) { | 14946 } else if (type.isSubtypeOf(verifier._stringType)) { |
| 15199 return new DartObjectImpl( | 14947 return new DartObjectImpl( |
| 15200 verifier._typeProvider.stringType, | 14948 verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE); |
| 15201 StringState.UNKNOWN_VALUE); | |
| 15202 } | 14949 } |
| 15203 // | 14950 // |
| 15204 // We don't test for other types of objects (such as List, Map, | 14951 // We don't test for other types of objects (such as List, Map, |
| 15205 // Function or Type) because there are no operations allowed on such | 14952 // Function or Type) because there are no operations allowed on such |
| 15206 // types other than '==' and '!=', which means that we don't need to | 14953 // types other than '==' and '!=', which means that we don't need to |
| 15207 // know the type when there is no specific data about the state of | 14954 // know the type when there is no specific data about the state of |
| 15208 // such objects. | 14955 // such objects. |
| 15209 // | 14956 // |
| 15210 } | 14957 } |
| 15211 return new DartObjectImpl( | 14958 return new DartObjectImpl( |
| 15212 type is InterfaceType ? type : verifier._typeProvider.objectType, | 14959 type is InterfaceType ? type : verifier._typeProvider.objectType, |
| 15213 GenericState.UNKNOWN_VALUE); | 14960 GenericState.UNKNOWN_VALUE); |
| 15214 } | 14961 } |
| 15215 } | 14962 } |
| 15216 return super.visitSimpleIdentifier(node); | 14963 return super.visitSimpleIdentifier(node); |
| 15217 } | 14964 } |
| 15218 } | 14965 } |
| 15219 | 14966 |
| 15220 class _ElementBuilder_visitClassDeclaration extends UnifyingAstVisitor<Object> { | 14967 class _ElementBuilder_visitClassDeclaration extends UnifyingAstVisitor<Object> { |
| 15221 final ElementBuilder builder; | 14968 final ElementBuilder builder; |
| 15222 | 14969 |
| 15223 List<ClassMember> nonFields; | 14970 List<ClassMember> nonFields; |
| 15224 | 14971 |
| 15225 _ElementBuilder_visitClassDeclaration(this.builder, this.nonFields) | 14972 _ElementBuilder_visitClassDeclaration(this.builder, this.nonFields) : super(); |
| 15226 : super(); | |
| 15227 | 14973 |
| 15228 @override | 14974 @override |
| 15229 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 14975 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 15230 nonFields.add(node); | 14976 nonFields.add(node); |
| 15231 return null; | 14977 return null; |
| 15232 } | 14978 } |
| 15233 | 14979 |
| 15234 @override | 14980 @override |
| 15235 Object visitMethodDeclaration(MethodDeclaration node) { | 14981 Object visitMethodDeclaration(MethodDeclaration node) { |
| 15236 nonFields.add(node); | 14982 nonFields.add(node); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15402 // v++; | 15148 // v++; |
| 15403 // ++v; | 15149 // ++v; |
| 15404 // v += 2; | 15150 // v += 2; |
| 15405 return false; | 15151 return false; |
| 15406 } | 15152 } |
| 15407 // OK | 15153 // OK |
| 15408 return true; | 15154 return true; |
| 15409 } | 15155 } |
| 15410 } | 15156 } |
| 15411 | 15157 |
| 15412 class _ResolverVisitor_isVariableAccessedInClosure extends | 15158 class _ResolverVisitor_isVariableAccessedInClosure |
| 15413 RecursiveAstVisitor<Object> { | 15159 extends RecursiveAstVisitor<Object> { |
| 15414 final Element variable; | 15160 final Element variable; |
| 15415 | 15161 |
| 15416 bool result = false; | 15162 bool result = false; |
| 15417 | 15163 |
| 15418 bool _inClosure = false; | 15164 bool _inClosure = false; |
| 15419 | 15165 |
| 15420 _ResolverVisitor_isVariableAccessedInClosure(this.variable); | 15166 _ResolverVisitor_isVariableAccessedInClosure(this.variable); |
| 15421 | 15167 |
| 15422 @override | 15168 @override |
| 15423 Object visitFunctionExpression(FunctionExpression node) { | 15169 Object visitFunctionExpression(FunctionExpression node) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 15435 if (result) { | 15181 if (result) { |
| 15436 return null; | 15182 return null; |
| 15437 } | 15183 } |
| 15438 if (_inClosure && identical(node.staticElement, variable)) { | 15184 if (_inClosure && identical(node.staticElement, variable)) { |
| 15439 result = true; | 15185 result = true; |
| 15440 } | 15186 } |
| 15441 return null; | 15187 return null; |
| 15442 } | 15188 } |
| 15443 } | 15189 } |
| 15444 | 15190 |
| 15445 | 15191 class _ResolverVisitor_isVariablePotentiallyMutatedIn |
| 15446 class _ResolverVisitor_isVariablePotentiallyMutatedIn extends | 15192 extends RecursiveAstVisitor<Object> { |
| 15447 RecursiveAstVisitor<Object> { | |
| 15448 final Element variable; | 15193 final Element variable; |
| 15449 | 15194 |
| 15450 bool result = false; | 15195 bool result = false; |
| 15451 | 15196 |
| 15452 _ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable); | 15197 _ResolverVisitor_isVariablePotentiallyMutatedIn(this.variable); |
| 15453 | 15198 |
| 15454 @override | 15199 @override |
| 15455 Object visitSimpleIdentifier(SimpleIdentifier node) { | 15200 Object visitSimpleIdentifier(SimpleIdentifier node) { |
| 15456 if (result) { | 15201 if (result) { |
| 15457 return null; | 15202 return null; |
| 15458 } | 15203 } |
| 15459 if (identical(node.staticElement, variable)) { | 15204 if (identical(node.staticElement, variable)) { |
| 15460 if (node.inSetterContext()) { | 15205 if (node.inSetterContext()) { |
| 15461 result = true; | 15206 result = true; |
| 15462 } | 15207 } |
| 15463 } | 15208 } |
| 15464 return null; | 15209 return null; |
| 15465 } | 15210 } |
| 15466 } | 15211 } |
| 15467 | 15212 |
| 15468 | 15213 class _TypeResolverVisitor_visitClassMembersInScope |
| 15469 class _TypeResolverVisitor_visitClassMembersInScope extends | 15214 extends UnifyingAstVisitor<Object> { |
| 15470 UnifyingAstVisitor<Object> { | |
| 15471 final TypeResolverVisitor TypeResolverVisitor_this; | 15215 final TypeResolverVisitor TypeResolverVisitor_this; |
| 15472 | 15216 |
| 15473 List<ClassMember> nonFields; | 15217 List<ClassMember> nonFields; |
| 15474 | 15218 |
| 15475 _TypeResolverVisitor_visitClassMembersInScope(this.TypeResolverVisitor_this, | 15219 _TypeResolverVisitor_visitClassMembersInScope( |
| 15476 this.nonFields) | 15220 this.TypeResolverVisitor_this, this.nonFields) |
| 15477 : super(); | 15221 : super(); |
| 15478 | 15222 |
| 15479 @override | 15223 @override |
| 15480 Object visitConstructorDeclaration(ConstructorDeclaration node) { | 15224 Object visitConstructorDeclaration(ConstructorDeclaration node) { |
| 15481 nonFields.add(node); | 15225 nonFields.add(node); |
| 15482 return null; | 15226 return null; |
| 15483 } | 15227 } |
| 15484 | 15228 |
| 15485 @override | 15229 @override |
| 15486 Object visitExtendsClause(ExtendsClause node) => null; | 15230 Object visitExtendsClause(ExtendsClause node) => null; |
| 15487 | 15231 |
| 15488 @override | 15232 @override |
| 15489 Object visitImplementsClause(ImplementsClause node) => null; | 15233 Object visitImplementsClause(ImplementsClause node) => null; |
| 15490 | 15234 |
| 15491 @override | 15235 @override |
| 15492 Object visitMethodDeclaration(MethodDeclaration node) { | 15236 Object visitMethodDeclaration(MethodDeclaration node) { |
| 15493 nonFields.add(node); | 15237 nonFields.add(node); |
| 15494 return null; | 15238 return null; |
| 15495 } | 15239 } |
| 15496 | 15240 |
| 15497 @override | 15241 @override |
| 15498 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 15242 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
| 15499 | 15243 |
| 15500 @override | 15244 @override |
| 15501 Object visitWithClause(WithClause node) => null; | 15245 Object visitWithClause(WithClause node) => null; |
| 15502 } | 15246 } |
| 15503 | 15247 |
| 15504 | |
| 15505 /** | 15248 /** |
| 15506 * Instances of the class [_UnusedElementsVerifier] traverse an element | 15249 * Instances of the class [_UnusedElementsVerifier] traverse an element |
| 15507 * structure looking for cases of [HintCode.UNUSED_ELEMENT] and | 15250 * structure looking for cases of [HintCode.UNUSED_ELEMENT] and |
| 15508 * [HintCode.UNUSED_LOCAL_VARIABLE]. | 15251 * [HintCode.UNUSED_LOCAL_VARIABLE]. |
| 15509 */ | 15252 */ |
| 15510 class _UnusedElementsVerifier extends RecursiveElementVisitor { | 15253 class _UnusedElementsVerifier extends RecursiveElementVisitor { |
| 15511 /** | 15254 /** |
| 15512 * The error listener to which errors will be reported. | 15255 * The error listener to which errors will be reported. |
| 15513 */ | 15256 */ |
| 15514 final AnalysisErrorListener _errorListener; | 15257 final AnalysisErrorListener _errorListener; |
| 15515 | 15258 |
| 15516 /** | 15259 /** |
| 15517 * The elements know to be used. | 15260 * The elements know to be used. |
| 15518 */ | 15261 */ |
| 15519 final _UsedElements _usedElements; | 15262 final _UsedElements _usedElements; |
| 15520 | 15263 |
| 15521 /** | 15264 /** |
| 15522 * Create a new instance of the [_UnusedElementsVerifier]. | 15265 * Create a new instance of the [_UnusedElementsVerifier]. |
| 15523 */ | 15266 */ |
| 15524 _UnusedElementsVerifier(this._errorListener, this._usedElements); | 15267 _UnusedElementsVerifier(this._errorListener, this._usedElements); |
| 15525 | 15268 |
| 15526 @override | 15269 @override |
| 15527 visitClassElement(ClassElement element) { | 15270 visitClassElement(ClassElement element) { |
| 15528 if (!_isUsedElement(element)) { | 15271 if (!_isUsedElement(element)) { |
| 15529 _reportErrorForElement( | 15272 _reportErrorForElement(HintCode.UNUSED_ELEMENT, element, [ |
| 15530 HintCode.UNUSED_ELEMENT, | 15273 element.kind.displayName, |
| 15531 element, | 15274 element.displayName |
| 15532 [element.kind.displayName, element.displayName]); | 15275 ]); |
| 15533 } | 15276 } |
| 15534 super.visitClassElement(element); | 15277 super.visitClassElement(element); |
| 15535 } | 15278 } |
| 15536 | 15279 |
| 15537 @override | 15280 @override |
| 15538 visitFieldElement(FieldElement element) { | 15281 visitFieldElement(FieldElement element) { |
| 15539 if (!_isReadMember(element)) { | 15282 if (!_isReadMember(element)) { |
| 15540 _reportErrorForElement( | 15283 _reportErrorForElement( |
| 15541 HintCode.UNUSED_FIELD, | 15284 HintCode.UNUSED_FIELD, element, [element.displayName]); |
| 15542 element, | |
| 15543 [element.displayName]); | |
| 15544 } | 15285 } |
| 15545 super.visitFieldElement(element); | 15286 super.visitFieldElement(element); |
| 15546 } | 15287 } |
| 15547 | 15288 |
| 15548 @override | 15289 @override |
| 15549 visitFunctionElement(FunctionElement element) { | 15290 visitFunctionElement(FunctionElement element) { |
| 15550 if (!_isUsedElement(element)) { | 15291 if (!_isUsedElement(element)) { |
| 15551 _reportErrorForElement( | 15292 _reportErrorForElement(HintCode.UNUSED_ELEMENT, element, [ |
| 15552 HintCode.UNUSED_ELEMENT, | 15293 element.kind.displayName, |
| 15553 element, | 15294 element.displayName |
| 15554 [element.kind.displayName, element.displayName]); | 15295 ]); |
| 15555 } | 15296 } |
| 15556 super.visitFunctionElement(element); | 15297 super.visitFunctionElement(element); |
| 15557 } | 15298 } |
| 15558 | 15299 |
| 15559 @override | 15300 @override |
| 15560 visitLocalVariableElement(LocalVariableElement element) { | 15301 visitLocalVariableElement(LocalVariableElement element) { |
| 15561 if (!_isUsedElement(element)) { | 15302 if (!_isUsedElement(element)) { |
| 15562 _reportErrorForElement( | 15303 _reportErrorForElement( |
| 15563 HintCode.UNUSED_LOCAL_VARIABLE, | 15304 HintCode.UNUSED_LOCAL_VARIABLE, element, [element.displayName]); |
| 15564 element, | |
| 15565 [element.displayName]); | |
| 15566 } | 15305 } |
| 15567 } | 15306 } |
| 15568 | 15307 |
| 15569 @override | 15308 @override |
| 15570 visitMethodElement(MethodElement element) { | 15309 visitMethodElement(MethodElement element) { |
| 15571 if (!_isUsedMember(element)) { | 15310 if (!_isUsedMember(element)) { |
| 15572 _reportErrorForElement( | 15311 _reportErrorForElement(HintCode.UNUSED_ELEMENT, element, [ |
| 15573 HintCode.UNUSED_ELEMENT, | 15312 element.kind.displayName, |
| 15574 element, | 15313 element.displayName |
| 15575 [element.kind.displayName, element.displayName]); | 15314 ]); |
| 15576 } | 15315 } |
| 15577 super.visitMethodElement(element); | 15316 super.visitMethodElement(element); |
| 15578 } | 15317 } |
| 15579 | 15318 |
| 15580 @override | 15319 @override |
| 15581 visitPropertyAccessorElement(PropertyAccessorElement element) { | 15320 visitPropertyAccessorElement(PropertyAccessorElement element) { |
| 15582 if (!_isUsedMember(element)) { | 15321 if (!_isUsedMember(element)) { |
| 15583 _reportErrorForElement( | 15322 _reportErrorForElement(HintCode.UNUSED_ELEMENT, element, [ |
| 15584 HintCode.UNUSED_ELEMENT, | 15323 element.kind.displayName, |
| 15585 element, | 15324 element.displayName |
| 15586 [element.kind.displayName, element.displayName]); | 15325 ]); |
| 15587 } | 15326 } |
| 15588 super.visitPropertyAccessorElement(element); | 15327 super.visitPropertyAccessorElement(element); |
| 15589 } | 15328 } |
| 15590 | 15329 |
| 15591 bool _isReadMember(Element element) { | 15330 bool _isReadMember(Element element) { |
| 15592 if (element.isPublic) { | 15331 if (element.isPublic) { |
| 15593 return true; | 15332 return true; |
| 15594 } | 15333 } |
| 15595 if (element.isSynthetic) { | 15334 if (element.isSynthetic) { |
| 15596 return true; | 15335 return true; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 15619 } | 15358 } |
| 15620 if (element.isSynthetic) { | 15359 if (element.isSynthetic) { |
| 15621 return true; | 15360 return true; |
| 15622 } | 15361 } |
| 15623 if (_usedElements.members.contains(element.displayName)) { | 15362 if (_usedElements.members.contains(element.displayName)) { |
| 15624 return true; | 15363 return true; |
| 15625 } | 15364 } |
| 15626 return _usedElements.elements.contains(element); | 15365 return _usedElements.elements.contains(element); |
| 15627 } | 15366 } |
| 15628 | 15367 |
| 15629 void _reportErrorForElement(ErrorCode errorCode, Element element, | 15368 void _reportErrorForElement( |
| 15630 List<Object> arguments) { | 15369 ErrorCode errorCode, Element element, List<Object> arguments) { |
| 15631 if (element != null) { | 15370 if (element != null) { |
| 15632 _errorListener.onError( | 15371 _errorListener.onError(new AnalysisError.con2(element.source, |
| 15633 new AnalysisError.con2( | 15372 element.nameOffset, element.displayName.length, errorCode, |
| 15634 element.source, | 15373 arguments)); |
| 15635 element.nameOffset, | |
| 15636 element.displayName.length, | |
| 15637 errorCode, | |
| 15638 arguments)); | |
| 15639 } | 15374 } |
| 15640 } | 15375 } |
| 15641 } | 15376 } |
| 15642 | 15377 |
| 15643 | |
| 15644 class _UsedElements { | 15378 class _UsedElements { |
| 15645 /** | 15379 /** |
| 15646 * Resolved, locally defined elements that are used or potentially can be | 15380 * Resolved, locally defined elements that are used or potentially can be |
| 15647 * used. | 15381 * used. |
| 15648 */ | 15382 */ |
| 15649 final HashSet<Element> elements = new HashSet<Element>(); | 15383 final HashSet<Element> elements = new HashSet<Element>(); |
| 15650 | 15384 |
| 15651 /** | 15385 /** |
| 15652 * Names of resolved or unresolved class members that are referenced in the | 15386 * Names of resolved or unresolved class members that are referenced in the |
| 15653 * library. | 15387 * library. |
| 15654 */ | 15388 */ |
| 15655 final HashSet<String> members = new HashSet<String>(); | 15389 final HashSet<String> members = new HashSet<String>(); |
| 15656 | 15390 |
| 15657 /** | 15391 /** |
| 15658 * Names of resolved or unresolved class members that are read in the | 15392 * Names of resolved or unresolved class members that are read in the |
| 15659 * library. | 15393 * library. |
| 15660 */ | 15394 */ |
| 15661 final HashSet<String> readMembers = new HashSet<String>(); | 15395 final HashSet<String> readMembers = new HashSet<String>(); |
| 15662 } | 15396 } |
| OLD | NEW |