OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library engine; | 5 library engine; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 import 'dart:math' as math; | 9 import 'dart:math' as math; |
10 | 10 |
(...skipping 5907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5918 */ | 5918 */ |
5919 final OptionsPlugin optionsPlugin = new OptionsPlugin(); | 5919 final OptionsPlugin optionsPlugin = new OptionsPlugin(); |
5920 | 5920 |
5921 /** | 5921 /** |
5922 * The instrumentation service that is to be used by this analysis engine. | 5922 * The instrumentation service that is to be used by this analysis engine. |
5923 */ | 5923 */ |
5924 InstrumentationService _instrumentationService = | 5924 InstrumentationService _instrumentationService = |
5925 InstrumentationService.NULL_SERVICE; | 5925 InstrumentationService.NULL_SERVICE; |
5926 | 5926 |
5927 /** | 5927 /** |
5928 * The list of supported plugins for processing by clients. | |
5929 */ | |
5930 List<Plugin> _supportedPlugins; | |
5931 | |
5932 /** | |
5933 * The partition manager being used to manage the shared partitions. | 5928 * The partition manager being used to manage the shared partitions. |
5934 */ | 5929 */ |
5935 final PartitionManager partitionManager = new PartitionManager(); | 5930 final PartitionManager partitionManager = new PartitionManager(); |
5936 | 5931 |
5937 /** | 5932 /** |
5938 * The partition manager being used to manage the shared partitions. | 5933 * The partition manager being used to manage the shared partitions. |
5939 */ | 5934 */ |
5940 final newContext.PartitionManager partitionManager_new = | 5935 final newContext.PartitionManager partitionManager_new = |
5941 new newContext.PartitionManager(); | 5936 new newContext.PartitionManager(); |
5942 | 5937 |
5943 /** | 5938 /** |
5944 * A flag indicating whether the (new) task model should be used to perform | 5939 * A flag indicating whether the (new) task model should be used to perform |
5945 * analysis. | 5940 * analysis. |
5946 */ | 5941 */ |
5947 bool useTaskModel = true; | 5942 bool useTaskModel = true; |
5948 | 5943 |
5949 /** | 5944 /** |
5950 * A flag indicating whether the task model should attempt to limit | 5945 * A flag indicating whether the task model should attempt to limit |
5951 * invalidation after a change. | 5946 * invalidation after a change. |
5952 */ | 5947 */ |
5953 bool limitInvalidationInTaskModel = false; | 5948 bool limitInvalidationInTaskModel = false; |
5954 | 5949 |
5955 /** | 5950 /** |
5956 * The plugins that are defined outside the `analyzer` package. | |
5957 */ | |
5958 List<Plugin> _userDefinedPlugins = <Plugin>[]; | |
5959 | |
5960 /** | |
5961 * The task manager used to manage the tasks used to analyze code. | 5951 * The task manager used to manage the tasks used to analyze code. |
5962 */ | 5952 */ |
5963 TaskManager _taskManager; | 5953 TaskManager _taskManager; |
5964 | 5954 |
5965 AnalysisEngine._(); | 5955 AnalysisEngine._(); |
5966 | 5956 |
5967 /** | 5957 /** |
5968 * Return the instrumentation service that is to be used by this analysis | 5958 * Return the instrumentation service that is to be used by this analysis |
5969 * engine. | 5959 * engine. |
5970 */ | 5960 */ |
(...skipping 19 matching lines...) Expand all Loading... |
5990 | 5980 |
5991 /** | 5981 /** |
5992 * Set the logger that should receive information about errors within the | 5982 * Set the logger that should receive information about errors within the |
5993 * analysis engine to the given [logger]. | 5983 * analysis engine to the given [logger]. |
5994 */ | 5984 */ |
5995 void set logger(Logger logger) { | 5985 void set logger(Logger logger) { |
5996 this._logger = logger == null ? Logger.NULL : logger; | 5986 this._logger = logger == null ? Logger.NULL : logger; |
5997 } | 5987 } |
5998 | 5988 |
5999 /** | 5989 /** |
6000 * Return the list of supported plugins for processing by clients. | 5990 * Return the list of plugins that clients are required to process, either by |
| 5991 * creating an [ExtensionManager] or by using the method |
| 5992 * [processRequiredPlugins]. |
6001 */ | 5993 */ |
6002 List<Plugin> get supportedPlugins { | 5994 List<Plugin> get requiredPlugins => <Plugin>[enginePlugin]; |
6003 if (_supportedPlugins == null) { | |
6004 _supportedPlugins = <Plugin>[ | |
6005 enginePlugin, | |
6006 commandLinePlugin, | |
6007 optionsPlugin | |
6008 ]; | |
6009 _supportedPlugins.addAll(_userDefinedPlugins); | |
6010 } | |
6011 return _supportedPlugins; | |
6012 } | |
6013 | 5995 |
6014 /** | 5996 /** |
6015 * Return the task manager used to manage the tasks used to analyze code. | 5997 * Return the task manager used to manage the tasks used to analyze code. |
6016 */ | 5998 */ |
6017 TaskManager get taskManager { | 5999 TaskManager get taskManager { |
6018 if (_taskManager == null) { | 6000 if (_taskManager == null) { |
6019 new ExtensionManager().processPlugins(supportedPlugins); | 6001 if (enginePlugin.taskExtensionPoint == null) { |
| 6002 throw new IllegalStateException( |
| 6003 'The analysis engine plugin has not been registered'); |
| 6004 } |
6020 _taskManager = new TaskManager(); | 6005 _taskManager = new TaskManager(); |
6021 _taskManager.addTaskDescriptors(enginePlugin.taskDescriptors); | 6006 _taskManager.addTaskDescriptors(enginePlugin.taskDescriptors); |
6022 // TODO(brianwilkerson) Create a way to associate different results with | 6007 // TODO(brianwilkerson) Create a way to associate different results with |
6023 // different file suffixes, then make this pluggable. | 6008 // different file suffixes, then make this pluggable. |
6024 _taskManager.addGeneralResult(DART_ERRORS); | 6009 _taskManager.addGeneralResult(DART_ERRORS); |
6025 } | 6010 } |
6026 return _taskManager; | 6011 return _taskManager; |
6027 } | 6012 } |
6028 | 6013 |
6029 /** | 6014 /** |
6030 * Set plugins that are defined outside the `analyzer` package. | |
6031 */ | |
6032 void set userDefinedPlugins(List<Plugin> plugins) { | |
6033 if (plugins == null) { | |
6034 plugins = <Plugin>[]; | |
6035 } | |
6036 _userDefinedPlugins = plugins; | |
6037 _supportedPlugins = null; | |
6038 _taskManager = null; | |
6039 } | |
6040 | |
6041 /** | |
6042 * Clear any caches holding on to analysis results so that a full re-analysis | 6015 * Clear any caches holding on to analysis results so that a full re-analysis |
6043 * will be performed the next time an analysis context is created. | 6016 * will be performed the next time an analysis context is created. |
6044 */ | 6017 */ |
6045 void clearCaches() { | 6018 void clearCaches() { |
6046 partitionManager.clearCache(); | 6019 partitionManager.clearCache(); |
6047 } | 6020 } |
6048 | 6021 |
6049 /** | 6022 /** |
6050 * Create and return a new context in which analysis can be performed. | 6023 * Create and return a new context in which analysis can be performed. |
6051 */ | 6024 */ |
6052 AnalysisContext createAnalysisContext() { | 6025 AnalysisContext createAnalysisContext() { |
6053 if (useTaskModel) { | 6026 if (useTaskModel) { |
6054 return new newContext.AnalysisContextImpl(); | 6027 return new newContext.AnalysisContextImpl(); |
6055 } | 6028 } |
6056 return new AnalysisContextImpl(); | 6029 return new AnalysisContextImpl(); |
6057 } | 6030 } |
6058 | 6031 |
6059 /** | 6032 /** |
| 6033 * A utility method that clients can use to process all of the required |
| 6034 * plugins. This method can only be used by clients that do not need to |
| 6035 * process any other plugins. |
| 6036 */ |
| 6037 void processRequiredPlugins() { |
| 6038 ExtensionManager manager = new ExtensionManager(); |
| 6039 manager.processPlugins(AnalysisEngine.instance.requiredPlugins); |
| 6040 } |
| 6041 |
| 6042 /** |
6060 * Return `true` if the given [fileName] is an analysis options file. | 6043 * Return `true` if the given [fileName] is an analysis options file. |
6061 */ | 6044 */ |
6062 static bool isAnalysisOptionsFileName(String fileName, | 6045 static bool isAnalysisOptionsFileName(String fileName, |
6063 [pathos.Context context]) { | 6046 [pathos.Context context]) { |
6064 if (fileName == null) { | 6047 if (fileName == null) { |
6065 return false; | 6048 return false; |
6066 } | 6049 } |
6067 return (context ?? pathos.posix).basename(fileName) == | 6050 return (context ?? pathos.posix).basename(fileName) == |
6068 ANALYSIS_OPTIONS_FILE; | 6051 ANALYSIS_OPTIONS_FILE; |
6069 } | 6052 } |
(...skipping 6066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12136 PendingFuture pendingFuture = | 12119 PendingFuture pendingFuture = |
12137 new PendingFuture<T>(_context, source, computeValue); | 12120 new PendingFuture<T>(_context, source, computeValue); |
12138 if (!pendingFuture.evaluate(sourceEntry)) { | 12121 if (!pendingFuture.evaluate(sourceEntry)) { |
12139 _context._pendingFutureSources | 12122 _context._pendingFutureSources |
12140 .putIfAbsent(source, () => <PendingFuture>[]) | 12123 .putIfAbsent(source, () => <PendingFuture>[]) |
12141 .add(pendingFuture); | 12124 .add(pendingFuture); |
12142 } | 12125 } |
12143 return pendingFuture.future; | 12126 return pendingFuture.future; |
12144 } | 12127 } |
12145 } | 12128 } |
OLD | NEW |