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.task.model; | 5 library analyzer.task.model; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import 'dart:developer'; | 8 import 'dart:developer'; |
9 | 9 |
10 import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask; | 10 import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 AnalysisContextTarget(this.context); | 53 AnalysisContextTarget(this.context); |
54 | 54 |
55 @override | 55 @override |
56 Source get source => null; | 56 Source get source => null; |
57 } | 57 } |
58 | 58 |
59 /** | 59 /** |
60 * An object with which an analysis result can be associated. | 60 * An object with which an analysis result can be associated. |
61 * | 61 * |
62 * Clients are allowed to subtype this class when creating new kinds of targets. | 62 * Clients may implement this class when creating new kinds of targets. |
63 * Instances of this type are used in hashed data structures, so subtypes are | 63 * Instances of this type are used in hashed data structures, so subtypes are |
64 * required to correctly implement [==] and [hashCode]. | 64 * required to correctly implement [==] and [hashCode]. |
65 */ | 65 */ |
66 abstract class AnalysisTarget { | 66 abstract class AnalysisTarget { |
67 /** | 67 /** |
68 * Return the source associated with this target, or `null` if this target is | 68 * Return the source associated with this target, or `null` if this target is |
69 * not associated with a source. | 69 * not associated with a source. |
70 */ | 70 */ |
71 Source get source; | 71 Source get source; |
72 } | 72 } |
73 | 73 |
74 /** | 74 /** |
75 * An object used to compute one or more analysis results associated with a | 75 * An object used to compute one or more analysis results associated with a |
76 * single target. | 76 * single target. |
77 * | 77 * |
78 * Clients are expected to extend this class when creating new tasks. | 78 * Clients must extend this class when creating new tasks. |
79 */ | 79 */ |
80 abstract class AnalysisTask { | 80 abstract class AnalysisTask { |
81 /** | 81 /** |
82 * A table mapping the types of analysis tasks to the number of times each | 82 * A table mapping the types of analysis tasks to the number of times each |
83 * kind of task has been performed. | 83 * kind of task has been performed. |
84 */ | 84 */ |
85 static final Map<Type, int> countMap = new HashMap<Type, int>(); | 85 static final Map<Type, int> countMap = new HashMap<Type, int>(); |
86 | 86 |
87 /** | 87 /** |
88 * A table mapping the types of analysis tasks to user tags used to collect | 88 * A table mapping the types of analysis tasks to user tags used to collect |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 * map (have a key/value pair for each result that this task is expected to | 191 * map (have a key/value pair for each result that this task is expected to |
192 * produce). | 192 * produce). |
193 */ | 193 */ |
194 void internalPerform(); | 194 void internalPerform(); |
195 | 195 |
196 /** | 196 /** |
197 * Perform this analysis task. When this method returns, either the [outputs] | 197 * Perform this analysis task. When this method returns, either the [outputs] |
198 * map should be fully populated (have a key/value pair for each result that | 198 * map should be fully populated (have a key/value pair for each result that |
199 * this task is expected to produce) or the [caughtException] should be set. | 199 * this task is expected to produce) or the [caughtException] should be set. |
200 * | 200 * |
201 * Clients should not override this method. | 201 * Clients may not override this method. |
202 */ | 202 */ |
203 void perform() { | 203 void perform() { |
204 try { | 204 try { |
205 _safelyPerform(); | 205 _safelyPerform(); |
206 } on AnalysisException catch (exception, stackTrace) { | 206 } on AnalysisException catch (exception, stackTrace) { |
207 caughtException = new CaughtException(exception, stackTrace); | 207 caughtException = new CaughtException(exception, stackTrace); |
208 AnalysisEngine.instance.logger | 208 AnalysisEngine.instance.logger |
209 .logInformation("Task failed: ${description}", caughtException); | 209 .logInformation("Task failed: ${description}", caughtException); |
210 } | 210 } |
211 } | 211 } |
212 | 212 |
213 @override | 213 @override |
214 String toString() => description; | 214 String toString() => description; |
215 | 215 |
216 /** | 216 /** |
217 * Perform this analysis task, ensuring that all exceptions are wrapped in an | 217 * Perform this analysis task, ensuring that all exceptions are wrapped in an |
218 * [AnalysisException]. | 218 * [AnalysisException]. |
219 * | 219 * |
220 * Clients should not override this method. | 220 * Clients may not override this method. |
221 */ | 221 */ |
222 void _safelyPerform() { | 222 void _safelyPerform() { |
223 try { | 223 try { |
224 // | 224 // |
225 // Report that this task is being performed. | 225 // Report that this task is being performed. |
226 // | 226 // |
227 String contextName = context.name; | 227 String contextName = context.name; |
228 if (contextName == null) { | 228 if (contextName == null) { |
229 contextName = 'unnamed'; | 229 contextName = 'unnamed'; |
230 } | 230 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 'Unexpected exception while performing $description', | 266 'Unexpected exception while performing $description', |
267 new CaughtException(exception, stackTrace)); | 267 new CaughtException(exception, stackTrace)); |
268 } | 268 } |
269 } | 269 } |
270 } | 270 } |
271 | 271 |
272 /** | 272 /** |
273 * A description of a [List]-based analysis result that can be computed by an | 273 * A description of a [List]-based analysis result that can be computed by an |
274 * [AnalysisTask]. | 274 * [AnalysisTask]. |
275 * | 275 * |
276 * Clients are not expected to subtype this class. | 276 * Clients may not extend, implement or mix-in this class. |
277 */ | 277 */ |
278 abstract class ListResultDescriptor<E> implements ResultDescriptor<List<E>> { | 278 abstract class ListResultDescriptor<E> implements ResultDescriptor<List<E>> { |
279 /** | 279 /** |
280 * Initialize a newly created analysis result to have the given [name] and | 280 * Initialize a newly created analysis result to have the given [name] and |
281 * [defaultValue]. If a [cachingPolicy] is provided, it will control how long | 281 * [defaultValue]. If a [cachingPolicy] is provided, it will control how long |
282 * values associated with this result will remain in the cache. | 282 * values associated with this result will remain in the cache. |
283 */ | 283 */ |
284 factory ListResultDescriptor(String name, List<E> defaultValue, | 284 factory ListResultDescriptor(String name, List<E> defaultValue, |
285 {ResultCachingPolicy<List<E>> cachingPolicy}) = ListResultDescriptorImpl< | 285 {ResultCachingPolicy<List<E>> cachingPolicy}) = ListResultDescriptorImpl< |
286 E>; | 286 E>; |
287 | 287 |
288 @override | 288 @override |
289 ListTaskInput<E> of(AnalysisTarget target, {bool flushOnAccess: false}); | 289 ListTaskInput<E> of(AnalysisTarget target, {bool flushOnAccess: false}); |
290 } | 290 } |
291 | 291 |
292 /** | 292 /** |
293 * A description of an input to an [AnalysisTask] that can be used to compute | 293 * A description of an input to an [AnalysisTask] that can be used to compute |
294 * that input. | 294 * that input. |
295 * | 295 * |
296 * Clients are not expected to subtype this class. | 296 * Clients may not extend, implement or mix-in this class. |
297 */ | 297 */ |
298 abstract class ListTaskInput<E> extends TaskInput<List<E>> { | 298 abstract class ListTaskInput<E> extends TaskInput<List<E>> { |
299 /** | 299 /** |
300 * Return a task input that can be used to compute a list whose elements are | 300 * Return a task input that can be used to compute a list whose elements are |
301 * the result of passing the elements of this input to the [mapper] function. | 301 * the result of passing the elements of this input to the [mapper] function. |
302 */ | 302 */ |
303 ListTaskInput /*<V>*/ toList(UnaryFunction<E, dynamic /*<V>*/ > mapper); | 303 ListTaskInput /*<V>*/ toList(UnaryFunction<E, dynamic /*<V>*/ > mapper); |
304 | 304 |
305 /** | 305 /** |
306 * Return a task input that can be used to compute a list whose elements are | 306 * Return a task input that can be used to compute a list whose elements are |
(...skipping 14 matching lines...) Expand all Loading... |
321 * elements of this input and whose values are the [valueResult]'s associated | 321 * elements of this input and whose values are the [valueResult]'s associated |
322 * with those elements. | 322 * with those elements. |
323 */ | 323 */ |
324 MapTaskInput<AnalysisTarget, dynamic /*V*/ > toMapOf( | 324 MapTaskInput<AnalysisTarget, dynamic /*V*/ > toMapOf( |
325 ResultDescriptor /*<V>*/ valueResult); | 325 ResultDescriptor /*<V>*/ valueResult); |
326 } | 326 } |
327 | 327 |
328 /** | 328 /** |
329 * A description of an input with a [Map] based values. | 329 * A description of an input with a [Map] based values. |
330 * | 330 * |
331 * Clients are not expected to subtype this class. | 331 * Clients may not extend, implement or mix-in this class. |
332 */ | 332 */ |
333 abstract class MapTaskInput<K, V> extends TaskInput<Map<K, V>> { | 333 abstract class MapTaskInput<K, V> extends TaskInput<Map<K, V>> { |
334 /** | 334 /** |
335 * [V] must be a [List]. | 335 * [V] must be a [List]. |
336 * Return a task input that can be used to compute a list whose elements are | 336 * Return a task input that can be used to compute a list whose elements are |
337 * the result of passing keys [K] and the corresponding elements of [V] to | 337 * the result of passing keys [K] and the corresponding elements of [V] to |
338 * the [mapper] function. | 338 * the [mapper] function. |
339 */ | 339 */ |
340 TaskInput<List /*<E>*/ > toFlattenList( | 340 TaskInput<List /*<E>*/ > toFlattenList( |
341 BinaryFunction<K, dynamic /*element of V*/, dynamic /*<E>*/ > mapper); | 341 BinaryFunction<K, dynamic /*element of V*/, dynamic /*<E>*/ > mapper); |
342 } | 342 } |
343 | 343 |
344 /** | 344 /** |
345 * A policy object that can compute sizes of results and provide the maximum | 345 * A policy object that can compute sizes of results and provide the maximum |
346 * active and idle sizes that can be kept in the cache. | 346 * active and idle sizes that can be kept in the cache. |
347 * | 347 * |
348 * All the [ResultDescriptor]s with the same [ResultCachingPolicy] instance | 348 * All the [ResultDescriptor]s with the same [ResultCachingPolicy] instance |
349 * share the same total size in a cache. | 349 * share the same total size in a cache. |
| 350 * |
| 351 * Clients may implement this class when implementing plugins. |
350 */ | 352 */ |
351 abstract class ResultCachingPolicy<T> { | 353 abstract class ResultCachingPolicy<T> { |
352 /** | 354 /** |
353 * Return the maximum total size of results that can be kept in the cache | 355 * Return the maximum total size of results that can be kept in the cache |
354 * while analysis is in progress. | 356 * while analysis is in progress. |
355 */ | 357 */ |
356 int get maxActiveSize; | 358 int get maxActiveSize; |
357 | 359 |
358 /** | 360 /** |
359 * Return the maximum total size of results that can be kept in the cache | 361 * Return the maximum total size of results that can be kept in the cache |
360 * while analysis is idle. | 362 * while analysis is idle. |
361 */ | 363 */ |
362 int get maxIdleSize; | 364 int get maxIdleSize; |
363 | 365 |
364 /** | 366 /** |
365 * Return the size of the given [object]. | 367 * Return the size of the given [object]. |
366 */ | 368 */ |
367 int measure(T object); | 369 int measure(T object); |
368 } | 370 } |
369 | 371 |
370 /** | 372 /** |
371 * A description of an analysis result that can be computed by an [AnalysisTask]
. | 373 * A description of an analysis result that can be computed by an [AnalysisTask]
. |
372 * | 374 * |
373 * Clients are not expected to subtype this class. | 375 * Clients may not extend, implement or mix-in this class. |
374 */ | 376 */ |
375 abstract class ResultDescriptor<V> { | 377 abstract class ResultDescriptor<V> { |
376 /** | 378 /** |
377 * Initialize a newly created analysis result to have the given [name] and | 379 * Initialize a newly created analysis result to have the given [name] and |
378 * [defaultValue]. | 380 * [defaultValue]. |
379 * | 381 * |
380 * The given [cachingPolicy] is used to limit the total size of results | 382 * The given [cachingPolicy] is used to limit the total size of results |
381 * described by this descriptor. If no policy is specified, the results are | 383 * described by this descriptor. If no policy is specified, the results are |
382 * never evicted from the cache, and removed only when they are invalidated. | 384 * never evicted from the cache, and removed only when they are invalidated. |
383 */ | 385 */ |
(...skipping 19 matching lines...) Expand all Loading... |
403 * Return a task input that can be used to compute this result for the given | 405 * Return a task input that can be used to compute this result for the given |
404 * [target]. If [flushOnAccess] is `true` then the value of this result that | 406 * [target]. If [flushOnAccess] is `true` then the value of this result that |
405 * is associated with the [target] will be flushed when it is accessed. | 407 * is associated with the [target] will be flushed when it is accessed. |
406 */ | 408 */ |
407 TaskInput<V> of(AnalysisTarget target, {bool flushOnAccess: false}); | 409 TaskInput<V> of(AnalysisTarget target, {bool flushOnAccess: false}); |
408 } | 410 } |
409 | 411 |
410 /** | 412 /** |
411 * A specification of the given [result] for the given [target]. | 413 * A specification of the given [result] for the given [target]. |
412 * | 414 * |
413 * Clients are not expected to subtype this class. | 415 * Clients may not extend, implement or mix-in this class. |
414 */ | 416 */ |
415 class TargetedResult { | 417 class TargetedResult { |
416 /** | 418 /** |
417 * An empty list of results. | 419 * An empty list of results. |
418 */ | 420 */ |
419 static final List<TargetedResult> EMPTY_LIST = const <TargetedResult>[]; | 421 static final List<TargetedResult> EMPTY_LIST = const <TargetedResult>[]; |
420 | 422 |
421 /** | 423 /** |
422 * The target with which the result is associated. | 424 * The target with which the result is associated. |
423 */ | 425 */ |
(...skipping 20 matching lines...) Expand all Loading... |
444 other.target == target && | 446 other.target == target && |
445 other.result == result; | 447 other.result == result; |
446 } | 448 } |
447 | 449 |
448 @override | 450 @override |
449 String toString() => '$result for $target'; | 451 String toString() => '$result for $target'; |
450 } | 452 } |
451 | 453 |
452 /** | 454 /** |
453 * A description of an [AnalysisTask]. | 455 * A description of an [AnalysisTask]. |
| 456 * |
| 457 * Clients may not extend, implement or mix-in this class. |
454 */ | 458 */ |
455 abstract class TaskDescriptor { | 459 abstract class TaskDescriptor { |
456 /** | 460 /** |
457 * Initialize a newly created task descriptor to have the given [name] and to | 461 * Initialize a newly created task descriptor to have the given [name] and to |
458 * describe a task that takes the inputs built using the given [inputBuilder], | 462 * describe a task that takes the inputs built using the given [inputBuilder], |
459 * and produces the given [results]. The [buildTask] will be used to create | 463 * and produces the given [results]. The [buildTask] will be used to create |
460 * the instance of [AnalysisTask] thusly described. | 464 * the instance of [AnalysisTask] thusly described. |
461 */ | 465 */ |
462 factory TaskDescriptor( | 466 factory TaskDescriptor( |
463 String name, | 467 String name, |
(...skipping 21 matching lines...) Expand all Loading... |
485 * used to compute results based on the given [inputs]. | 489 * used to compute results based on the given [inputs]. |
486 */ | 490 */ |
487 AnalysisTask createTask(AnalysisContext context, AnalysisTarget target, | 491 AnalysisTask createTask(AnalysisContext context, AnalysisTarget target, |
488 Map<String, dynamic> inputs); | 492 Map<String, dynamic> inputs); |
489 } | 493 } |
490 | 494 |
491 /** | 495 /** |
492 * A description of an input to an [AnalysisTask] that can be used to compute | 496 * A description of an input to an [AnalysisTask] that can be used to compute |
493 * that input. | 497 * that input. |
494 * | 498 * |
495 * Clients are not expected to subtype this class. | 499 * Clients may not extend, implement or mix-in this class. |
496 */ | 500 */ |
497 abstract class TaskInput<V> { | 501 abstract class TaskInput<V> { |
498 /** | 502 /** |
499 * Create and return a builder that can be used to build this task input. | 503 * Create and return a builder that can be used to build this task input. |
500 */ | 504 */ |
501 TaskInputBuilder<V> createBuilder(); | 505 TaskInputBuilder<V> createBuilder(); |
502 | 506 |
503 /** | 507 /** |
504 * Return a task input that can be used to compute a list whose elements are | 508 * Return a task input that can be used to compute a list whose elements are |
505 * the result of passing the result of this input to the [mapper] function. | 509 * the result of passing the result of this input to the [mapper] function. |
506 */ | 510 */ |
507 ListTaskInput /*<E>*/ mappedToList(List /*<E>*/ mapper(V value)); | 511 ListTaskInput /*<E>*/ mappedToList(List /*<E>*/ mapper(V value)); |
508 } | 512 } |
509 | 513 |
510 /** | 514 /** |
511 * An object used to build the value associated with a single [TaskInput]. | 515 * An object used to build the value associated with a single [TaskInput]. |
512 * | 516 * |
513 * All builders work by requesting one or more results (each result being | 517 * All builders work by requesting one or more results (each result being |
514 * associated with a target). The interaction pattern is modeled after the class | 518 * associated with a target). The interaction pattern is modeled after the class |
515 * [Iterator], in which the method [moveNext] is invoked to move from one result | 519 * [Iterator], in which the method [moveNext] is invoked to move from one result |
516 * request to the next. The getters [currentResult] and [currentTarget] are used | 520 * request to the next. The getters [currentResult] and [currentTarget] are used |
517 * to get the result and target of the current request. The value of the result | 521 * to get the result and target of the current request. The value of the result |
518 * must be supplied using the [currentValue] setter before [moveNext] can be | 522 * must be supplied using the [currentValue] setter before [moveNext] can be |
519 * invoked to move to the next request. When [moveNext] returns `false`, | 523 * invoked to move to the next request. When [moveNext] returns `false`, |
520 * indicating that there are no more requests, the method [inputValue] can be | 524 * indicating that there are no more requests, the method [inputValue] can be |
521 * used to access the value of the input that was built. | 525 * used to access the value of the input that was built. |
522 * | 526 * |
523 * Clients are not expected to subtype this class. | 527 * Clients may not extend, implement or mix-in this class. |
524 */ | 528 */ |
525 abstract class TaskInputBuilder<V> { | 529 abstract class TaskInputBuilder<V> { |
526 /** | 530 /** |
527 * Return the result that needs to be computed, or `null` if [moveNext] has | 531 * Return the result that needs to be computed, or `null` if [moveNext] has |
528 * not been invoked or if the last invocation of [moveNext] returned `false`. | 532 * not been invoked or if the last invocation of [moveNext] returned `false`. |
529 */ | 533 */ |
530 ResultDescriptor get currentResult; | 534 ResultDescriptor get currentResult; |
531 | 535 |
532 /** | 536 /** |
533 * Return the target for which the result needs to be computed, or `null` if | 537 * Return the target for which the result needs to be computed, or `null` if |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 * provided using [currentValue]. | 585 * provided using [currentValue]. |
582 */ | 586 */ |
583 bool moveNext(); | 587 bool moveNext(); |
584 } | 588 } |
585 | 589 |
586 /** | 590 /** |
587 * [WorkManager]s are used to drive analysis. | 591 * [WorkManager]s are used to drive analysis. |
588 * | 592 * |
589 * They know specific of the targets and results they care about, | 593 * They know specific of the targets and results they care about, |
590 * so they can request analysis results in optimal order. | 594 * so they can request analysis results in optimal order. |
| 595 * |
| 596 * Clients may implement this class when implementing plugins. |
591 */ | 597 */ |
592 abstract class WorkManager { | 598 abstract class WorkManager { |
593 /** | 599 /** |
594 * Notifies the manager about changes in the explicit source list. | 600 * Notifies the manager about changes in the explicit source list. |
595 */ | 601 */ |
596 void applyChange(List<Source> addedSources, List<Source> changedSources, | 602 void applyChange(List<Source> addedSources, List<Source> changedSources, |
597 List<Source> removedSources); | 603 List<Source> removedSources); |
598 | 604 |
599 /** | 605 /** |
600 * Notifies the managers that the given set of priority [targets] was set. | 606 * Notifies the managers that the given set of priority [targets] was set. |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 /** | 673 /** |
668 * A work should be done, but without any special urgency. | 674 * A work should be done, but without any special urgency. |
669 */ | 675 */ |
670 NORMAL, | 676 NORMAL, |
671 | 677 |
672 /** | 678 /** |
673 * Nothing to do. | 679 * Nothing to do. |
674 */ | 680 */ |
675 NONE | 681 NONE |
676 } | 682 } |
OLD | NEW |