Chromium Code Reviews| Index: pkg/analysis_server/lib/src/analysis_server.dart |
| diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart |
| index 7f135d2d547a4a576ed703e43f55a971b136ed26..60d721f9749aa4723adaaad1c4310cd3d1215131 100644 |
| --- a/pkg/analysis_server/lib/src/analysis_server.dart |
| +++ b/pkg/analysis_server/lib/src/analysis_server.dart |
| @@ -108,10 +108,10 @@ class AnalysisServer { |
| final ServerPlugin serverPlugin; |
| /** |
| - * [ContextManager] which handles the mapping from analysis roots |
| - * to context directories. |
| + * The [ContextManager] that handles the mapping from analysis roots to |
| + * context directories. |
| */ |
| - ServerContextManager contextDirectoryManager; |
| + ServerContextManager contextManager; |
| /** |
| * A flag indicating whether the server is running. When false, contexts |
| @@ -254,6 +254,9 @@ class AnalysisServer { |
| * Initialize a newly created server to receive requests from and send |
| * responses to the given [channel]. |
| * |
| + * If a [contextManager] is provided, then the [packageResolverProvider] will |
| + * be ignored. |
| + * |
| * If [rethrowExceptions] is true, then any exceptions thrown by analysis are |
| * propagated up the call stack. The default is true to allow analysis |
| * exceptions to show up in unit tests, but it should be set to false when |
| @@ -263,20 +266,30 @@ class AnalysisServer { |
| OptimizingPubPackageMapProvider packageMapProvider, Index _index, |
| this.serverPlugin, AnalysisServerOptions analysisServerOptions, |
| this.defaultSdk, this.instrumentationService, |
| - {ResolverProvider packageResolverProvider: null, |
| + {ContextManager contextManager: null, |
| + ResolverProvider packageResolverProvider: null, |
| this.rethrowExceptions: true}) |
| : index = _index, |
| searchEngine = _index != null ? createSearchEngine(_index) : null { |
| _performance = performanceDuringStartup; |
| operationQueue = new ServerOperationQueue(); |
| - contextDirectoryManager = new ServerContextManager(this, resourceProvider, |
| - packageResolverProvider, packageMapProvider, instrumentationService); |
| - contextDirectoryManager.defaultOptions.incremental = true; |
| - contextDirectoryManager.defaultOptions.incrementalApi = |
| - analysisServerOptions.enableIncrementalResolutionApi; |
| - contextDirectoryManager.defaultOptions.incrementalValidation = |
| - analysisServerOptions.enableIncrementalResolutionValidation; |
| - contextDirectoryManager.defaultOptions.generateImplicitErrors = false; |
| + if (contextManager == null) { |
| + contextManager = new ServerContextManager(this, resourceProvider, |
| + packageResolverProvider, packageMapProvider, instrumentationService); |
| + AnalysisOptionsImpl options = |
| + (contextManager as ServerContextManager).defaultOptions; |
| + options.incremental = true; |
| + options.incrementalApi = |
| + analysisServerOptions.enableIncrementalResolutionApi; |
| + options.incrementalValidation = |
| + analysisServerOptions.enableIncrementalResolutionValidation; |
| + options.generateImplicitErrors = false; |
| + } else if (contextManager is! ServerContextManager) { |
| + // TODO(brianwilkerson) Remove this when the interface is complete. |
| + throw new StateError( |
| + 'The contextManager must be an instance of ServerContextManager'); |
| + } |
| + this.contextManager = contextManager; |
| _noErrorNotification = analysisServerOptions.noErrorNotification; |
| AnalysisEngine.instance.logger = new AnalysisLogger(); |
| _onAnalysisStartedController = new StreamController.broadcast(); |
| @@ -321,7 +334,7 @@ class AnalysisServer { |
| * The stream that is notified when contexts are added or removed. |
| */ |
| Stream<ContextsChangedEvent> get onContextsChanged => |
| - contextDirectoryManager.onContextsChanged; |
| + contextManager.onContextsChanged; |
| /** |
| * The stream that is notified when a single file has been analyzed. |
| @@ -374,7 +387,7 @@ class AnalysisServer { |
| * analyzed. |
| */ |
| void fileAnalyzed(ChangeNotice notice) { |
| - if (contextDirectoryManager.isInAnalysisRoot(notice.source.fullName)) { |
| + if (contextManager.isInAnalysisRoot(notice.source.fullName)) { |
| _onFileAnalyzedController.add(notice); |
| } |
| } |
| @@ -465,14 +478,15 @@ class AnalysisServer { |
| { |
| AnalysisContext containingContext = getContainingContext(path); |
| if (containingContext != null) { |
| - Source source = |
| - ContextManager.createSourceInContext(containingContext, file); |
| + Source source = AbstractContextManager.createSourceInContext( |
| + containingContext, file); |
| return new ContextSourcePair(containingContext, source); |
| } |
| } |
| // try to find a context that analysed the file |
| for (AnalysisContext context in folderMap.values) { |
| - Source source = ContextManager.createSourceInContext(context, file); |
| + Source source = |
| + AbstractContextManager.createSourceInContext(context, file); |
| SourceKind kind = context.getKindOf(source); |
| if (kind != SourceKind.UNKNOWN) { |
| return new ContextSourcePair(context, source); |
| @@ -772,7 +786,7 @@ class AnalysisServer { |
| } |
| // Instruct the contextDirectoryManager to rebuild all contexts from |
| // scratch. |
| - contextDirectoryManager.refresh(roots); |
| + contextManager.refresh(roots); |
| } |
| /** |
| @@ -877,8 +891,7 @@ class AnalysisServer { |
| void setAnalysisRoots(String requestId, List<String> includedPaths, |
| List<String> excludedPaths, Map<String, String> packageRoots) { |
| try { |
| - contextDirectoryManager.setRoots( |
| - includedPaths, excludedPaths, packageRoots); |
| + contextManager.setRoots(includedPaths, excludedPaths, packageRoots); |
| } on UnimplementedError catch (e) { |
| throw new RequestFailure( |
| new Response.unsupportedFeature(requestId, e.message)); |
| @@ -962,7 +975,8 @@ class AnalysisServer { |
| Uri uri = context.sourceFactory.restoreUri(source); |
| if (uri.scheme != 'file') { |
| preferredContext = context; |
| - source = ContextManager.createSourceInContext(context, resource); |
| + source = AbstractContextManager.createSourceInContext( |
| + context, resource); |
| break; |
| } |
| } |
| @@ -1009,8 +1023,7 @@ class AnalysisServer { |
| * absolute path. |
| */ |
| bool shouldSendErrorsNotificationFor(String file) { |
| - return !_noErrorNotification && |
| - contextDirectoryManager.isInAnalysisRoot(file); |
| + return !_noErrorNotification && contextManager.isInAnalysisRoot(file); |
| } |
| void shutdown() { |
| @@ -1157,11 +1170,13 @@ class AnalysisServer { |
| optionUpdater(options); |
| }); |
| context.analysisOptions = options; |
| + // TODO(brianwilkerson) As far as I can tell, this doesn't cause analysis |
|
Paul Berry
2015/07/09 21:45:57
Ouch. I believe you are right.
|
| + // to be scheduled for this context. |
| }); |
| // |
| // Update the defaults used to create new contexts. |
| // |
| - AnalysisOptionsImpl options = contextDirectoryManager.defaultOptions; |
| + AnalysisOptionsImpl options = contextManager.defaultOptions; |
| optionUpdaters.forEach((OptionUpdater optionUpdater) { |
| optionUpdater(options); |
| }); |
| @@ -1175,8 +1190,7 @@ class AnalysisServer { |
| Set<AnalysisContext> contexts = new HashSet<AnalysisContext>(); |
| resources.forEach((Resource resource) { |
| if (resource is Folder) { |
| - contexts |
| - .addAll(contextDirectoryManager.contextsInAnalysisRoot(resource)); |
| + contexts.addAll(contextManager.contextsInAnalysisRoot(resource)); |
| } |
| }); |
| return contexts; |
| @@ -1243,13 +1257,9 @@ class AnalysisServerOptions { |
| } |
| /** |
| - * A [ContextsChangedEvent] indicate what contexts were added or removed. |
| - * |
| - * No context should be added to the event more than once. It does not make |
| - * sense, for example, for a context to be both added and removed. |
| + * An implementation of a [ContextsChangedEvent]. |
| */ |
| -class ContextsChangedEvent { |
| - |
| +class ContextsChangedEventImpl implements ContextsChangedEvent { |
|
Paul Berry
2015/07/09 21:45:57
I don't follow the benefit of making an interface/
Brian Wilkerson
2015/07/13 17:18:50
I agree. Done.
|
| /** |
| * The contexts that were added to the server. |
| */ |
| @@ -1265,7 +1275,7 @@ class ContextsChangedEvent { |
| */ |
| final List<AnalysisContext> removed; |
| - ContextsChangedEvent({this.added: AnalysisContext.EMPTY_LIST, |
| + ContextsChangedEventImpl({this.added: AnalysisContext.EMPTY_LIST, |
| this.changed: AnalysisContext.EMPTY_LIST, |
| this.removed: AnalysisContext.EMPTY_LIST}); |
| } |
| @@ -1300,7 +1310,7 @@ class PriorityChangeEvent { |
| PriorityChangeEvent(this.firstSource); |
| } |
| -class ServerContextManager extends ContextManager { |
| +class ServerContextManager extends AbstractContextManager { |
| final AnalysisServer analysisServer; |
| /** |
| @@ -1338,7 +1348,7 @@ class ServerContextManager extends ContextManager { |
| context.sourceFactory = _createSourceFactory(packageUriResolver); |
| context.analysisOptions = new AnalysisOptionsImpl.from(defaultOptions); |
| _onContextsChangedController |
| - .add(new ContextsChangedEvent(added: [context])); |
| + .add(new ContextsChangedEventImpl(added: [context])); |
| analysisServer.schedulePerformAnalysisOperation(context); |
| return context; |
| } |
| @@ -1382,7 +1392,7 @@ class ServerContextManager extends ContextManager { |
| } |
| analysisServer.operationQueue.contextRemoved(context); |
| _onContextsChangedController |
| - .add(new ContextsChangedEvent(removed: [context])); |
| + .add(new ContextsChangedEventImpl(removed: [context])); |
| analysisServer.sendContextAnalysisDoneNotifications( |
| context, AnalysisDoneReason.CONTEXT_REMOVED); |
| context.dispose(); |
| @@ -1412,7 +1422,7 @@ class ServerContextManager extends ContextManager { |
| AnalysisContext context = analysisServer.folderMap[contextFolder]; |
| context.sourceFactory = _createSourceFactory(packageUriResolver); |
| _onContextsChangedController |
| - .add(new ContextsChangedEvent(changed: [context])); |
| + .add(new ContextsChangedEventImpl(changed: [context])); |
| analysisServer.schedulePerformAnalysisOperation(context); |
| } |