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 analysis.server; | 5 library analysis.server; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 | 9 |
10 import 'package:analysis_server/src/analysis_logger.dart'; | 10 import 'package:analysis_server/src/analysis_logger.dart'; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 */ | 165 */ |
166 Map<AnalysisContext, Completer<AnalysisDoneReason>> contextAnalysisDoneComplet
ers = | 166 Map<AnalysisContext, Completer<AnalysisDoneReason>> contextAnalysisDoneComplet
ers = |
167 new HashMap<AnalysisContext, Completer<AnalysisDoneReason>>(); | 167 new HashMap<AnalysisContext, Completer<AnalysisDoneReason>>(); |
168 | 168 |
169 /** | 169 /** |
170 * The option possibly set from the server initialization which disables error
notifications. | 170 * The option possibly set from the server initialization which disables error
notifications. |
171 */ | 171 */ |
172 bool _noErrorNotification; | 172 bool _noErrorNotification; |
173 | 173 |
174 /** | 174 /** |
| 175 * The [Completer] that completes when analysis is complete. |
| 176 */ |
| 177 Completer _onAnalysisCompleteCompleter; |
| 178 |
| 179 /** |
175 * The controller that is notified when analysis is started. | 180 * The controller that is notified when analysis is started. |
176 */ | 181 */ |
177 StreamController<AnalysisContext> _onAnalysisStartedController; | 182 StreamController<AnalysisContext> _onAnalysisStartedController; |
178 | 183 |
179 /** | 184 /** |
180 * The controller that is notified when analysis is complete. | |
181 */ | |
182 StreamController _onAnalysisCompleteController; | |
183 | |
184 /** | |
185 * The controller that is notified when a single file has been analyzed. | 185 * The controller that is notified when a single file has been analyzed. |
186 */ | 186 */ |
187 StreamController<ChangeNotice> _onFileAnalyzedController; | 187 StreamController<ChangeNotice> _onFileAnalyzedController; |
188 | 188 |
189 /** | 189 /** |
190 * The controller used to notify others when priority sources change. | 190 * The controller used to notify others when priority sources change. |
191 */ | 191 */ |
192 StreamController<PriorityChangeEvent> _onPriorityChangeController; | 192 StreamController<PriorityChangeEvent> _onPriorityChangeController; |
193 | 193 |
194 /** | 194 /** |
(...skipping 29 matching lines...) Expand all Loading... |
224 contextDirectoryManager = | 224 contextDirectoryManager = |
225 new ServerContextManager(this, resourceProvider, packageMapProvider); | 225 new ServerContextManager(this, resourceProvider, packageMapProvider); |
226 contextDirectoryManager.defaultOptions.incremental = true; | 226 contextDirectoryManager.defaultOptions.incremental = true; |
227 contextDirectoryManager.defaultOptions.incrementalApi = | 227 contextDirectoryManager.defaultOptions.incrementalApi = |
228 analysisServerOptions.enableIncrementalResolutionApi; | 228 analysisServerOptions.enableIncrementalResolutionApi; |
229 contextDirectoryManager.defaultOptions.incrementalValidation = | 229 contextDirectoryManager.defaultOptions.incrementalValidation = |
230 analysisServerOptions.enableIncrementalResolutionValidation; | 230 analysisServerOptions.enableIncrementalResolutionValidation; |
231 _noErrorNotification = analysisServerOptions.noErrorNotification; | 231 _noErrorNotification = analysisServerOptions.noErrorNotification; |
232 AnalysisEngine.instance.logger = new AnalysisLogger(); | 232 AnalysisEngine.instance.logger = new AnalysisLogger(); |
233 _onAnalysisStartedController = new StreamController.broadcast(); | 233 _onAnalysisStartedController = new StreamController.broadcast(); |
234 _onAnalysisCompleteController = new StreamController.broadcast(); | |
235 _onFileAnalyzedController = new StreamController.broadcast(); | 234 _onFileAnalyzedController = new StreamController.broadcast(); |
236 _onPriorityChangeController = | 235 _onPriorityChangeController = |
237 new StreamController<PriorityChangeEvent>.broadcast(); | 236 new StreamController<PriorityChangeEvent>.broadcast(); |
238 running = true; | 237 running = true; |
239 Notification notification = new ServerConnectedParams().toNotification(); | 238 Notification notification = new ServerConnectedParams().toNotification(); |
240 channel.sendNotification(notification); | 239 channel.sendNotification(notification); |
241 channel.listen(handleRequest, onDone: done, onError: error); | 240 channel.listen(handleRequest, onDone: done, onError: error); |
242 } | 241 } |
243 | 242 |
244 /** | 243 /** |
245 * The stream that is notified when analysis is complete. | 244 * The [Future] that completes when analysis is complete. |
246 */ | 245 */ |
247 Stream get onAnalysisComplete => _onAnalysisCompleteController.stream; | 246 Future get onAnalysisComplete { |
| 247 if (isAnalysisComplete()) { |
| 248 return new Future.value(); |
| 249 } |
| 250 if (_onAnalysisCompleteCompleter == null) { |
| 251 _onAnalysisCompleteCompleter = new Completer(); |
| 252 } |
| 253 return _onAnalysisCompleteCompleter.future; |
| 254 } |
248 | 255 |
249 /** | 256 /** |
250 * The stream that is notified when analysis of a context is started. | 257 * The stream that is notified when analysis of a context is started. |
251 */ | 258 */ |
252 Stream<AnalysisContext> get onAnalysisStarted { | 259 Stream<AnalysisContext> get onAnalysisStarted { |
253 return _onAnalysisStartedController.stream; | 260 return _onAnalysisStartedController.stream; |
254 } | 261 } |
255 | 262 |
256 /** | 263 /** |
257 * The stream that is notified when contexts are added or removed. | 264 * The stream that is notified when contexts are added or removed. |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 'Unexpected exception during analysis', | 632 'Unexpected exception during analysis', |
626 new CaughtException(exception, stackTrace)); | 633 new CaughtException(exception, stackTrace)); |
627 } | 634 } |
628 sendServerErrorNotification(exception, stackTrace, fatal: true); | 635 sendServerErrorNotification(exception, stackTrace, fatal: true); |
629 shutdown(); | 636 shutdown(); |
630 } finally { | 637 } finally { |
631 if (!operationQueue.isEmpty) { | 638 if (!operationQueue.isEmpty) { |
632 _schedulePerformOperation(); | 639 _schedulePerformOperation(); |
633 } else { | 640 } else { |
634 sendStatusNotification(null); | 641 sendStatusNotification(null); |
635 _onAnalysisCompleteController.add(null); | 642 if (_onAnalysisCompleteCompleter != null) { |
| 643 _onAnalysisCompleteCompleter.complete(); |
| 644 _onAnalysisCompleteCompleter = null; |
| 645 } |
636 } | 646 } |
637 } | 647 } |
638 } | 648 } |
639 | 649 |
640 /** | 650 /** |
641 * Trigger reanalysis of all files from disk. | 651 * Trigger reanalysis of all files from disk. |
642 */ | 652 */ |
643 void reanalyze() { | 653 void reanalyze() { |
644 // Clear any operations that are pending. | 654 // Clear any operations that are pending. |
645 operationQueue.clear(); | 655 operationQueue.clear(); |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 * [packageUriResolver]. | 1119 * [packageUriResolver]. |
1110 */ | 1120 */ |
1111 SourceFactory _createSourceFactory(UriResolver packageUriResolver) { | 1121 SourceFactory _createSourceFactory(UriResolver packageUriResolver) { |
1112 List<UriResolver> resolvers = <UriResolver>[ | 1122 List<UriResolver> resolvers = <UriResolver>[ |
1113 new DartUriResolver(analysisServer.defaultSdk), | 1123 new DartUriResolver(analysisServer.defaultSdk), |
1114 new ResourceUriResolver(resourceProvider), | 1124 new ResourceUriResolver(resourceProvider), |
1115 packageUriResolver]; | 1125 packageUriResolver]; |
1116 return new SourceFactory(resolvers); | 1126 return new SourceFactory(resolvers); |
1117 } | 1127 } |
1118 } | 1128 } |
OLD | NEW |