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

Side by Side Diff: pkg/analyzer/lib/src/task/dart.dart

Issue 1468293003: Ensure that a complete library element has constants evaluated (issue 24890) (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 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 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 * 301 *
302 * [LIBRARY_ELEMENT6] for the library and its import/export closure. 302 * [LIBRARY_ELEMENT6] for the library and its import/export closure.
303 * 303 *
304 * The result is only available for [Source]s representing a library. 304 * The result is only available for [Source]s representing a library.
305 */ 305 */
306 final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT7 = 306 final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT7 =
307 new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT7', null, 307 new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT7', null,
308 cachingPolicy: ELEMENT_CACHING_POLICY); 308 cachingPolicy: ELEMENT_CACHING_POLICY);
309 309
310 /** 310 /**
311 * The partial [LibraryElement] associated with a library.
312 *
313 * [LIBRARY_ELEMENT7] for the library for which references have been computed.
314 *
315 * The result is only available for [Source]s representing a library.
316 */
317 final ResultDescriptor<LibraryElement> LIBRARY_ELEMENT8 =
318 new ResultDescriptor<LibraryElement>('LIBRARY_ELEMENT8', null,
319 cachingPolicy: ELEMENT_CACHING_POLICY);
320
321 /**
311 * The flag specifying whether all analysis errors are computed in a specific 322 * The flag specifying whether all analysis errors are computed in a specific
312 * library. 323 * library.
313 * 324 *
314 * The result is only available for [Source]s representing a library. 325 * The result is only available for [Source]s representing a library.
315 */ 326 */
316 final ResultDescriptor<bool> LIBRARY_ERRORS_READY = 327 final ResultDescriptor<bool> LIBRARY_ERRORS_READY =
317 new ResultDescriptor<bool>('LIBRARY_ERRORS_READY', false); 328 new ResultDescriptor<bool>('LIBRARY_ERRORS_READY', false);
318 329
319 /** 330 /**
320 * The [LibrarySpecificUnit]s that a library consists of. 331 * The [LibrarySpecificUnit]s that a library consists of.
(...skipping 2079 matching lines...) Expand 10 before | Expand all | Expand 10 after
2400 } 2411 }
2401 2412
2402 /** 2413 /**
2403 * Return a map from the names of the inputs of this kind of task to the task 2414 * Return a map from the names of the inputs of this kind of task to the task
2404 * input descriptors describing those inputs for a task with the 2415 * input descriptors describing those inputs for a task with the
2405 * given [target]. 2416 * given [target].
2406 */ 2417 */
2407 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 2418 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
2408 LibrarySpecificUnit unit = target; 2419 LibrarySpecificUnit unit = target;
2409 return <String, TaskInput>{ 2420 return <String, TaskInput>{
2410 'libraryElement': LIBRARY_ELEMENT.of(unit.library), 2421 'libraryElement': LIBRARY_ELEMENT8.of(unit.library),
2411 UNIT_INPUT: RESOLVED_UNIT10.of(unit), 2422 UNIT_INPUT: RESOLVED_UNIT10.of(unit),
2412 CONSTANT_VALUES: 2423 CONSTANT_VALUES:
2413 COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE) 2424 COMPILATION_UNIT_CONSTANTS.of(unit).toListOf(CONSTANT_VALUE)
2414 }; 2425 };
2415 } 2426 }
2416 2427
2417 /** 2428 /**
2418 * Create an [EvaluateUnitConstantsTask] based on the given [target] in 2429 * Create an [EvaluateUnitConstantsTask] based on the given [target] in
2419 * the given [context]. 2430 * the given [context].
2420 */ 2431 */
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
3210 } 3221 }
3211 3222
3212 /** 3223 /**
3213 * Return a map from the names of the inputs of this kind of task to the task 3224 * Return a map from the names of the inputs of this kind of task to the task
3214 * input descriptors describing those inputs for a task with the 3225 * input descriptors describing those inputs for a task with the
3215 * given [target]. 3226 * given [target].
3216 */ 3227 */
3217 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 3228 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
3218 Source source = target; 3229 Source source = target;
3219 return <String, TaskInput>{ 3230 return <String, TaskInput>{
3220 'allErrors': UNITS.of(source).toListOf(DART_ERRORS) 3231 'allErrors': UNITS.of(source).toListOf(DART_ERRORS),
3232 'libraryElement': LIBRARY_ELEMENT.of(source)
3221 }; 3233 };
3222 } 3234 }
3223 3235
3224 /** 3236 /**
3225 * Create a [LibraryErrorsReadyTask] based on the given [target] in the given 3237 * Create a [LibraryErrorsReadyTask] based on the given [target] in the given
3226 * [context]. 3238 * [context].
3227 */ 3239 */
3228 static LibraryErrorsReadyTask createTask( 3240 static LibraryErrorsReadyTask createTask(
3229 AnalysisContext context, AnalysisTarget target) { 3241 AnalysisContext context, AnalysisTarget target) {
3230 return new LibraryErrorsReadyTask(context, target); 3242 return new LibraryErrorsReadyTask(context, target);
(...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after
4446 return new ResolveInstanceFieldsInUnitTask(context, target); 4458 return new ResolveInstanceFieldsInUnitTask(context, target);
4447 } 4459 }
4448 } 4460 }
4449 4461
4450 /** 4462 /**
4451 * A task that finishes resolution by requesting [RESOLVED_UNIT10] for every 4463 * A task that finishes resolution by requesting [RESOLVED_UNIT10] for every
4452 * unit in the libraries closure and produces [LIBRARY_ELEMENT]. 4464 * unit in the libraries closure and produces [LIBRARY_ELEMENT].
4453 */ 4465 */
4454 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask { 4466 class ResolveLibraryReferencesTask extends SourceBasedAnalysisTask {
4455 /** 4467 /**
4456 * The name of the [LIBRARY_ELEMENT5] input. 4468 * The name of the [LIBRARY_ELEMENT7] input.
4457 */ 4469 */
4458 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; 4470 static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
4459 4471
4460 /** 4472 /**
4461 * The name of the list of [RESOLVED_UNIT10] input. 4473 * The name of the list of [RESOLVED_UNIT10] input.
4462 */ 4474 */
4463 static const String UNITS_INPUT = 'UNITS_INPUT'; 4475 static const String UNITS_INPUT = 'UNITS_INPUT';
4464 4476
4465 /** 4477 /**
4466 * The task descriptor describing this kind of task. 4478 * The task descriptor describing this kind of task.
4467 */ 4479 */
4468 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor( 4480 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
4469 'ResolveLibraryReferencesTask', 4481 'ResolveLibraryReferencesTask',
4470 createTask, 4482 createTask,
4471 buildInputs, 4483 buildInputs,
4472 <ResultDescriptor>[LIBRARY_ELEMENT, REFERENCED_NAMES]); 4484 <ResultDescriptor>[LIBRARY_ELEMENT8, REFERENCED_NAMES]);
4473 4485
4474 ResolveLibraryReferencesTask( 4486 ResolveLibraryReferencesTask(
4475 InternalAnalysisContext context, AnalysisTarget target) 4487 InternalAnalysisContext context, AnalysisTarget target)
4476 : super(context, target); 4488 : super(context, target);
4477 4489
4478 @override 4490 @override
4479 TaskDescriptor get descriptor => DESCRIPTOR; 4491 TaskDescriptor get descriptor => DESCRIPTOR;
4480 4492
4481 @override 4493 @override
4482 void internalPerform() { 4494 void internalPerform() {
4483 // 4495 //
4484 // Prepare inputs. 4496 // Prepare inputs.
4485 // 4497 //
4486 LibraryElement library = getRequiredInput(LIBRARY_INPUT); 4498 LibraryElement library = getRequiredInput(LIBRARY_INPUT);
4487 List<CompilationUnit> units = getRequiredInput(UNITS_INPUT); 4499 List<CompilationUnit> units = getRequiredInput(UNITS_INPUT);
4488 // Compute referenced names. 4500 // Compute referenced names.
4489 ReferencedNames referencedNames = new ReferencedNames(); 4501 ReferencedNames referencedNames = new ReferencedNames();
4490 for (CompilationUnit unit in units) { 4502 for (CompilationUnit unit in units) {
4491 new ReferencedNamesBuilder(referencedNames).build(unit); 4503 new ReferencedNamesBuilder(referencedNames).build(unit);
4492 } 4504 }
4493 // 4505 //
4494 // Record outputs. 4506 // Record outputs.
4495 // 4507 //
4496 outputs[LIBRARY_ELEMENT] = library; 4508 outputs[LIBRARY_ELEMENT8] = library;
4497 outputs[REFERENCED_NAMES] = referencedNames; 4509 outputs[REFERENCED_NAMES] = referencedNames;
4498 } 4510 }
4499 4511
4500 /** 4512 /**
4501 * Return a map from the names of the inputs of this kind of task to the task 4513 * Return a map from the names of the inputs of this kind of task to the task
4502 * input descriptors describing those inputs for a task with the 4514 * input descriptors describing those inputs for a task with the
4503 * given [target]. 4515 * given [target].
4504 */ 4516 */
4505 static Map<String, TaskInput> buildInputs(AnalysisTarget target) { 4517 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
4506 Source source = target; 4518 Source source = target;
4507 return <String, TaskInput>{ 4519 return <String, TaskInput>{
4508 LIBRARY_INPUT: LIBRARY_ELEMENT5.of(source), 4520 LIBRARY_INPUT: LIBRARY_ELEMENT7.of(source),
4509 UNITS_INPUT: LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT10), 4521 UNITS_INPUT: LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT10),
4510 'thisLibraryClosureIsReady': READY_RESOLVED_UNIT10.of(source), 4522 'thisLibraryClosureIsReady': READY_RESOLVED_UNIT10.of(source),
4511 }; 4523 };
4512 } 4524 }
4513 4525
4514 /** 4526 /**
4515 * Create a [ResolveLibraryReferencesTask] based on the given [target] in 4527 * Create a [ResolveLibraryReferencesTask] based on the given [target] in
4516 * the given [context]. 4528 * the given [context].
4517 */ 4529 */
4518 static ResolveLibraryReferencesTask createTask( 4530 static ResolveLibraryReferencesTask createTask(
4519 AnalysisContext context, AnalysisTarget target) { 4531 AnalysisContext context, AnalysisTarget target) {
4520 return new ResolveLibraryReferencesTask(context, target); 4532 return new ResolveLibraryReferencesTask(context, target);
4521 } 4533 }
4522 } 4534 }
4523 4535
4524 /** 4536 /**
4537 * A task that finishes resolution by requesting [RESOLVED_UNIT11] for every
4538 * unit in the libraries closure and produces [LIBRARY_ELEMENT].
4539 */
4540 class ResolveLibraryTask extends SourceBasedAnalysisTask {
4541 /**
4542 * The name of the [LIBRARY_ELEMENT8] input.
4543 */
4544 static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
4545
4546 /**
4547 * The name of the list of [RESOLVED_UNIT11] input.
4548 */
4549 static const String UNITS_INPUT = 'UNITS_INPUT';
4550
4551 /**
4552 * The task descriptor describing this kind of task.
4553 */
4554 static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
4555 'ResolveLibraryTask',
4556 createTask,
4557 buildInputs,
4558 <ResultDescriptor>[LIBRARY_ELEMENT]);
4559
4560 ResolveLibraryTask(InternalAnalysisContext context, AnalysisTarget target)
4561 : super(context, target);
4562
4563 @override
4564 TaskDescriptor get descriptor => DESCRIPTOR;
4565
4566 @override
4567 void internalPerform() {
4568 //
4569 // Prepare inputs.
4570 //
4571 LibraryElement library = getRequiredInput(LIBRARY_INPUT);
4572 //
4573 // Record outputs.
4574 //
4575 outputs[LIBRARY_ELEMENT] = library;
4576 }
4577
4578 /**
4579 * Return a map from the names of the inputs of this kind of task to the task
4580 * input descriptors describing those inputs for a task with the
4581 * given [target].
4582 */
4583 static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
4584 Source source = target;
4585 return <String, TaskInput>{
4586 LIBRARY_INPUT: LIBRARY_ELEMENT8.of(source),
4587 UNITS_INPUT: LIBRARY_SPECIFIC_UNITS.of(source).toListOf(RESOLVED_UNIT11),
scheglov 2015/11/24 22:17:23 This input is not used.
Brian Wilkerson 2015/11/25 14:44:41 Removed
4588 'thisLibraryClosureIsReady': READY_RESOLVED_UNIT.of(source),
4589 };
4590 }
4591
4592 /**
4593 * Create a [ResolveLibraryTask] based on the given [target] in the given
4594 * [context].
4595 */
4596 static ResolveLibraryTask createTask(
4597 AnalysisContext context, AnalysisTarget target) {
4598 return new ResolveLibraryTask(context, target);
4599 }
4600 }
4601
4602 /**
4525 * An artificial task that does nothing except to force type names resolution 4603 * An artificial task that does nothing except to force type names resolution
4526 * for the defining and part units of a library. 4604 * for the defining and part units of a library.
4527 */ 4605 */
4528 class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask { 4606 class ResolveLibraryTypeNamesTask extends SourceBasedAnalysisTask {
4529 /** 4607 /**
4530 * The name of the [LIBRARY_ELEMENT4] input. 4608 * The name of the [LIBRARY_ELEMENT4] input.
4531 */ 4609 */
4532 static const String LIBRARY_INPUT = 'LIBRARY_INPUT'; 4610 static const String LIBRARY_INPUT = 'LIBRARY_INPUT';
4533 4611
4534 /** 4612 /**
(...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after
5273 5351
5274 @override 5352 @override
5275 bool moveNext() { 5353 bool moveNext() {
5276 if (_newSources.isEmpty) { 5354 if (_newSources.isEmpty) {
5277 return false; 5355 return false;
5278 } 5356 }
5279 currentTarget = _newSources.removeLast(); 5357 currentTarget = _newSources.removeLast();
5280 return true; 5358 return true;
5281 } 5359 }
5282 } 5360 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/plugin/engine_plugin.dart ('k') | pkg/analyzer/test/src/context/context_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698