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

Side by Side Diff: pkg/analysis_server/lib/src/analysis_server.dart

Issue 2795743002: Add context information to driver and add hooks for plugin management (Closed)
Patch Set: Created 3 years, 8 months 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
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/context_manager.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 import 'dart:core'; 9 import 'dart:core';
10 import 'dart:io' as io; 10 import 'dart:io' as io;
(...skipping 10 matching lines...) Expand all
21 import 'package:analysis_server/src/context_manager.dart'; 21 import 'package:analysis_server/src/context_manager.dart';
22 import 'package:analysis_server/src/domains/analysis/navigation.dart'; 22 import 'package:analysis_server/src/domains/analysis/navigation.dart';
23 import 'package:analysis_server/src/domains/analysis/navigation_dart.dart'; 23 import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
24 import 'package:analysis_server/src/domains/analysis/occurrences.dart'; 24 import 'package:analysis_server/src/domains/analysis/occurrences.dart';
25 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart'; 25 import 'package:analysis_server/src/domains/analysis/occurrences_dart.dart';
26 import 'package:analysis_server/src/ide_options.dart'; 26 import 'package:analysis_server/src/ide_options.dart';
27 import 'package:analysis_server/src/operation/operation.dart'; 27 import 'package:analysis_server/src/operation/operation.dart';
28 import 'package:analysis_server/src/operation/operation_analysis.dart'; 28 import 'package:analysis_server/src/operation/operation_analysis.dart';
29 import 'package:analysis_server/src/operation/operation_queue.dart'; 29 import 'package:analysis_server/src/operation/operation_queue.dart';
30 import 'package:analysis_server/src/plugin/notification_manager.dart'; 30 import 'package:analysis_server/src/plugin/notification_manager.dart';
31 import 'package:analysis_server/src/plugin/plugin_manager.dart';
32 import 'package:analysis_server/src/plugin/plugin_watcher.dart';
31 import 'package:analysis_server/src/plugin/server_plugin.dart'; 33 import 'package:analysis_server/src/plugin/server_plugin.dart';
32 import 'package:analysis_server/src/protocol_server.dart' as server; 34 import 'package:analysis_server/src/protocol_server.dart' as server;
33 import 'package:analysis_server/src/server/diagnostic_server.dart'; 35 import 'package:analysis_server/src/server/diagnostic_server.dart';
34 import 'package:analysis_server/src/services/correction/namespace.dart'; 36 import 'package:analysis_server/src/services/correction/namespace.dart';
35 import 'package:analysis_server/src/services/index/index.dart'; 37 import 'package:analysis_server/src/services/index/index.dart';
36 import 'package:analysis_server/src/services/search/search_engine.dart'; 38 import 'package:analysis_server/src/services/search/search_engine.dart';
37 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ; 39 import 'package:analysis_server/src/services/search/search_engine_internal.dart' ;
38 import 'package:analysis_server/src/services/search/search_engine_internal2.dart '; 40 import 'package:analysis_server/src/services/search/search_engine_internal2.dart ';
39 import 'package:analysis_server/src/single_context_manager.dart'; 41 import 'package:analysis_server/src/single_context_manager.dart';
40 import 'package:analysis_server/src/utilities/null_string_sink.dart'; 42 import 'package:analysis_server/src/utilities/null_string_sink.dart';
43 import 'package:analyzer/context/context_root.dart';
41 import 'package:analyzer/dart/ast/ast.dart'; 44 import 'package:analyzer/dart/ast/ast.dart';
42 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; 45 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
43 import 'package:analyzer/dart/element/element.dart'; 46 import 'package:analyzer/dart/element/element.dart';
44 import 'package:analyzer/exception/exception.dart'; 47 import 'package:analyzer/exception/exception.dart';
45 import 'package:analyzer/file_system/file_system.dart'; 48 import 'package:analyzer/file_system/file_system.dart';
46 import 'package:analyzer/file_system/physical_file_system.dart'; 49 import 'package:analyzer/file_system/physical_file_system.dart';
47 import 'package:analyzer/instrumentation/instrumentation.dart'; 50 import 'package:analyzer/instrumentation/instrumentation.dart';
48 import 'package:analyzer/plugin/resolver_provider.dart'; 51 import 'package:analyzer/plugin/resolver_provider.dart';
49 import 'package:analyzer/source/pub_package_map_provider.dart'; 52 import 'package:analyzer/source/pub_package_map_provider.dart';
50 import 'package:analyzer/src/context/builder.dart'; 53 import 'package:analyzer/src/context/builder.dart';
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 final ServerCommunicationChannel channel; 131 final ServerCommunicationChannel channel;
129 132
130 /** 133 /**
131 * The object used to manage sending a subset of notifications to the client. 134 * The object used to manage sending a subset of notifications to the client.
132 * The subset of notifications are those to which plugins may contribute. 135 * The subset of notifications are those to which plugins may contribute.
133 * This field is `null` when the new plugin support is disabled. 136 * This field is `null` when the new plugin support is disabled.
134 */ 137 */
135 final NotificationManager notificationManager; 138 final NotificationManager notificationManager;
136 139
137 /** 140 /**
141 * The object used to manage the execution of plugins.
142 */
143 PluginManager pluginManager;
144
145 /**
138 * The [ResourceProvider] using which paths are converted into [Resource]s. 146 * The [ResourceProvider] using which paths are converted into [Resource]s.
139 */ 147 */
140 final ResourceProvider resourceProvider; 148 final ResourceProvider resourceProvider;
141 149
142 /** 150 /**
143 * The [Index] for this server, may be `null` if indexing is disabled. 151 * The [Index] for this server, may be `null` if indexing is disabled.
144 */ 152 */
145 final Index index; 153 final Index index;
146 154
147 /** 155 /**
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 this.sdkManager, 392 this.sdkManager,
385 this.instrumentationService, 393 this.instrumentationService,
386 {this.diagnosticServer, 394 {this.diagnosticServer,
387 ResolverProvider fileResolverProvider: null, 395 ResolverProvider fileResolverProvider: null,
388 ResolverProvider packageResolverProvider: null, 396 ResolverProvider packageResolverProvider: null,
389 bool useSingleContextManager: false, 397 bool useSingleContextManager: false,
390 this.rethrowExceptions: true}) 398 this.rethrowExceptions: true})
391 : notificationManager = 399 : notificationManager =
392 new NotificationManager(channel, resourceProvider) { 400 new NotificationManager(channel, resourceProvider) {
393 _performance = performanceDuringStartup; 401 _performance = performanceDuringStartup;
402
403 pluginManager = new PluginManager(resourceProvider, _getByteStorePath(),
404 notificationManager, instrumentationService);
405 PluginWatcher pluginWatcher =
406 new PluginWatcher(resourceProvider, pluginManager);
407
394 defaultContextOptions.incremental = true; 408 defaultContextOptions.incremental = true;
395 defaultContextOptions.incrementalApi = 409 defaultContextOptions.incrementalApi =
396 options.enableIncrementalResolutionApi; 410 options.enableIncrementalResolutionApi;
397 defaultContextOptions.incrementalValidation = 411 defaultContextOptions.incrementalValidation =
398 options.enableIncrementalResolutionValidation; 412 options.enableIncrementalResolutionValidation;
399 defaultContextOptions.finerGrainedInvalidation = 413 defaultContextOptions.finerGrainedInvalidation =
400 options.finerGrainedInvalidation; 414 options.finerGrainedInvalidation;
401 defaultContextOptions.generateImplicitErrors = false; 415 defaultContextOptions.generateImplicitErrors = false;
402 operationQueue = new ServerOperationQueue(); 416 operationQueue = new ServerOperationQueue();
403 417
404 { 418 {
405 String name = options.newAnalysisDriverLog; 419 String name = options.newAnalysisDriverLog;
406 StringSink sink = new NullStringSink(); 420 StringSink sink = new NullStringSink();
407 if (name != null) { 421 if (name != null) {
408 if (name == 'stdout') { 422 if (name == 'stdout') {
409 sink = io.stdout; 423 sink = io.stdout;
410 } else if (name.startsWith('file:')) { 424 } else if (name.startsWith('file:')) {
411 String path = name.substring('file:'.length); 425 String path = name.substring('file:'.length);
412 sink = new io.File(path).openWrite(mode: io.FileMode.APPEND); 426 sink = new io.File(path).openWrite(mode: io.FileMode.APPEND);
413 } 427 }
414 } 428 }
415 _analysisPerformanceLogger = new nd.PerformanceLog(sink); 429 _analysisPerformanceLogger = new nd.PerformanceLog(sink);
416 } 430 }
417 byteStore = _createByteStore(); 431 byteStore = _createByteStore();
418 analysisDriverScheduler = 432 analysisDriverScheduler = new nd.AnalysisDriverScheduler(
419 new nd.AnalysisDriverScheduler(_analysisPerformanceLogger); 433 _analysisPerformanceLogger,
434 driverWatcher: pluginWatcher);
420 analysisDriverScheduler.status.listen(sendStatusNotificationNew); 435 analysisDriverScheduler.status.listen(sendStatusNotificationNew);
421 analysisDriverScheduler.start(); 436 analysisDriverScheduler.start();
422 437
423 if (useSingleContextManager) { 438 if (useSingleContextManager) {
424 contextManager = new SingleContextManager(resourceProvider, sdkManager, 439 contextManager = new SingleContextManager(resourceProvider, sdkManager,
425 packageResolverProvider, analyzedFilesGlobs, defaultContextOptions); 440 packageResolverProvider, analyzedFilesGlobs, defaultContextOptions);
426 } else { 441 } else {
427 contextManager = new ContextManagerImpl( 442 contextManager = new ContextManagerImpl(
428 resourceProvider, 443 resourceProvider,
429 sdkManager, 444 sdkManager,
(...skipping 1297 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 resourceProvider.getStateLocation('.analysis-driver'); 1742 resourceProvider.getStateLocation('.analysis-driver');
1728 if (stateLocation != null) { 1743 if (stateLocation != null) {
1729 return new MemoryCachingByteStore( 1744 return new MemoryCachingByteStore(
1730 new EvictingFileByteStore(stateLocation.path, G), 64 * M); 1745 new EvictingFileByteStore(stateLocation.path, G), 64 * M);
1731 } 1746 }
1732 } 1747 }
1733 return new MemoryCachingByteStore(new NullByteStore(), 64 * M); 1748 return new MemoryCachingByteStore(new NullByteStore(), 64 * M);
1734 } 1749 }
1735 1750
1736 /** 1751 /**
1752 * Return the path to the location of the byte store on disk, or `null` if
1753 * there is no on-disk byte store.
1754 */
1755 String _getByteStorePath() {
1756 if (resourceProvider is PhysicalResourceProvider) {
1757 Folder stateLocation =
1758 resourceProvider.getStateLocation('.analysis-driver');
1759 if (stateLocation != null) {
1760 return stateLocation.path;
1761 }
1762 }
1763 return null;
1764 }
1765
1766 /**
1737 * Return a set of all contexts whose associated folder is contained within, 1767 * Return a set of all contexts whose associated folder is contained within,
1738 * or equal to, one of the resources in the given list of [resources]. 1768 * or equal to, one of the resources in the given list of [resources].
1739 */ 1769 */
1740 Set<AnalysisContext> _getContexts(List<Resource> resources) { 1770 Set<AnalysisContext> _getContexts(List<Resource> resources) {
1741 Set<AnalysisContext> contexts = new HashSet<AnalysisContext>(); 1771 Set<AnalysisContext> contexts = new HashSet<AnalysisContext>();
1742 resources.forEach((Resource resource) { 1772 resources.forEach((Resource resource) {
1743 if (resource is Folder) { 1773 if (resource is Folder) {
1744 contexts.addAll(contextManager.contextsInAnalysisRoot(resource)); 1774 contexts.addAll(contextManager.contextsInAnalysisRoot(resource));
1745 } 1775 }
1746 }); 1776 });
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 final AnalysisServer analysisServer; 1925 final AnalysisServer analysisServer;
1896 1926
1897 /** 1927 /**
1898 * The [ResourceProvider] by which paths are converted into [Resource]s. 1928 * The [ResourceProvider] by which paths are converted into [Resource]s.
1899 */ 1929 */
1900 final ResourceProvider resourceProvider; 1930 final ResourceProvider resourceProvider;
1901 1931
1902 ServerContextManagerCallbacks(this.analysisServer, this.resourceProvider); 1932 ServerContextManagerCallbacks(this.analysisServer, this.resourceProvider);
1903 1933
1904 @override 1934 @override
1905 nd.AnalysisDriver addAnalysisDriver(Folder folder, AnalysisOptions options) { 1935 nd.AnalysisDriver addAnalysisDriver(
1936 Folder folder, ContextRoot contextRoot, AnalysisOptions options) {
1906 ContextBuilder builder = createContextBuilder(folder, options); 1937 ContextBuilder builder = createContextBuilder(folder, options);
1907 nd.AnalysisDriver analysisDriver = builder.buildDriver(folder.path); 1938 nd.AnalysisDriver analysisDriver = builder.buildDriver(contextRoot);
1908 analysisDriver.results.listen((result) { 1939 analysisDriver.results.listen((result) {
1909 NotificationManager notificationManager = 1940 NotificationManager notificationManager =
1910 analysisServer.notificationManager; 1941 analysisServer.notificationManager;
1911 String path = result.path; 1942 String path = result.path;
1912 if (analysisServer.shouldSendErrorsNotificationFor(path)) { 1943 if (analysisServer.shouldSendErrorsNotificationFor(path)) {
1913 if (notificationManager != null) { 1944 if (notificationManager != null) {
1914 notificationManager.recordAnalysisErrors( 1945 notificationManager.recordAnalysisErrors(
1915 NotificationManager.serverId, 1946 NotificationManager.serverId,
1916 path, 1947 path,
1917 server.doAnalysisError_listFromEngine( 1948 server.doAnalysisError_listFromEngine(
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 /** 2339 /**
2309 * The [PerformanceTag] for time spent in server request handlers. 2340 * The [PerformanceTag] for time spent in server request handlers.
2310 */ 2341 */
2311 static PerformanceTag serverRequests = new PerformanceTag('serverRequests'); 2342 static PerformanceTag serverRequests = new PerformanceTag('serverRequests');
2312 2343
2313 /** 2344 /**
2314 * The [PerformanceTag] for time spent in split store microtasks. 2345 * The [PerformanceTag] for time spent in split store microtasks.
2315 */ 2346 */
2316 static PerformanceTag splitStore = new PerformanceTag('splitStore'); 2347 static PerformanceTag splitStore = new PerformanceTag('splitStore');
2317 } 2348 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/lib/src/context_manager.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698