| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.task.dart; | 5 library analyzer.src.task.dart; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/src/context/cache.dart'; | 9 import 'package:analyzer/src/context/cache.dart'; |
| 10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import 'package:analyzer/src/generated/sdk.dart'; | 22 import 'package:analyzer/src/generated/sdk.dart'; |
| 23 import 'package:analyzer/src/generated/source.dart'; | 23 import 'package:analyzer/src/generated/source.dart'; |
| 24 import 'package:analyzer/src/generated/visitors.dart'; | 24 import 'package:analyzer/src/generated/visitors.dart'; |
| 25 import 'package:analyzer/src/plugin/engine_plugin.dart'; | 25 import 'package:analyzer/src/plugin/engine_plugin.dart'; |
| 26 import 'package:analyzer/src/services/lint.dart'; | 26 import 'package:analyzer/src/services/lint.dart'; |
| 27 import 'package:analyzer/src/task/driver.dart'; | 27 import 'package:analyzer/src/task/driver.dart'; |
| 28 import 'package:analyzer/src/task/general.dart'; | 28 import 'package:analyzer/src/task/general.dart'; |
| 29 import 'package:analyzer/src/task/html.dart'; | 29 import 'package:analyzer/src/task/html.dart'; |
| 30 import 'package:analyzer/src/task/inputs.dart'; | 30 import 'package:analyzer/src/task/inputs.dart'; |
| 31 import 'package:analyzer/src/task/model.dart'; | 31 import 'package:analyzer/src/task/model.dart'; |
| 32 import 'package:analyzer/src/task/strong/checker.dart'; |
| 33 import 'package:analyzer/src/task/strong/rules.dart'; |
| 32 import 'package:analyzer/src/task/strong_mode.dart'; | 34 import 'package:analyzer/src/task/strong_mode.dart'; |
| 33 import 'package:analyzer/task/dart.dart'; | 35 import 'package:analyzer/task/dart.dart'; |
| 34 import 'package:analyzer/task/general.dart'; | 36 import 'package:analyzer/task/general.dart'; |
| 35 import 'package:analyzer/task/model.dart'; | 37 import 'package:analyzer/task/model.dart'; |
| 36 | 38 |
| 37 /** | 39 /** |
| 38 * The [ResultCachingPolicy] for ASTs. | 40 * The [ResultCachingPolicy] for ASTs. |
| 39 */ | 41 */ |
| 40 const ResultCachingPolicy AST_CACHING_POLICY = | 42 const ResultCachingPolicy AST_CACHING_POLICY = |
| 41 const SimpleResultCachingPolicy(8192, 8192); | 43 const SimpleResultCachingPolicy(8192, 8192); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 /** | 155 /** |
| 154 * The sources representing the combined import/export closure of a library. | 156 * The sources representing the combined import/export closure of a library. |
| 155 * The [Source]s include only library sources, not their units. | 157 * The [Source]s include only library sources, not their units. |
| 156 * | 158 * |
| 157 * The result is only available for [Source]s representing a library. | 159 * The result is only available for [Source]s representing a library. |
| 158 */ | 160 */ |
| 159 final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE = | 161 final ListResultDescriptor<Source> IMPORT_EXPORT_SOURCE_CLOSURE = |
| 160 new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null); | 162 new ListResultDescriptor<Source>('IMPORT_EXPORT_SOURCE_CLOSURE', null); |
| 161 | 163 |
| 162 /** | 164 /** |
| 163 * A list of the [LibraryElement]s that make up the strongly connected | |
| 164 * component in the import/export graph in which the target resides. | |
| 165 * | |
| 166 * Only non-empty in strongMode | |
| 167 * | |
| 168 * The result is only available for [LibrarySpecificUnit]s. | |
| 169 */ | |
| 170 final ListResultDescriptor<LibraryElement> LIBRARY_CYCLE = | |
| 171 new ListResultDescriptor<LibraryElement>('LIBRARY_CYCLE', null); | |
| 172 | |
| 173 /** | |
| 174 * A list of the [CompilationUnitElement]s (including all parts) that make up | |
| 175 * the strongly connected component in the import/export graph in which the | |
| 176 * target resides. | |
| 177 * | |
| 178 * Only non-empty in strongMode | |
| 179 * | |
| 180 * The result is only available for [LibrarySpecificUnit]s. | |
| 181 */ | |
| 182 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_UNITS = | |
| 183 new ListResultDescriptor<CompilationUnitElement>( | |
| 184 'LIBRARY_CYCLE_UNITS', null); | |
| 185 | |
| 186 /** | |
| 187 * A list of the [CompilationUnitElement]s that comprise all of the parts and | |
| 188 * libraries in the direct import/export dependencies of the library cycle | |
| 189 * of the target, with the intra-component dependencies excluded. | |
| 190 * | |
| 191 * Only non-empty in strongMode | |
| 192 * | |
| 193 * The result is only available for [LibrarySpecificUnit]s. | |
| 194 */ | |
| 195 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_DEPENDENCIES = | |
| 196 new ListResultDescriptor<CompilationUnitElement>( | |
| 197 'LIBRARY_CYCLE_DEPENDENCIES', null); | |
| 198 | |
| 199 /** | |
| 200 * A list of the [VariableElement]s whose type should be inferred that another | 165 * A list of the [VariableElement]s whose type should be inferred that another |
| 201 * inferable static variable (the target) depends on. | 166 * inferable static variable (the target) depends on. |
| 202 * | 167 * |
| 203 * The result is only available for [VariableElement]s, and only when strong | 168 * The result is only available for [VariableElement]s, and only when strong |
| 204 * mode is enabled. | 169 * mode is enabled. |
| 205 */ | 170 */ |
| 206 final ListResultDescriptor< | 171 final ListResultDescriptor< |
| 207 VariableElement> INFERABLE_STATIC_VARIABLE_DEPENDENCIES = | 172 VariableElement> INFERABLE_STATIC_VARIABLE_DEPENDENCIES = |
| 208 new ListResultDescriptor<VariableElement>( | 173 new ListResultDescriptor<VariableElement>( |
| 209 'INFERABLE_STATIC_VARIABLE_DEPENDENCIES', null); | 174 'INFERABLE_STATIC_VARIABLE_DEPENDENCIES', null); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 225 * inferred. | 190 * inferred. |
| 226 * | 191 * |
| 227 * The result is only available for [VariableElement]s, and only when strong | 192 * The result is only available for [VariableElement]s, and only when strong |
| 228 * mode is enabled. | 193 * mode is enabled. |
| 229 */ | 194 */ |
| 230 final ResultDescriptor<VariableElement> INFERRED_STATIC_VARIABLE = | 195 final ResultDescriptor<VariableElement> INFERRED_STATIC_VARIABLE = |
| 231 new ResultDescriptor<VariableElement>('INFERRED_STATIC_VARIABLE', null, | 196 new ResultDescriptor<VariableElement>('INFERRED_STATIC_VARIABLE', null, |
| 232 cachingPolicy: ELEMENT_CACHING_POLICY); | 197 cachingPolicy: ELEMENT_CACHING_POLICY); |
| 233 | 198 |
| 234 /** | 199 /** |
| 200 * A list of the [LibraryElement]s that make up the strongly connected |
| 201 * component in the import/export graph in which the target resides. |
| 202 * |
| 203 * Only non-empty in strongMode. |
| 204 * |
| 205 * The result is only available for [LibrarySpecificUnit]s. |
| 206 */ |
| 207 final ListResultDescriptor<LibraryElement> LIBRARY_CYCLE = |
| 208 new ListResultDescriptor<LibraryElement>('LIBRARY_CYCLE', null); |
| 209 |
| 210 /** |
| 211 * A list of the [CompilationUnitElement]s that comprise all of the parts and |
| 212 * libraries in the direct import/export dependencies of the library cycle |
| 213 * of the target, with the intra-component dependencies excluded. |
| 214 * |
| 215 * Only non-empty in strongMode. |
| 216 * |
| 217 * The result is only available for [LibrarySpecificUnit]s. |
| 218 */ |
| 219 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_DEPENDENCIES = |
| 220 new ListResultDescriptor<CompilationUnitElement>( |
| 221 'LIBRARY_CYCLE_DEPENDENCIES', null); |
| 222 |
| 223 /** |
| 224 * A list of the [CompilationUnitElement]s (including all parts) that make up |
| 225 * the strongly connected component in the import/export graph in which the |
| 226 * target resides. |
| 227 * |
| 228 * Only non-empty in strongMode. |
| 229 * |
| 230 * The result is only available for [LibrarySpecificUnit]s. |
| 231 */ |
| 232 final ListResultDescriptor<CompilationUnitElement> LIBRARY_CYCLE_UNITS = |
| 233 new ListResultDescriptor<CompilationUnitElement>( |
| 234 'LIBRARY_CYCLE_UNITS', null); |
| 235 |
| 236 /** |
| 235 * The partial [LibraryElement] associated with a library. | 237 * The partial [LibraryElement] associated with a library. |
| 236 * | 238 * |
| 237 * The [LibraryElement] and its [CompilationUnitElement]s are attached to each | 239 * The [LibraryElement] and its [CompilationUnitElement]s are attached to each |
| 238 * other. Directives 'library', 'part' and 'part of' are resolved. | 240 * other. Directives 'library', 'part' and 'part of' are resolved. |
| 239 * | 241 * |
| 240 * The result is only available for [Source]s representing a library. | 242 * The result is only available for [Source]s representing a library. |
| 241 */ | 243 */ |
| 242 final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT1 = | 244 final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT1 = |
| 243 new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT1', null, | 245 new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT1', null, |
| 244 cachingPolicy: ELEMENT_CACHING_POLICY); | 246 cachingPolicy: ELEMENT_CACHING_POLICY); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 336 |
| 335 /** | 337 /** |
| 336 * The names (resolved and not) referenced by a unit. | 338 * The names (resolved and not) referenced by a unit. |
| 337 * | 339 * |
| 338 * The result is only available for [Source]s representing a compilation unit. | 340 * The result is only available for [Source]s representing a compilation unit. |
| 339 */ | 341 */ |
| 340 final ResultDescriptor<ReferencedNames> REFERENCED_NAMES = | 342 final ResultDescriptor<ReferencedNames> REFERENCED_NAMES = |
| 341 new ResultDescriptor<ReferencedNames>('REFERENCED_NAMES', null); | 343 new ResultDescriptor<ReferencedNames>('REFERENCED_NAMES', null); |
| 342 | 344 |
| 343 /** | 345 /** |
| 346 * The errors produced while resolving type names. |
| 347 * |
| 348 * The list will be empty if there were no errors, but will not be `null`. |
| 349 * |
| 350 * The result is only available for [LibrarySpecificUnit]s. |
| 351 */ |
| 352 final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS = |
| 353 new ListResultDescriptor<AnalysisError>( |
| 354 'RESOLVE_TYPE_NAMES_ERRORS', AnalysisError.NO_ERRORS); |
| 355 |
| 356 /** |
| 344 * The errors produced while resolving a full compilation unit. | 357 * The errors produced while resolving a full compilation unit. |
| 345 * | 358 * |
| 346 * The list will be empty if there were no errors, but will not be `null`. | 359 * The list will be empty if there were no errors, but will not be `null`. |
| 347 * | 360 * |
| 348 * The result is only available for [LibrarySpecificUnit]s. | 361 * The result is only available for [LibrarySpecificUnit]s. |
| 349 */ | 362 */ |
| 350 final ListResultDescriptor<AnalysisError> RESOLVE_UNIT_ERRORS = | 363 final ListResultDescriptor<AnalysisError> RESOLVE_UNIT_ERRORS = |
| 351 new ListResultDescriptor<AnalysisError>( | 364 new ListResultDescriptor<AnalysisError>( |
| 352 'RESOLVE_UNIT_ERRORS', AnalysisError.NO_ERRORS); | 365 'RESOLVE_UNIT_ERRORS', AnalysisError.NO_ERRORS); |
| 353 | 366 |
| 354 /** | 367 /** |
| 355 * The errors produced while resolving type names. | 368 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 356 * | 369 * |
| 357 * The list will be empty if there were no errors, but will not be `null`. | 370 * Tasks that use this value as an input can assume that the [SimpleIdentifier]s |
| 371 * at all declaration sites have been bound to the element defined by the |
| 372 * declaration, except for the constants defined in an 'enum' declaration. |
| 358 * | 373 * |
| 359 * The result is only available for [LibrarySpecificUnit]s. | 374 * The result is only available for [LibrarySpecificUnit]s. |
| 360 */ | 375 */ |
| 361 final ListResultDescriptor<AnalysisError> RESOLVE_TYPE_NAMES_ERRORS = | |
| 362 new ListResultDescriptor<AnalysisError>( | |
| 363 'RESOLVE_TYPE_NAMES_ERRORS', AnalysisError.NO_ERRORS); | |
| 364 | |
| 365 /** | |
| 366 * The partially resolved [CompilationUnit] associated with a unit. | |
| 367 * | |
| 368 * All declarations bound to the element defined by the declaration. | |
| 369 * | |
| 370 * The result is only available for [LibrarySpecificUnit]s. | |
| 371 */ | |
| 372 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT1 = | 376 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT1 = |
| 373 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT1', null, | 377 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT1', null, |
| 374 cachingPolicy: AST_CACHING_POLICY); | 378 cachingPolicy: AST_CACHING_POLICY); |
| 375 | 379 |
| 376 /** | 380 /** |
| 377 * The partially resolved [CompilationUnit] associated with a unit. | 381 * The resolved [CompilationUnit] associated with a compilation unit, with |
| 378 * | 382 * constants resolved. |
| 379 * All the enum member elements are built. | |
| 380 * | 383 * |
| 381 * The result is only available for [LibrarySpecificUnit]s. | 384 * The result is only available for [LibrarySpecificUnit]s. |
| 382 */ | 385 */ |
| 386 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT10 = |
| 387 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT10', null, |
| 388 cachingPolicy: AST_CACHING_POLICY); |
| 389 |
| 390 /** |
| 391 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 392 * |
| 393 * Tasks that use this value as an input can assume that the [SimpleIdentifier]s |
| 394 * at all declaration sites have been bound to the element defined by the |
| 395 * declaration, including the constants defined in an 'enum' declaration. |
| 396 * |
| 397 * The result is only available for [LibrarySpecificUnit]s. |
| 398 */ |
| 383 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT2 = | 399 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT2 = |
| 384 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT2', null, | 400 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT2', null, |
| 385 cachingPolicy: AST_CACHING_POLICY); | 401 cachingPolicy: AST_CACHING_POLICY); |
| 386 | 402 |
| 387 /** | 403 /** |
| 388 * The partially resolved [CompilationUnit] associated with a unit. | 404 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 389 * | 405 * |
| 390 * [RESOLVED_UNIT2] with resolved type names. | 406 * In addition to what is true of a [RESOLVED_UNIT2], tasks that use this value |
| 407 * as an input can assume that the types associated with declarations have been |
| 408 * resolved. This includes the types of superclasses, mixins, interfaces, |
| 409 * fields, return types, parameters, and local variables. |
| 391 * | 410 * |
| 392 * The result is only available for [LibrarySpecificUnit]s. | 411 * The result is only available for [LibrarySpecificUnit]s. |
| 393 */ | 412 */ |
| 394 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT3 = | 413 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT3 = |
| 395 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT3', null, | 414 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT3', null, |
| 396 cachingPolicy: AST_CACHING_POLICY); | 415 cachingPolicy: AST_CACHING_POLICY); |
| 397 | 416 |
| 398 /** | 417 /** |
| 399 * The partially resolved [CompilationUnit] associated with a unit. | 418 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 400 * | 419 * |
| 401 * [RESOLVED_UNIT3] plus resolved local variables and formal parameters. | 420 * In addition to what is true of a [RESOLVED_UNIT3], tasks that use this value |
| 421 * as an input can assume that references to local variables and formal |
| 422 * parameters have been resolved. |
| 402 * | 423 * |
| 403 * The result is only available for [LibrarySpecificUnit]s. | 424 * The result is only available for [LibrarySpecificUnit]s. |
| 404 */ | 425 */ |
| 405 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT4 = | 426 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT4 = |
| 406 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT4', null, | 427 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT4', null, |
| 407 cachingPolicy: AST_CACHING_POLICY); | 428 cachingPolicy: AST_CACHING_POLICY); |
| 408 | 429 |
| 409 /** | 430 /** |
| 410 * The resolved [CompilationUnit] associated with a compilation unit in which | 431 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 411 * elements and types have been initially resolved outside of method bodies in | 432 * |
| 412 * addition to everything that is true of a [RESOLVED_UNIT4]. | 433 * In addition to what is true of a [RESOLVED_UNIT4], tasks that use this value |
| 434 * as an input can assume that elements and types associated with expressions |
| 435 * outside of method bodies (essentially initializers) have been initially |
| 436 * resolved. |
| 413 * | 437 * |
| 414 * The result is only available for [LibrarySpecificUnit]s. | 438 * The result is only available for [LibrarySpecificUnit]s. |
| 415 */ | 439 */ |
| 416 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT5 = | 440 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT5 = |
| 417 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT5', null, | 441 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT5', null, |
| 418 cachingPolicy: AST_CACHING_POLICY); | 442 cachingPolicy: AST_CACHING_POLICY); |
| 419 | 443 |
| 420 /** | 444 /** |
| 421 * The resolved [CompilationUnit] associated with a compilation unit in which | 445 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 422 * the types of static variables have been inferred in addition to everything | 446 * |
| 423 * that is true of a [RESOLVED_UNIT5]. | 447 * In addition to what is true of a [RESOLVED_UNIT5], tasks that use this value |
| 448 * as an input can assume that the types of static variables have been inferred. |
| 424 * | 449 * |
| 425 * The result is only available for [LibrarySpecificUnit]s. | 450 * The result is only available for [LibrarySpecificUnit]s. |
| 426 */ | 451 */ |
| 427 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 = | 452 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT6 = |
| 428 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null, | 453 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT6', null, |
| 429 cachingPolicy: AST_CACHING_POLICY); | 454 cachingPolicy: AST_CACHING_POLICY); |
| 430 | 455 |
| 431 /** | 456 /** |
| 432 * The resolved [CompilationUnit] associated with a compilation unit in which | 457 * The partially resolved [CompilationUnit] associated with a compilation unit. |
| 433 * the right hand sides of instance variables have been re-resolved in addition | 458 * |
| 434 * to everything that is true of a [RESOLVED_UNIT6]. | 459 * In addition to what is true of a [RESOLVED_UNIT6], tasks that use this value |
| 460 * as an input can assume that the initializers of instance variables have been |
| 461 * re-resolved. |
| 435 * | 462 * |
| 436 * The result is only available for [LibrarySpecificUnit]s. | 463 * The result is only available for [LibrarySpecificUnit]s. |
| 437 */ | 464 */ |
| 438 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 = | 465 final ResultDescriptor<CompilationUnit> RESOLVED_UNIT7 = |
| 439 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null, | 466 new ResultDescriptor<CompilationUnit>('RESOLVED_UNIT7', null, |
| 440 cachingPolicy: AST_CACHING_POLICY); | 467 cachingPolicy: AST_CACHING_POLICY); |
| 441 | 468 |
| 442 /** | 469 /** |
| 443 * The resolved [CompilationUnit] associated with a compilation unit in which | 470 * The resolved [CompilationUnit] associated with a compilation unit in which |
| 444 * the types of class members have been inferred in addition to everything that | 471 * the types of class members have been inferred in addition to everything that |
| (...skipping 20 matching lines...) Expand all Loading... |
| 465 * | 492 * |
| 466 * The list will be empty if there were no errors, but will not be `null`. | 493 * The list will be empty if there were no errors, but will not be `null`. |
| 467 * | 494 * |
| 468 * The result is only available for [Source]s representing a compilation unit. | 495 * The result is only available for [Source]s representing a compilation unit. |
| 469 */ | 496 */ |
| 470 final ListResultDescriptor<AnalysisError> SCAN_ERRORS = | 497 final ListResultDescriptor<AnalysisError> SCAN_ERRORS = |
| 471 new ListResultDescriptor<AnalysisError>( | 498 new ListResultDescriptor<AnalysisError>( |
| 472 'SCAN_ERRORS', AnalysisError.NO_ERRORS); | 499 'SCAN_ERRORS', AnalysisError.NO_ERRORS); |
| 473 | 500 |
| 474 /** | 501 /** |
| 502 * The additional strong mode errors produced while verifying a |
| 503 * compilation unit. |
| 504 * |
| 505 * The list will be empty if there were no errors, but will not be `null`. |
| 506 * |
| 507 * The result is only available for [LibrarySpecificUnits]s representing a |
| 508 * compilation unit. |
| 509 * |
| 510 */ |
| 511 final ListResultDescriptor<AnalysisError> STRONG_MODE_ERRORS = |
| 512 new ListResultDescriptor<AnalysisError>( |
| 513 'STRONG_MODE_ERRORS', AnalysisError.NO_ERRORS); |
| 514 |
| 515 /** |
| 475 * The [TypeProvider] of the [AnalysisContext]. | 516 * The [TypeProvider] of the [AnalysisContext]. |
| 476 */ | 517 */ |
| 477 final ResultDescriptor<TypeProvider> TYPE_PROVIDER = | 518 final ResultDescriptor<TypeProvider> TYPE_PROVIDER = |
| 478 new ResultDescriptor<TypeProvider>('TYPE_PROVIDER', null); | 519 new ResultDescriptor<TypeProvider>('TYPE_PROVIDER', null); |
| 479 | 520 |
| 480 /** | 521 /** |
| 481 * The [UsedImportedElements] of a [LibrarySpecificUnit]. | 522 * The [UsedImportedElements] of a [LibrarySpecificUnit]. |
| 482 */ | 523 */ |
| 483 final ResultDescriptor<UsedImportedElements> USED_IMPORTED_ELEMENTS = | 524 final ResultDescriptor<UsedImportedElements> USED_IMPORTED_ELEMENTS = |
| 484 new ResultDescriptor<UsedImportedElements>('USED_IMPORTED_ELEMENTS', null, | 525 new ResultDescriptor<UsedImportedElements>('USED_IMPORTED_ELEMENTS', null, |
| (...skipping 1617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2102 * Create a [DartErrorsTask] based on the given [target] in the given | 2143 * Create a [DartErrorsTask] based on the given [target] in the given |
| 2103 * [context]. | 2144 * [context]. |
| 2104 */ | 2145 */ |
| 2105 static DartErrorsTask createTask( | 2146 static DartErrorsTask createTask( |
| 2106 AnalysisContext context, AnalysisTarget target) { | 2147 AnalysisContext context, AnalysisTarget target) { |
| 2107 return new DartErrorsTask(context, target); | 2148 return new DartErrorsTask(context, target); |
| 2108 } | 2149 } |
| 2109 } | 2150 } |
| 2110 | 2151 |
| 2111 /** | 2152 /** |
| 2112 * A task that builds [RESOLVED_UNIT] for a unit. | 2153 * A task that builds [RESOLVED_UNIT10] for a unit. |
| 2113 */ | 2154 */ |
| 2114 class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask { | 2155 class EvaluateUnitConstantsTask extends SourceBasedAnalysisTask { |
| 2115 /** | 2156 /** |
| 2116 * The name of the [RESOLVED_UNIT9] input. | 2157 * The name of the [RESOLVED_UNIT9] input. |
| 2117 */ | 2158 */ |
| 2118 static const String UNIT_INPUT = 'UNIT_INPUT'; | 2159 static const String UNIT_INPUT = 'UNIT_INPUT'; |
| 2119 | 2160 |
| 2120 /** | 2161 /** |
| 2121 * The name of the [CONSTANT_VALUE] input. | 2162 * The name of the [CONSTANT_VALUE] input. |
| 2122 */ | 2163 */ |
| 2123 static const String CONSTANT_VALUES = 'CONSTANT_VALUES'; | 2164 static const String CONSTANT_VALUES = 'CONSTANT_VALUES'; |
| 2124 | 2165 |
| 2125 /** | 2166 /** |
| 2126 * The task descriptor describing this kind of task. | 2167 * The task descriptor describing this kind of task. |
| 2127 */ | 2168 */ |
| 2128 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2169 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| 2129 'EvaluateUnitConstantsTask', | 2170 'EvaluateUnitConstantsTask', |
| 2130 createTask, | 2171 createTask, |
| 2131 buildInputs, | 2172 buildInputs, |
| 2132 <ResultDescriptor>[RESOLVED_UNIT]); | 2173 <ResultDescriptor>[RESOLVED_UNIT10]); |
| 2133 | 2174 |
| 2134 EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target) | 2175 EvaluateUnitConstantsTask(AnalysisContext context, LibrarySpecificUnit target) |
| 2135 : super(context, target); | 2176 : super(context, target); |
| 2136 | 2177 |
| 2137 @override | 2178 @override |
| 2138 TaskDescriptor get descriptor => DESCRIPTOR; | 2179 TaskDescriptor get descriptor => DESCRIPTOR; |
| 2139 | 2180 |
| 2140 @override | 2181 @override |
| 2141 void internalPerform() { | 2182 void internalPerform() { |
| 2142 // No actual work needs to be performed; the task manager will ensure that | 2183 // No actual work needs to be performed; the task manager will ensure that |
| 2143 // all constants are evaluated before this method is called. | 2184 // all constants are evaluated before this method is called. |
| 2144 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 2185 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 2145 outputs[RESOLVED_UNIT] = unit; | 2186 outputs[RESOLVED_UNIT10] = unit; |
| 2146 } | 2187 } |
| 2147 | 2188 |
| 2148 /** | 2189 /** |
| 2149 * Return a map from the names of the inputs of this kind of task to the task | 2190 * Return a map from the names of the inputs of this kind of task to the task |
| 2150 * input descriptors describing those inputs for a task with the | 2191 * input descriptors describing those inputs for a task with the |
| 2151 * given [target]. | 2192 * given [target]. |
| 2152 */ | 2193 */ |
| 2153 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { | 2194 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 2154 LibrarySpecificUnit unit = target; | 2195 LibrarySpecificUnit unit = target; |
| 2155 return <String, TaskInput>{ | 2196 return <String, TaskInput>{ |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2528 AnalysisContext context, AnalysisTarget target) { | 2569 AnalysisContext context, AnalysisTarget target) { |
| 2529 return new GenerateHintsTask(context, target); | 2570 return new GenerateHintsTask(context, target); |
| 2530 } | 2571 } |
| 2531 } | 2572 } |
| 2532 | 2573 |
| 2533 /** | 2574 /** |
| 2534 * A task that generates [LINTS] for a unit. | 2575 * A task that generates [LINTS] for a unit. |
| 2535 */ | 2576 */ |
| 2536 class GenerateLintsTask extends SourceBasedAnalysisTask { | 2577 class GenerateLintsTask extends SourceBasedAnalysisTask { |
| 2537 /** | 2578 /** |
| 2538 * The name of the [RESOLVED_UNIT8] input. | 2579 * The name of the [RESOLVED_UNIT] input. |
| 2539 */ | 2580 */ |
| 2540 static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT'; | 2581 static const String RESOLVED_UNIT_INPUT = 'RESOLVED_UNIT'; |
| 2541 | 2582 |
| 2542 /** | 2583 /** |
| 2543 * The name of a list of [USED_LOCAL_ELEMENTS] for each library unit input. | |
| 2544 */ | |
| 2545 static const String USED_LOCAL_ELEMENTS_INPUT = 'USED_LOCAL_ELEMENTS'; | |
| 2546 | |
| 2547 /** | |
| 2548 * The name of a list of [USED_IMPORTED_ELEMENTS] for each library unit input. | |
| 2549 */ | |
| 2550 static const String USED_IMPORTED_ELEMENTS_INPUT = 'USED_IMPORTED_ELEMENTS'; | |
| 2551 | |
| 2552 /** | |
| 2553 * The name of the [TYPE_PROVIDER] input. | |
| 2554 */ | |
| 2555 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; | |
| 2556 | |
| 2557 /** | |
| 2558 * The task descriptor describing this kind of task. | 2584 * The task descriptor describing this kind of task. |
| 2559 */ | 2585 */ |
| 2560 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 2586 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| 2561 'GenerateLintsTask', createTask, buildInputs, <ResultDescriptor>[LINTS]); | 2587 'GenerateLintsTask', createTask, buildInputs, <ResultDescriptor>[LINTS]); |
| 2562 | 2588 |
| 2563 GenerateLintsTask(InternalAnalysisContext context, AnalysisTarget target) | 2589 GenerateLintsTask(InternalAnalysisContext context, AnalysisTarget target) |
| 2564 : super(context, target); | 2590 : super(context, target); |
| 2565 | 2591 |
| 2566 @override | 2592 @override |
| 2567 TaskDescriptor get descriptor => DESCRIPTOR; | 2593 TaskDescriptor get descriptor => DESCRIPTOR; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2580 Source source = getRequiredSource(); | 2606 Source source = getRequiredSource(); |
| 2581 ErrorReporter errorReporter = new ErrorReporter(errorListener, source); | 2607 ErrorReporter errorReporter = new ErrorReporter(errorListener, source); |
| 2582 // | 2608 // |
| 2583 // Prepare inputs. | 2609 // Prepare inputs. |
| 2584 // | 2610 // |
| 2585 CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT); | 2611 CompilationUnit unit = getRequiredInput(RESOLVED_UNIT_INPUT); |
| 2586 | 2612 |
| 2587 // | 2613 // |
| 2588 // Generate lints. | 2614 // Generate lints. |
| 2589 // | 2615 // |
| 2590 LintGenerator.LINTERS.forEach((l) => l.reporter = errorReporter); | 2616 List<Linter> linters = getLints(context); |
| 2591 Iterable<AstVisitor> visitors = | 2617 linters.forEach((l) => l.reporter = errorReporter); |
| 2592 LintGenerator.LINTERS.map((l) => l.getVisitor()).toList(); | 2618 Iterable<AstVisitor> visitors = linters.map((l) => l.getVisitor()).toList(); |
| 2593 unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null))); | 2619 unit.accept(new DelegatingAstVisitor(visitors.where((v) => v != null))); |
| 2594 | 2620 |
| 2595 // | 2621 // |
| 2596 // Record outputs. | 2622 // Record outputs. |
| 2597 // | 2623 // |
| 2598 outputs[LINTS] = errorListener.errors; | 2624 outputs[LINTS] = errorListener.errors; |
| 2599 } | 2625 } |
| 2600 | 2626 |
| 2601 /** | 2627 /** |
| 2602 * Return a map from the names of the inputs of this kind of task to the task | 2628 * Return a map from the names of the inputs of this kind of task to the task |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2703 * Create a [InferInstanceMembersInUnitTask] based on the given [target] in | 2729 * Create a [InferInstanceMembersInUnitTask] based on the given [target] in |
| 2704 * the given [context]. | 2730 * the given [context]. |
| 2705 */ | 2731 */ |
| 2706 static InferInstanceMembersInUnitTask createTask( | 2732 static InferInstanceMembersInUnitTask createTask( |
| 2707 AnalysisContext context, AnalysisTarget target) { | 2733 AnalysisContext context, AnalysisTarget target) { |
| 2708 return new InferInstanceMembersInUnitTask(context, target); | 2734 return new InferInstanceMembersInUnitTask(context, target); |
| 2709 } | 2735 } |
| 2710 } | 2736 } |
| 2711 | 2737 |
| 2712 /** | 2738 /** |
| 2713 * A task that ensures that all of the inferrable instance members in a | |
| 2714 * compilation unit have had their right hand sides re-resolved | |
| 2715 */ | |
| 2716 class ResolveInstanceFieldsInUnitTask extends SourceBasedAnalysisTask { | |
| 2717 /** | |
| 2718 * The name of the [LIBRARY_ELEMENT5] input. | |
| 2719 */ | |
| 2720 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; | |
| 2721 | |
| 2722 /** | |
| 2723 * The name of the [TYPE_PROVIDER] input. | |
| 2724 */ | |
| 2725 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; | |
| 2726 | |
| 2727 /** | |
| 2728 * The name of the input whose value is the [RESOLVED_UNIT6] for the | |
| 2729 * compilation unit. | |
| 2730 */ | |
| 2731 static const String UNIT_INPUT = 'UNIT_INPUT'; | |
| 2732 | |
| 2733 /** | |
| 2734 * The task descriptor describing this kind of task. | |
| 2735 */ | |
| 2736 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | |
| 2737 'ResolveInstanceFieldsInUnitTask', | |
| 2738 createTask, | |
| 2739 buildInputs, | |
| 2740 <ResultDescriptor>[RESOLVED_UNIT7]); | |
| 2741 | |
| 2742 /** | |
| 2743 * Initialize a newly created task to build a library element for the given | |
| 2744 * [unit] in the given [context]. | |
| 2745 */ | |
| 2746 ResolveInstanceFieldsInUnitTask( | |
| 2747 InternalAnalysisContext context, LibrarySpecificUnit unit) | |
| 2748 : super(context, unit); | |
| 2749 | |
| 2750 @override | |
| 2751 TaskDescriptor get descriptor => DESCRIPTOR; | |
| 2752 | |
| 2753 @override | |
| 2754 void internalPerform() { | |
| 2755 // | |
| 2756 // Prepare inputs. | |
| 2757 // | |
| 2758 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | |
| 2759 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | |
| 2760 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | |
| 2761 | |
| 2762 CompilationUnitElement unitElement = unit.element; | |
| 2763 if (context.analysisOptions.strongMode) { | |
| 2764 // | |
| 2765 // Resolve references. | |
| 2766 // | |
| 2767 // TODO(leafp): This code only needs to re-resolve the right hand sides of | |
| 2768 // instance fields. We could do incremental resolution on each field | |
| 2769 // only using the incremental resolver. However, this caused a massive | |
| 2770 // performance degredation on the large_class_declaration_test.dart test. | |
| 2771 // I would hypothesize that incremental resolution of field is linear in | |
| 2772 // the size of the enclosing class, and hence incrementally resolving each | |
| 2773 // field was quadratic. We may wish to revisit this if we can resolve | |
| 2774 // this performance issue. | |
| 2775 InheritanceManager inheritanceManager = | |
| 2776 new InheritanceManager(libraryElement); | |
| 2777 PartialResolverVisitor visitor = new PartialResolverVisitor( | |
| 2778 libraryElement, | |
| 2779 unitElement.source, | |
| 2780 typeProvider, | |
| 2781 AnalysisErrorListener.NULL_LISTENER, | |
| 2782 inheritanceManager: inheritanceManager); | |
| 2783 unit.accept(visitor); | |
| 2784 } | |
| 2785 // | |
| 2786 // Record outputs. | |
| 2787 // | |
| 2788 outputs[RESOLVED_UNIT7] = unit; | |
| 2789 } | |
| 2790 | |
| 2791 /** | |
| 2792 * Return a map from the names of the inputs of this kind of task to the task | |
| 2793 * input descriptors describing those inputs for a task with the given | |
| 2794 * [libSource]. | |
| 2795 */ | |
| 2796 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { | |
| 2797 LibrarySpecificUnit unit = target; | |
| 2798 return <String, TaskInput>{ | |
| 2799 UNIT_INPUT: RESOLVED_UNIT6.of(unit), | |
| 2800 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), | |
| 2801 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), | |
| 2802 // In strong mode, add additional dependencies to enforce inference | |
| 2803 // ordering. | |
| 2804 | |
| 2805 // Require that static variable inference be complete for all units in | |
| 2806 // the current library cycle. | |
| 2807 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList( | |
| 2808 (CompilationUnitElementImpl unit) => RESOLVED_UNIT6 | |
| 2809 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))), | |
| 2810 // Require that full inference be complete for all dependencies of the | |
| 2811 // current library cycle. | |
| 2812 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList( | |
| 2813 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8 | |
| 2814 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))) | |
| 2815 }; | |
| 2816 } | |
| 2817 | |
| 2818 /** | |
| 2819 * Create a [ResolveInstanceFieldsInUnitTask] based on the given [target] in | |
| 2820 * the given [context]. | |
| 2821 */ | |
| 2822 static ResolveInstanceFieldsInUnitTask createTask( | |
| 2823 AnalysisContext context, AnalysisTarget target) { | |
| 2824 return new ResolveInstanceFieldsInUnitTask(context, target); | |
| 2825 } | |
| 2826 } | |
| 2827 | |
| 2828 /** | |
| 2829 * An abstract class that defines utility methods that are useful for tasks | 2739 * An abstract class that defines utility methods that are useful for tasks |
| 2830 * operating on static variables. | 2740 * operating on static variables. |
| 2831 */ | 2741 */ |
| 2832 abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask { | 2742 abstract class InferStaticVariableTask extends ConstantEvaluationAnalysisTask { |
| 2833 InferStaticVariableTask( | 2743 InferStaticVariableTask( |
| 2834 InternalAnalysisContext context, VariableElement variable) | 2744 InternalAnalysisContext context, VariableElement variable) |
| 2835 : super(context, variable); | 2745 : super(context, variable); |
| 2836 | 2746 |
| 2837 /** | 2747 /** |
| 2838 * Return the declaration of the target within the given compilation [unit]. | 2748 * Return the declaration of the target within the given compilation [unit]. |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3131 * The name of the [HINTS] input. | 3041 * The name of the [HINTS] input. |
| 3132 */ | 3042 */ |
| 3133 static const String HINTS_INPUT = 'HINTS'; | 3043 static const String HINTS_INPUT = 'HINTS'; |
| 3134 | 3044 |
| 3135 /** | 3045 /** |
| 3136 * The name of the [LINTS] input. | 3046 * The name of the [LINTS] input. |
| 3137 */ | 3047 */ |
| 3138 static const String LINTS_INPUT = 'LINTS'; | 3048 static const String LINTS_INPUT = 'LINTS'; |
| 3139 | 3049 |
| 3140 /** | 3050 /** |
| 3051 * The name of the [STRONG_MODE_ERRORS] input. |
| 3052 */ |
| 3053 static const String STRONG_MODE_ERRORS_INPUT = 'STRONG_MODE_ERRORS'; |
| 3054 |
| 3055 /** |
| 3141 * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input. | 3056 * The name of the [RESOLVE_TYPE_NAMES_ERRORS] input. |
| 3142 */ | 3057 */ |
| 3143 static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT = | 3058 static const String RESOLVE_TYPE_NAMES_ERRORS_INPUT = |
| 3144 'RESOLVE_TYPE_NAMES_ERRORS'; | 3059 'RESOLVE_TYPE_NAMES_ERRORS'; |
| 3145 | 3060 |
| 3146 /** | 3061 /** |
| 3147 * The name of the [RESOLVE_UNIT_ERRORS] input. | 3062 * The name of the [RESOLVE_UNIT_ERRORS] input. |
| 3148 */ | 3063 */ |
| 3149 static const String RESOLVE_UNIT_ERRORS_INPUT = 'RESOLVE_UNIT_ERRORS'; | 3064 static const String RESOLVE_UNIT_ERRORS_INPUT = 'RESOLVE_UNIT_ERRORS'; |
| 3150 | 3065 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3179 // | 3094 // |
| 3180 // Prepare inputs. | 3095 // Prepare inputs. |
| 3181 // | 3096 // |
| 3182 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[]; | 3097 List<List<AnalysisError>> errorLists = <List<AnalysisError>>[]; |
| 3183 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT)); | 3098 errorLists.add(getRequiredInput(BUILD_DIRECTIVES_ERRORS_INPUT)); |
| 3184 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT)); | 3099 errorLists.add(getRequiredInput(BUILD_LIBRARY_ERRORS_INPUT)); |
| 3185 errorLists.add(getRequiredInput(HINTS_INPUT)); | 3100 errorLists.add(getRequiredInput(HINTS_INPUT)); |
| 3186 errorLists.add(getRequiredInput(LINTS_INPUT)); | 3101 errorLists.add(getRequiredInput(LINTS_INPUT)); |
| 3187 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT)); | 3102 errorLists.add(getRequiredInput(RESOLVE_TYPE_NAMES_ERRORS_INPUT)); |
| 3188 errorLists.add(getRequiredInput(RESOLVE_UNIT_ERRORS_INPUT)); | 3103 errorLists.add(getRequiredInput(RESOLVE_UNIT_ERRORS_INPUT)); |
| 3104 errorLists.add(getRequiredInput(STRONG_MODE_ERRORS_INPUT)); |
| 3189 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT)); | 3105 errorLists.add(getRequiredInput(VARIABLE_REFERENCE_ERRORS_INPUT)); |
| 3190 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT)); | 3106 errorLists.add(getRequiredInput(VERIFY_ERRORS_INPUT)); |
| 3191 // | 3107 // |
| 3192 // Record outputs. | 3108 // Record outputs. |
| 3193 // | 3109 // |
| 3194 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists); | 3110 outputs[LIBRARY_UNIT_ERRORS] = AnalysisError.mergeLists(errorLists); |
| 3195 } | 3111 } |
| 3196 | 3112 |
| 3197 /** | 3113 /** |
| 3198 * Return a map from the names of the inputs of this kind of task to the task | 3114 * Return a map from the names of the inputs of this kind of task to the task |
| 3199 * input descriptors describing those inputs for a task with the | 3115 * input descriptors describing those inputs for a task with the |
| 3200 * given [unit]. | 3116 * given [unit]. |
| 3201 */ | 3117 */ |
| 3202 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { | 3118 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 3203 LibrarySpecificUnit unit = target; | 3119 LibrarySpecificUnit unit = target; |
| 3204 Map<String, TaskInput> inputs = <String, TaskInput>{ | 3120 Map<String, TaskInput> inputs = <String, TaskInput>{ |
| 3205 HINTS_INPUT: HINTS.of(unit), | 3121 HINTS_INPUT: HINTS.of(unit), |
| 3206 LINTS_INPUT: LINTS.of(unit), | 3122 LINTS_INPUT: LINTS.of(unit), |
| 3207 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit), | 3123 RESOLVE_TYPE_NAMES_ERRORS_INPUT: RESOLVE_TYPE_NAMES_ERRORS.of(unit), |
| 3208 RESOLVE_UNIT_ERRORS_INPUT: RESOLVE_UNIT_ERRORS.of(unit), | 3124 RESOLVE_UNIT_ERRORS_INPUT: RESOLVE_UNIT_ERRORS.of(unit), |
| 3125 STRONG_MODE_ERRORS_INPUT: STRONG_MODE_ERRORS.of(unit), |
| 3209 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit), | 3126 VARIABLE_REFERENCE_ERRORS_INPUT: VARIABLE_REFERENCE_ERRORS.of(unit), |
| 3210 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit) | 3127 VERIFY_ERRORS_INPUT: VERIFY_ERRORS.of(unit) |
| 3211 }; | 3128 }; |
| 3212 Source source = unit.source; | 3129 Source source = unit.source; |
| 3213 if (unit.library == source) { | 3130 if (unit.library == source) { |
| 3214 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = | 3131 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = |
| 3215 BUILD_DIRECTIVES_ERRORS.of(source); | 3132 BUILD_DIRECTIVES_ERRORS.of(source); |
| 3216 inputs[BUILD_LIBRARY_ERRORS_INPUT] = BUILD_LIBRARY_ERRORS.of(source); | 3133 inputs[BUILD_LIBRARY_ERRORS_INPUT] = BUILD_LIBRARY_ERRORS.of(source); |
| 3217 } else { | 3134 } else { |
| 3218 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = | 3135 inputs[BUILD_DIRECTIVES_ERRORS_INPUT] = |
| 3219 new ConstantTaskInput(AnalysisError.NO_ERRORS); | 3136 new ConstantTaskInput(AnalysisError.NO_ERRORS); |
| 3220 inputs[BUILD_LIBRARY_ERRORS_INPUT] = | 3137 inputs[BUILD_LIBRARY_ERRORS_INPUT] = |
| 3221 new ConstantTaskInput(AnalysisError.NO_ERRORS); | 3138 new ConstantTaskInput(AnalysisError.NO_ERRORS); |
| 3222 } | 3139 } |
| 3223 return inputs; | 3140 return inputs; |
| 3224 } | 3141 } |
| 3225 | 3142 |
| 3226 /** | 3143 /** |
| 3227 * Create a [LibraryUnitErrorsTask] based on the given [target] in the given | 3144 * Create a [LibraryUnitErrorsTask] based on the given [target] in the given |
| 3228 * [context]. | 3145 * [context]. |
| 3229 */ | 3146 */ |
| 3230 static LibraryUnitErrorsTask createTask( | 3147 static LibraryUnitErrorsTask createTask( |
| 3231 AnalysisContext context, AnalysisTarget target) { | 3148 AnalysisContext context, AnalysisTarget target) { |
| 3232 return new LibraryUnitErrorsTask(context, target); | 3149 return new LibraryUnitErrorsTask(context, target); |
| 3233 } | 3150 } |
| 3234 } | 3151 } |
| 3235 | 3152 |
| 3236 /** | 3153 /** |
| 3237 * A task that parses the content of a Dart file, producing an AST structure. | 3154 * A task that parses the content of a Dart file, producing an AST structure, |
| 3155 * any lexical errors found in the process, the kind of the file (library or |
| 3156 * part), and several lists based on the AST. |
| 3238 */ | 3157 */ |
| 3239 class ParseDartTask extends SourceBasedAnalysisTask { | 3158 class ParseDartTask extends SourceBasedAnalysisTask { |
| 3240 /** | 3159 /** |
| 3241 * The name of the input whose value is the line information produced for the | 3160 * The name of the input whose value is the line information produced for the |
| 3242 * file. | 3161 * file. |
| 3243 */ | 3162 */ |
| 3244 static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME'; | 3163 static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME'; |
| 3245 | 3164 |
| 3246 /** | 3165 /** |
| 3247 * The name of the input whose value is the modification time of the file. | 3166 * The name of the input whose value is the modification time of the file. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3458 | 3377 |
| 3459 @override | 3378 @override |
| 3460 void internalPerform() { | 3379 void internalPerform() { |
| 3461 // | 3380 // |
| 3462 // Prepare inputs. | 3381 // Prepare inputs. |
| 3463 // | 3382 // |
| 3464 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | 3383 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
| 3465 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3384 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 3466 CompilationUnitElement unitElement = unit.element; | 3385 CompilationUnitElement unitElement = unit.element; |
| 3467 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | 3386 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 3387 // |
| 3388 // Resolve references and record outputs. |
| 3389 // |
| 3468 if (context.analysisOptions.strongMode) { | 3390 if (context.analysisOptions.strongMode) { |
| 3469 // | |
| 3470 // Resolve references. | |
| 3471 // | |
| 3472 InheritanceManager inheritanceManager = | 3391 InheritanceManager inheritanceManager = |
| 3473 new InheritanceManager(libraryElement); | 3392 new InheritanceManager(libraryElement); |
| 3474 PartialResolverVisitor visitor = new PartialResolverVisitor( | 3393 PartialResolverVisitor visitor = new PartialResolverVisitor( |
| 3475 libraryElement, | 3394 libraryElement, |
| 3476 unitElement.source, | 3395 unitElement.source, |
| 3477 typeProvider, | 3396 typeProvider, |
| 3478 AnalysisErrorListener.NULL_LISTENER, | 3397 AnalysisErrorListener.NULL_LISTENER, |
| 3479 inheritanceManager: inheritanceManager); | 3398 inheritanceManager: inheritanceManager); |
| 3480 unit.accept(visitor); | 3399 unit.accept(visitor); |
| 3481 // | 3400 |
| 3482 // Record outputs. | |
| 3483 // | |
| 3484 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = visitor.variablesAndFields; | 3401 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = visitor.variablesAndFields; |
| 3485 } else { | 3402 } else { |
| 3486 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = []; | 3403 outputs[INFERABLE_STATIC_VARIABLES_IN_UNIT] = []; |
| 3487 } | 3404 } |
| 3488 outputs[RESOLVED_UNIT5] = unit; | 3405 outputs[RESOLVED_UNIT5] = unit; |
| 3489 } | 3406 } |
| 3490 | 3407 |
| 3491 /** | 3408 /** |
| 3492 * Return a map from the names of the inputs of this kind of task to the task | 3409 * Return a map from the names of the inputs of this kind of task to the task |
| 3493 * input descriptors describing those inputs for a task with the | 3410 * input descriptors describing those inputs for a task with the |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3654 String name = node.name; | 3571 String name = node.name; |
| 3655 names.names.add(name); | 3572 names.names.add(name); |
| 3656 if (dependsOn != null && bodyLevel == 0) { | 3573 if (dependsOn != null && bodyLevel == 0) { |
| 3657 dependsOn.add(name); | 3574 dependsOn.add(name); |
| 3658 } | 3575 } |
| 3659 } | 3576 } |
| 3660 } | 3577 } |
| 3661 } | 3578 } |
| 3662 | 3579 |
| 3663 /** | 3580 /** |
| 3664 * A task that resolves the bodies of top-level functions, constructors, and | 3581 * A task that ensures that all of the inferrable instance members in a |
| 3665 * methods within a single compilation unit. | 3582 * compilation unit have had their right hand sides re-resolved |
| 3666 */ | 3583 */ |
| 3667 class ResolveUnitTask extends SourceBasedAnalysisTask { | 3584 class ResolveInstanceFieldsInUnitTask extends SourceBasedAnalysisTask { |
| 3668 /** | 3585 /** |
| 3669 * The name of the input whose value is the defining [LIBRARY_ELEMENT5]. | 3586 * The name of the [LIBRARY_ELEMENT5] input. |
| 3670 */ | 3587 */ |
| 3671 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; | 3588 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; |
| 3672 | 3589 |
| 3673 /** | 3590 /** |
| 3674 * The name of the [TYPE_PROVIDER] input. | 3591 * The name of the [TYPE_PROVIDER] input. |
| 3675 */ | 3592 */ |
| 3676 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; | 3593 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 3677 | 3594 |
| 3678 /** | 3595 /** |
| 3679 * The name of the [RESOLVED_UNIT8] input. | 3596 * The name of the input whose value is the [RESOLVED_UNIT6] for the |
| 3597 * compilation unit. |
| 3680 */ | 3598 */ |
| 3681 static const String UNIT_INPUT = 'UNIT_INPUT'; | 3599 static const String UNIT_INPUT = 'UNIT_INPUT'; |
| 3682 | 3600 |
| 3601 /** |
| 3602 * The task descriptor describing this kind of task. |
| 3603 */ |
| 3683 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( | 3604 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| 3684 'ResolveUnitTask', | 3605 'ResolveInstanceFieldsInUnitTask', |
| 3685 createTask, | 3606 createTask, |
| 3686 buildInputs, | 3607 buildInputs, |
| 3687 <ResultDescriptor>[RESOLVE_UNIT_ERRORS, RESOLVED_UNIT9]); | 3608 <ResultDescriptor>[RESOLVED_UNIT7]); |
| 3688 | 3609 |
| 3689 ResolveUnitTask( | 3610 /** |
| 3690 InternalAnalysisContext context, LibrarySpecificUnit compilationUnit) | 3611 * Initialize a newly created task to build a library element for the given |
| 3691 : super(context, compilationUnit); | 3612 * [unit] in the given [context]. |
| 3613 */ |
| 3614 ResolveInstanceFieldsInUnitTask( |
| 3615 InternalAnalysisContext context, LibrarySpecificUnit unit) |
| 3616 : super(context, unit); |
| 3692 | 3617 |
| 3693 @override | 3618 @override |
| 3694 TaskDescriptor get descriptor => DESCRIPTOR; | 3619 TaskDescriptor get descriptor => DESCRIPTOR; |
| 3695 | 3620 |
| 3696 @override | 3621 @override |
| 3697 void internalPerform() { | 3622 void internalPerform() { |
| 3698 // | 3623 // |
| 3699 // Prepare inputs. | 3624 // Prepare inputs. |
| 3700 // | 3625 // |
| 3701 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | 3626 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
| 3702 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3627 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 3703 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | 3628 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 3704 // | 3629 |
| 3705 // Resolve everything | |
| 3706 // | |
| 3707 CompilationUnitElement unitElement = unit.element; | 3630 CompilationUnitElement unitElement = unit.element; |
| 3708 RecordingErrorListener errorListener = new RecordingErrorListener(); | 3631 if (context.analysisOptions.strongMode) { |
| 3709 ResolverVisitor visitor = new ResolverVisitor( | 3632 // |
| 3710 libraryElement, unitElement.source, typeProvider, errorListener); | 3633 // Resolve references. |
| 3711 unit.accept(visitor); | 3634 // |
| 3635 // TODO(leafp): This code only needs to re-resolve the right hand sides of |
| 3636 // instance fields. We could do incremental resolution on each field |
| 3637 // only using the incremental resolver. However, this caused a massive |
| 3638 // performance degredation on the large_class_declaration_test.dart test. |
| 3639 // I would hypothesize that incremental resolution of field is linear in |
| 3640 // the size of the enclosing class, and hence incrementally resolving each |
| 3641 // field was quadratic. We may wish to revisit this if we can resolve |
| 3642 // this performance issue. |
| 3643 InheritanceManager inheritanceManager = |
| 3644 new InheritanceManager(libraryElement); |
| 3645 PartialResolverVisitor visitor = new PartialResolverVisitor( |
| 3646 libraryElement, |
| 3647 unitElement.source, |
| 3648 typeProvider, |
| 3649 AnalysisErrorListener.NULL_LISTENER, |
| 3650 inheritanceManager: inheritanceManager); |
| 3651 unit.accept(visitor); |
| 3652 } |
| 3712 // | 3653 // |
| 3713 // Record outputs. | 3654 // Record outputs. |
| 3714 // | 3655 // |
| 3715 outputs[RESOLVE_UNIT_ERRORS] = errorListener.errors; | 3656 outputs[RESOLVED_UNIT7] = unit; |
| 3716 outputs[RESOLVED_UNIT9] = unit; | |
| 3717 } | 3657 } |
| 3718 | 3658 |
| 3719 /** | 3659 /** |
| 3720 * Return a map from the names of the inputs of this kind of task to the task | 3660 * Return a map from the names of the inputs of this kind of task to the task |
| 3721 * input descriptors describing those inputs for a task with the given | 3661 * input descriptors describing those inputs for a task with the given |
| 3722 * [target]. | 3662 * [libSource]. |
| 3723 */ | 3663 */ |
| 3724 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { | 3664 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 3725 LibrarySpecificUnit unit = target; | 3665 LibrarySpecificUnit unit = target; |
| 3726 return <String, TaskInput>{ | 3666 return <String, TaskInput>{ |
| 3667 UNIT_INPUT: RESOLVED_UNIT6.of(unit), |
| 3727 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), | 3668 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), |
| 3728 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), | 3669 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), |
| 3729 UNIT_INPUT: RESOLVED_UNIT8.of(unit), | |
| 3730 // In strong mode, add additional dependencies to enforce inference | 3670 // In strong mode, add additional dependencies to enforce inference |
| 3731 // ordering. | 3671 // ordering. |
| 3732 | 3672 |
| 3733 // Require that inference be complete for all units in the | 3673 // Require that static variable inference be complete for all units in |
| 3674 // the current library cycle. |
| 3675 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList( |
| 3676 (CompilationUnitElementImpl unit) => RESOLVED_UNIT6 |
| 3677 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))), |
| 3678 // Require that full inference be complete for all dependencies of the |
| 3734 // current library cycle. | 3679 // current library cycle. |
| 3735 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList( | 3680 'orderLibraryCycles': LIBRARY_CYCLE_DEPENDENCIES.of(unit).toList( |
| 3736 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8 | 3681 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8 |
| 3737 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))) | 3682 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))) |
| 3738 }; | 3683 }; |
| 3739 } | 3684 } |
| 3740 | 3685 |
| 3741 /** | 3686 /** |
| 3742 * Create a [ResolveUnitTask] based on the given [target] in | 3687 * Create a [ResolveInstanceFieldsInUnitTask] based on the given [target] in |
| 3743 * the given [context]. | 3688 * the given [context]. |
| 3744 */ | 3689 */ |
| 3745 static ResolveUnitTask createTask( | 3690 static ResolveInstanceFieldsInUnitTask createTask( |
| 3746 AnalysisContext context, AnalysisTarget target) { | 3691 AnalysisContext context, AnalysisTarget target) { |
| 3747 return new ResolveUnitTask(context, target); | 3692 return new ResolveInstanceFieldsInUnitTask(context, target); |
| 3748 } | 3693 } |
| 3749 } | 3694 } |
| 3750 | 3695 |
| 3751 /** | 3696 /** |
| 3752 * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] fo
r every | 3697 * A task that finishes resolution by requesting [RESOLVED_UNIT_NO_CONSTANTS] fo
r every |
| 3753 * unit in the libraries closure and produces [LIBRARY_ELEMENT]. | 3698 * unit in the libraries closure and produces [LIBRARY_ELEMENT]. |
| 3754 */ | 3699 */ |
| 3755 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { | 3700 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { |
| 3756 /** | 3701 /** |
| 3757 * The name of the [LIBRARY_ELEMENT5] input. | 3702 * The name of the [LIBRARY_ELEMENT5] input. |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3877 * Create a [ResolveLibraryTypeNamesTask] based on the given [target] in | 3822 * Create a [ResolveLibraryTypeNamesTask] based on the given [target] in |
| 3878 * the given [context]. | 3823 * the given [context]. |
| 3879 */ | 3824 */ |
| 3880 static ResolveLibraryTypeNamesTask createTask( | 3825 static ResolveLibraryTypeNamesTask createTask( |
| 3881 AnalysisContext context, AnalysisTarget target) { | 3826 AnalysisContext context, AnalysisTarget target) { |
| 3882 return new ResolveLibraryTypeNamesTask(context, target); | 3827 return new ResolveLibraryTypeNamesTask(context, target); |
| 3883 } | 3828 } |
| 3884 } | 3829 } |
| 3885 | 3830 |
| 3886 /** | 3831 /** |
| 3832 * A task that resolves the bodies of top-level functions, constructors, and |
| 3833 * methods within a single compilation unit. |
| 3834 */ |
| 3835 class ResolveUnitTask extends SourceBasedAnalysisTask { |
| 3836 /** |
| 3837 * The name of the input whose value is the defining [LIBRARY_ELEMENT5]. |
| 3838 */ |
| 3839 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; |
| 3840 |
| 3841 /** |
| 3842 * The name of the [TYPE_PROVIDER] input. |
| 3843 */ |
| 3844 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 3845 |
| 3846 /** |
| 3847 * The name of the [RESOLVED_UNIT8] input. |
| 3848 */ |
| 3849 static const String UNIT_INPUT = 'UNIT_INPUT'; |
| 3850 |
| 3851 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| 3852 'ResolveUnitTask', |
| 3853 createTask, |
| 3854 buildInputs, |
| 3855 <ResultDescriptor>[RESOLVE_UNIT_ERRORS, RESOLVED_UNIT9]); |
| 3856 |
| 3857 ResolveUnitTask( |
| 3858 InternalAnalysisContext context, LibrarySpecificUnit compilationUnit) |
| 3859 : super(context, compilationUnit); |
| 3860 |
| 3861 @override |
| 3862 TaskDescriptor get descriptor => DESCRIPTOR; |
| 3863 |
| 3864 @override |
| 3865 void internalPerform() { |
| 3866 // |
| 3867 // Prepare inputs. |
| 3868 // |
| 3869 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
| 3870 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 3871 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 3872 // |
| 3873 // Resolve everything. |
| 3874 // |
| 3875 CompilationUnitElement unitElement = unit.element; |
| 3876 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 3877 ResolverVisitor visitor = new ResolverVisitor( |
| 3878 libraryElement, unitElement.source, typeProvider, errorListener); |
| 3879 unit.accept(visitor); |
| 3880 // |
| 3881 // Record outputs. |
| 3882 // |
| 3883 outputs[RESOLVE_UNIT_ERRORS] = errorListener.errors; |
| 3884 outputs[RESOLVED_UNIT9] = unit; |
| 3885 } |
| 3886 |
| 3887 /** |
| 3888 * Return a map from the names of the inputs of this kind of task to the task |
| 3889 * input descriptors describing those inputs for a task with the given |
| 3890 * [target]. |
| 3891 */ |
| 3892 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 3893 LibrarySpecificUnit unit = target; |
| 3894 return <String, TaskInput>{ |
| 3895 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(unit.library), |
| 3896 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request), |
| 3897 UNIT_INPUT: RESOLVED_UNIT8.of(unit), |
| 3898 // In strong mode, add additional dependencies to enforce inference |
| 3899 // ordering. |
| 3900 |
| 3901 // Require that inference be complete for all units in the |
| 3902 // current library cycle. |
| 3903 'orderLibraryCycleTasks': LIBRARY_CYCLE_UNITS.of(unit).toList( |
| 3904 (CompilationUnitElementImpl unit) => RESOLVED_UNIT8 |
| 3905 .of(new LibrarySpecificUnit(unit.librarySource, unit.source))) |
| 3906 }; |
| 3907 } |
| 3908 |
| 3909 /** |
| 3910 * Create a [ResolveUnitTask] based on the given [target] in |
| 3911 * the given [context]. |
| 3912 */ |
| 3913 static ResolveUnitTask createTask( |
| 3914 AnalysisContext context, AnalysisTarget target) { |
| 3915 return new ResolveUnitTask(context, target); |
| 3916 } |
| 3917 } |
| 3918 |
| 3919 /** |
| 3887 * A task that builds [RESOLVED_UNIT3] for a unit. | 3920 * A task that builds [RESOLVED_UNIT3] for a unit. |
| 3888 */ | 3921 */ |
| 3889 class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask { | 3922 class ResolveUnitTypeNamesTask extends SourceBasedAnalysisTask { |
| 3890 /** | 3923 /** |
| 3891 * The name of the input whose value is the defining [LIBRARY_ELEMENT4]. | 3924 * The name of the input whose value is the defining [LIBRARY_ELEMENT4]. |
| 3892 */ | 3925 */ |
| 3893 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; | 3926 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; |
| 3894 | 3927 |
| 3895 /** | 3928 /** |
| 3896 * The name of the [RESOLVED_UNIT2] input. | 3929 * The name of the [RESOLVED_UNIT2] input. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3913 | 3946 |
| 3914 ResolveUnitTypeNamesTask( | 3947 ResolveUnitTypeNamesTask( |
| 3915 InternalAnalysisContext context, AnalysisTarget target) | 3948 InternalAnalysisContext context, AnalysisTarget target) |
| 3916 : super(context, target); | 3949 : super(context, target); |
| 3917 | 3950 |
| 3918 @override | 3951 @override |
| 3919 TaskDescriptor get descriptor => DESCRIPTOR; | 3952 TaskDescriptor get descriptor => DESCRIPTOR; |
| 3920 | 3953 |
| 3921 @override | 3954 @override |
| 3922 void internalPerform() { | 3955 void internalPerform() { |
| 3923 RecordingErrorListener errorListener = new RecordingErrorListener(); | |
| 3924 // | 3956 // |
| 3925 // Prepare inputs. | 3957 // Prepare inputs. |
| 3926 // | 3958 // |
| 3927 LibraryElement library = getRequiredInput(LIBRARY_INPUT); | 3959 LibraryElement library = getRequiredInput(LIBRARY_INPUT); |
| 3928 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 3960 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 3929 CompilationUnitElement unitElement = unit.element; | 3961 CompilationUnitElement unitElement = unit.element; |
| 3930 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | 3962 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 3931 // | 3963 // |
| 3932 // Resolve TypeName nodes. | 3964 // Resolve TypeName nodes. |
| 3933 // | 3965 // |
| 3966 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 3934 TypeResolverVisitor visitor = new TypeResolverVisitor( | 3967 TypeResolverVisitor visitor = new TypeResolverVisitor( |
| 3935 library, unitElement.source, typeProvider, errorListener); | 3968 library, unitElement.source, typeProvider, errorListener); |
| 3936 unit.accept(visitor); | 3969 unit.accept(visitor); |
| 3937 // | 3970 // |
| 3938 // Record outputs. | 3971 // Record outputs. |
| 3939 // | 3972 // |
| 3940 outputs[RESOLVE_TYPE_NAMES_ERRORS] = | 3973 outputs[RESOLVE_TYPE_NAMES_ERRORS] = |
| 3941 removeDuplicateErrors(errorListener.errors); | 3974 removeDuplicateErrors(errorListener.errors); |
| 3942 outputs[RESOLVED_UNIT3] = unit; | 3975 outputs[RESOLVED_UNIT3] = unit; |
| 3943 } | 3976 } |
| 3944 | 3977 |
| 3945 /** | 3978 /** |
| 3946 * Return a map from the names of the inputs of this kind of task to the task | 3979 * Return a map from the names of the inputs of this kind of task to the task |
| 3947 * input descriptors describing those inputs for a task with the | 3980 * input descriptors describing those inputs for a task with the |
| 3948 * given [target]. | 3981 * given [target]. |
| 3949 */ | 3982 */ |
| 3950 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { | 3983 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 3984 // TODO(brianwilkerson) This task updates the element model to have type |
| 3985 // information and updates the class hierarchy. It should produce a new |
| 3986 // version of the element model in order to record those changes. |
| 3951 LibrarySpecificUnit unit = target; | 3987 LibrarySpecificUnit unit = target; |
| 3952 return <String, TaskInput>{ | 3988 return <String, TaskInput>{ |
| 3953 'importsExportNamespace': | 3989 'importsExportNamespace': |
| 3954 IMPORTED_LIBRARIES.of(unit.library).toMapOf(LIBRARY_ELEMENT4), | 3990 IMPORTED_LIBRARIES.of(unit.library).toMapOf(LIBRARY_ELEMENT4), |
| 3955 LIBRARY_INPUT: LIBRARY_ELEMENT4.of(unit.library), | 3991 LIBRARY_INPUT: LIBRARY_ELEMENT4.of(unit.library), |
| 3956 UNIT_INPUT: RESOLVED_UNIT2.of(unit), | 3992 UNIT_INPUT: RESOLVED_UNIT2.of(unit), |
| 3957 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) | 3993 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
| 3958 }; | 3994 }; |
| 3959 } | 3995 } |
| 3960 | 3996 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3998 | 4034 |
| 3999 ResolveVariableReferencesTask( | 4035 ResolveVariableReferencesTask( |
| 4000 InternalAnalysisContext context, AnalysisTarget target) | 4036 InternalAnalysisContext context, AnalysisTarget target) |
| 4001 : super(context, target); | 4037 : super(context, target); |
| 4002 | 4038 |
| 4003 @override | 4039 @override |
| 4004 TaskDescriptor get descriptor => DESCRIPTOR; | 4040 TaskDescriptor get descriptor => DESCRIPTOR; |
| 4005 | 4041 |
| 4006 @override | 4042 @override |
| 4007 void internalPerform() { | 4043 void internalPerform() { |
| 4008 RecordingErrorListener errorListener = new RecordingErrorListener(); | |
| 4009 // | 4044 // |
| 4010 // Prepare inputs. | 4045 // Prepare inputs. |
| 4011 // | 4046 // |
| 4012 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); | 4047 LibraryElement libraryElement = getRequiredInput(LIBRARY_INPUT); |
| 4013 CompilationUnit unit = getRequiredInput(UNIT_INPUT); | 4048 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 4014 CompilationUnitElement unitElement = unit.element; | 4049 CompilationUnitElement unitElement = unit.element; |
| 4050 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 4015 // | 4051 // |
| 4016 // Resolve local variables. | 4052 // Resolve local variables. |
| 4017 // | 4053 // |
| 4018 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); | 4054 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 4019 Scope nameScope = new LibraryScope(libraryElement, errorListener); | 4055 Scope nameScope = new LibraryScope(libraryElement, errorListener); |
| 4020 AstVisitor visitor = new VariableResolverVisitor( | 4056 VariableResolverVisitor visitor = new VariableResolverVisitor( |
| 4021 libraryElement, unitElement.source, typeProvider, errorListener, | 4057 libraryElement, unitElement.source, typeProvider, errorListener, |
| 4022 nameScope: nameScope); | 4058 nameScope: nameScope); |
| 4023 unit.accept(visitor); | 4059 unit.accept(visitor); |
| 4024 // | 4060 // |
| 4025 // Record outputs. | 4061 // Record outputs. |
| 4026 // | 4062 // |
| 4027 outputs[RESOLVED_UNIT4] = unit; | 4063 outputs[RESOLVED_UNIT4] = unit; |
| 4028 outputs[VARIABLE_REFERENCE_ERRORS] = | 4064 outputs[VARIABLE_REFERENCE_ERRORS] = |
| 4029 removeDuplicateErrors(errorListener.errors); | 4065 removeDuplicateErrors(errorListener.errors); |
| 4030 } | 4066 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 4047 * Create a [ResolveVariableReferencesTask] based on the given [target] in | 4083 * Create a [ResolveVariableReferencesTask] based on the given [target] in |
| 4048 * the given [context]. | 4084 * the given [context]. |
| 4049 */ | 4085 */ |
| 4050 static ResolveVariableReferencesTask createTask( | 4086 static ResolveVariableReferencesTask createTask( |
| 4051 AnalysisContext context, AnalysisTarget target) { | 4087 AnalysisContext context, AnalysisTarget target) { |
| 4052 return new ResolveVariableReferencesTask(context, target); | 4088 return new ResolveVariableReferencesTask(context, target); |
| 4053 } | 4089 } |
| 4054 } | 4090 } |
| 4055 | 4091 |
| 4056 /** | 4092 /** |
| 4057 * A task that scans the content of a file, producing a set of Dart tokens. | 4093 * A task that scans the content of a Dart file, producing a stream of Dart |
| 4094 * tokens, line information, and any lexical errors encountered in the process. |
| 4058 */ | 4095 */ |
| 4059 class ScanDartTask extends SourceBasedAnalysisTask { | 4096 class ScanDartTask extends SourceBasedAnalysisTask { |
| 4060 /** | 4097 /** |
| 4061 * The name of the input whose value is the content of the file. | 4098 * The name of the input whose value is the content of the file. |
| 4062 */ | 4099 */ |
| 4063 static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME'; | 4100 static const String CONTENT_INPUT_NAME = 'CONTENT_INPUT_NAME'; |
| 4064 | 4101 |
| 4065 /** | 4102 /** |
| 4066 * The task descriptor describing this kind of task. | 4103 * The task descriptor describing this kind of task. |
| 4067 */ | 4104 */ |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4159 /** | 4196 /** |
| 4160 * Create a [ScanDartTask] based on the given [target] in the given [context]. | 4197 * Create a [ScanDartTask] based on the given [target] in the given [context]. |
| 4161 */ | 4198 */ |
| 4162 static ScanDartTask createTask( | 4199 static ScanDartTask createTask( |
| 4163 AnalysisContext context, AnalysisTarget target) { | 4200 AnalysisContext context, AnalysisTarget target) { |
| 4164 return new ScanDartTask(context, target); | 4201 return new ScanDartTask(context, target); |
| 4165 } | 4202 } |
| 4166 } | 4203 } |
| 4167 | 4204 |
| 4168 /** | 4205 /** |
| 4206 * A task that builds [STRONG_MODE_ERRORS] for a unit. Also builds |
| 4207 * [RESOLVED_UNIT] for a unit. |
| 4208 */ |
| 4209 class StrongModeVerifyUnitTask extends SourceBasedAnalysisTask { |
| 4210 /** |
| 4211 * The name of the [RESOLVED_UNIT10] input. |
| 4212 */ |
| 4213 static const String UNIT_INPUT = 'UNIT_INPUT'; |
| 4214 |
| 4215 /** |
| 4216 * The name of the [TYPE_PROVIDER] input. |
| 4217 */ |
| 4218 static const String TYPE_PROVIDER_INPUT = 'TYPE_PROVIDER_INPUT'; |
| 4219 |
| 4220 /** |
| 4221 * The task descriptor describing this kind of task. |
| 4222 */ |
| 4223 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( |
| 4224 'StrongModeVerifyUnitTask', |
| 4225 createTask, |
| 4226 buildInputs, |
| 4227 <ResultDescriptor>[STRONG_MODE_ERRORS, RESOLVED_UNIT]); |
| 4228 |
| 4229 StrongModeVerifyUnitTask( |
| 4230 InternalAnalysisContext context, AnalysisTarget target) |
| 4231 : super(context, target); |
| 4232 |
| 4233 @override |
| 4234 TaskDescriptor get descriptor => DESCRIPTOR; |
| 4235 |
| 4236 @override |
| 4237 void internalPerform() { |
| 4238 RecordingErrorListener errorListener = new RecordingErrorListener(); |
| 4239 // |
| 4240 // Prepare inputs. |
| 4241 // |
| 4242 TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT); |
| 4243 CompilationUnit unit = getRequiredInput(UNIT_INPUT); |
| 4244 if (context.analysisOptions.strongMode) { |
| 4245 unit.accept(new CodeChecker(new TypeRules(typeProvider), errorListener)); |
| 4246 } |
| 4247 |
| 4248 // |
| 4249 // Record outputs. |
| 4250 // |
| 4251 outputs[STRONG_MODE_ERRORS] = removeDuplicateErrors(errorListener.errors); |
| 4252 outputs[RESOLVED_UNIT] = unit; |
| 4253 } |
| 4254 |
| 4255 /** |
| 4256 * Return a map from the names of the inputs of this kind of task to the task |
| 4257 * input descriptors describing those inputs for a task with the |
| 4258 * given [target]. |
| 4259 */ |
| 4260 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { |
| 4261 LibrarySpecificUnit unit = target; |
| 4262 return <String, TaskInput>{ |
| 4263 'resolvedUnits': IMPORT_EXPORT_SOURCE_CLOSURE |
| 4264 .of(unit.library) |
| 4265 .toMapOf(UNITS) |
| 4266 .toFlattenList((Source library, Source unit) => |
| 4267 RESOLVED_UNIT10.of(new LibrarySpecificUnit(library, unit))), |
| 4268 UNIT_INPUT: RESOLVED_UNIT10.of(unit), |
| 4269 TYPE_PROVIDER_INPUT: TYPE_PROVIDER.of(AnalysisContextTarget.request) |
| 4270 }; |
| 4271 } |
| 4272 |
| 4273 /** |
| 4274 * Create a [StrongModeVerifyUnitTask] based on the given [target] in |
| 4275 * the given [context]. |
| 4276 */ |
| 4277 static StrongModeVerifyUnitTask createTask( |
| 4278 AnalysisContext context, AnalysisTarget target) { |
| 4279 return new StrongModeVerifyUnitTask(context, target); |
| 4280 } |
| 4281 } |
| 4282 |
| 4283 /** |
| 4169 * A task that builds [VERIFY_ERRORS] for a unit. | 4284 * A task that builds [VERIFY_ERRORS] for a unit. |
| 4170 */ | 4285 */ |
| 4171 class VerifyUnitTask extends SourceBasedAnalysisTask { | 4286 class VerifyUnitTask extends SourceBasedAnalysisTask { |
| 4172 /** | 4287 /** |
| 4173 * The name of the [RESOLVED_UNIT] input. | 4288 * The name of the [RESOLVED_UNIT] input. |
| 4174 */ | 4289 */ |
| 4175 static const String UNIT_INPUT = 'UNIT_INPUT'; | 4290 static const String UNIT_INPUT = 'UNIT_INPUT'; |
| 4176 | 4291 |
| 4177 /** | 4292 /** |
| 4178 * The name of the [TYPE_PROVIDER] input. | 4293 * The name of the [TYPE_PROVIDER] input. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4221 // | 4336 // |
| 4222 // Use the ErrorVerifier to compute errors. | 4337 // Use the ErrorVerifier to compute errors. |
| 4223 // | 4338 // |
| 4224 ErrorVerifier errorVerifier = new ErrorVerifier( | 4339 ErrorVerifier errorVerifier = new ErrorVerifier( |
| 4225 errorReporter, | 4340 errorReporter, |
| 4226 libraryElement, | 4341 libraryElement, |
| 4227 typeProvider, | 4342 typeProvider, |
| 4228 new InheritanceManager(libraryElement), | 4343 new InheritanceManager(libraryElement), |
| 4229 context.analysisOptions.enableSuperMixins); | 4344 context.analysisOptions.enableSuperMixins); |
| 4230 unit.accept(errorVerifier); | 4345 unit.accept(errorVerifier); |
| 4346 |
| 4231 // | 4347 // |
| 4232 // Record outputs. | 4348 // Record outputs. |
| 4233 // | 4349 // |
| 4234 outputs[VERIFY_ERRORS] = removeDuplicateErrors(errorListener.errors); | 4350 outputs[VERIFY_ERRORS] = removeDuplicateErrors(errorListener.errors); |
| 4235 } | 4351 } |
| 4236 | 4352 |
| 4237 /** | 4353 /** |
| 4238 * Check each directive in the given [unit] to see if the referenced source | 4354 * Check each directive in the given [unit] to see if the referenced source |
| 4239 * exists and report an error if it does not. | 4355 * exists and report an error if it does not. |
| 4240 */ | 4356 */ |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4412 | 4528 |
| 4413 @override | 4529 @override |
| 4414 bool moveNext() { | 4530 bool moveNext() { |
| 4415 if (_newSources.isEmpty) { | 4531 if (_newSources.isEmpty) { |
| 4416 return false; | 4532 return false; |
| 4417 } | 4533 } |
| 4418 currentTarget = _newSources.removeLast(); | 4534 currentTarget = _newSources.removeLast(); |
| 4419 return true; | 4535 return true; |
| 4420 } | 4536 } |
| 4421 } | 4537 } |
| OLD | NEW |