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.driver; | 5 library analyzer.src.task.driver; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 | 9 |
10 import 'package:analyzer/src/context/cache.dart'; | 10 import 'package:analyzer/src/context/cache.dart'; |
11 import 'package:analyzer/src/generated/engine.dart' | 11 import 'package:analyzer/src/generated/engine.dart' |
12 hide AnalysisTask, AnalysisContextImpl; | 12 hide AnalysisTask, AnalysisContextImpl; |
13 import 'package:analyzer/src/generated/java_engine.dart'; | 13 import 'package:analyzer/src/generated/java_engine.dart'; |
14 import 'package:analyzer/src/generated/resolver.dart'; | 14 import 'package:analyzer/src/generated/resolver.dart'; |
15 import 'package:analyzer/src/generated/utilities_general.dart'; | 15 import 'package:analyzer/src/generated/utilities_general.dart'; |
16 import 'package:analyzer/src/task/inputs.dart'; | 16 import 'package:analyzer/src/task/inputs.dart'; |
17 import 'package:analyzer/src/task/manager.dart'; | 17 import 'package:analyzer/src/task/manager.dart'; |
18 import 'package:analyzer/task/model.dart'; | 18 import 'package:analyzer/task/model.dart'; |
19 | 19 |
| 20 final PerformanceTag workOrderMoveNextPerfTag = |
| 21 new PerformanceTag('WorkOrder.moveNext'); |
| 22 |
20 /** | 23 /** |
21 * An object that is used to cause analysis to be performed until all of the | 24 * An object that is used to cause analysis to be performed until all of the |
22 * required analysis information has been computed. | 25 * required analysis information has been computed. |
23 */ | 26 */ |
24 class AnalysisDriver { | 27 class AnalysisDriver { |
25 /** | 28 /** |
26 * The task manager used to figure out how to compute analysis results. | 29 * The task manager used to figure out how to compute analysis results. |
27 */ | 30 */ |
28 final TaskManager taskManager; | 31 final TaskManager taskManager; |
29 | 32 |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 WorkItem get current { | 712 WorkItem get current { |
710 if (currentItems == null) { | 713 if (currentItems == null) { |
711 return null; | 714 return null; |
712 } else { | 715 } else { |
713 return currentItems.last; | 716 return currentItems.last; |
714 } | 717 } |
715 } | 718 } |
716 | 719 |
717 @override | 720 @override |
718 bool moveNext() { | 721 bool moveNext() { |
719 if (currentItems != null && currentItems.length > 1) { | 722 return workOrderMoveNextPerfTag.makeCurrentWhile(() { |
720 // Yield more items. | 723 if (currentItems != null && currentItems.length > 1) { |
721 currentItems.removeLast(); | 724 // Yield more items. |
722 return true; | 725 currentItems.removeLast(); |
723 } else { | 726 return true; |
724 // Get a new strongly connected component. | 727 } else { |
725 StronglyConnectedComponent<WorkItem> nextStronglyConnectedComponent = | 728 // Get a new strongly connected component. |
726 _dependencyWalker.getNextStronglyConnectedComponent(); | 729 StronglyConnectedComponent<WorkItem> nextStronglyConnectedComponent = |
727 if (nextStronglyConnectedComponent == null) { | 730 _dependencyWalker.getNextStronglyConnectedComponent(); |
728 currentItems = null; | 731 if (nextStronglyConnectedComponent == null) { |
729 return false; | 732 currentItems = null; |
| 733 return false; |
| 734 } |
| 735 currentItems = nextStronglyConnectedComponent.nodes; |
| 736 if (nextStronglyConnectedComponent.containsCycle) { |
| 737 // A cycle has been found. |
| 738 for (WorkItem item in currentItems) { |
| 739 item.dependencyCycle = currentItems.toList(); |
| 740 } |
| 741 } else { |
| 742 assert(currentItems.length == 1); |
| 743 } |
| 744 return true; |
730 } | 745 } |
731 currentItems = nextStronglyConnectedComponent.nodes; | 746 }); |
732 if (nextStronglyConnectedComponent.containsCycle) { | |
733 // A cycle has been found. | |
734 for (WorkItem item in currentItems) { | |
735 item.dependencyCycle = currentItems.toList(); | |
736 } | |
737 } else { | |
738 assert(currentItems.length == 1); | |
739 } | |
740 return true; | |
741 } | |
742 } | 747 } |
743 } | 748 } |
744 | 749 |
745 /** | 750 /** |
746 * The priorities of work orders returned by [WorkManager]s. | 751 * The priorities of work orders returned by [WorkManager]s. |
747 */ | 752 */ |
748 enum WorkOrderPriority { | 753 enum WorkOrderPriority { |
749 /** | 754 /** |
750 * Responding to an user's action. | 755 * Responding to an user's action. |
751 */ | 756 */ |
(...skipping 25 matching lines...) Expand all Loading... |
777 final TaskManager taskManager; | 782 final TaskManager taskManager; |
778 | 783 |
779 _WorkOrderDependencyWalker(this.taskManager, WorkItem startingNode) | 784 _WorkOrderDependencyWalker(this.taskManager, WorkItem startingNode) |
780 : super(startingNode); | 785 : super(startingNode); |
781 | 786 |
782 @override | 787 @override |
783 WorkItem getNextInput(WorkItem node, List<WorkItem> skipInputs) { | 788 WorkItem getNextInput(WorkItem node, List<WorkItem> skipInputs) { |
784 return node.gatherInputs(taskManager, skipInputs); | 789 return node.gatherInputs(taskManager, skipInputs); |
785 } | 790 } |
786 } | 791 } |
OLD | NEW |