| 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 430a2e657d989ac4f88c4b2b01f6886f1491bac1..df9075e0dd9c274c8d7e7a5394cb3bbc3b382944 100644
|
| --- a/pkg/analysis_server/lib/src/analysis_server.dart
|
| +++ b/pkg/analysis_server/lib/src/analysis_server.dart
|
| @@ -9,7 +9,8 @@ import 'dart:collection';
|
| import 'dart:core' hide Resource;
|
| import 'dart:math' show max;
|
|
|
| -import 'package:analysis_server/plugin/protocol/protocol.dart' hide Element;
|
| +import 'package:analysis_server/plugin/protocol/protocol.dart'
|
| + hide AnalysisOptions, Element;
|
| import 'package:analysis_server/src/analysis_logger.dart';
|
| import 'package:analysis_server/src/channel/channel.dart';
|
| import 'package:analysis_server/src/context_manager.dart';
|
| @@ -140,9 +141,14 @@ class AnalysisServer {
|
| List<RequestHandler> handlers;
|
|
|
| /**
|
| - * The current default [DartSdk].
|
| + * The function used to create a new SDK using the default SDK.
|
| */
|
| - final DartSdk defaultSdk;
|
| + final SdkCreator defaultSdkCreator;
|
| +
|
| + /**
|
| + * The object used to manage the SDK's known to this server.
|
| + */
|
| + DartSdkManager sdkManager;
|
|
|
| /**
|
| * The instrumentation service that is to be used by this analysis server.
|
| @@ -300,7 +306,7 @@ class AnalysisServer {
|
| Index _index,
|
| this.serverPlugin,
|
| this.options,
|
| - this.defaultSdk,
|
| + this.defaultSdkCreator,
|
| this.instrumentationService,
|
| {ResolverProvider packageResolverProvider: null,
|
| EmbeddedResolverProvider embeddedResolverProvider: null,
|
| @@ -342,6 +348,7 @@ class AnalysisServer {
|
| channel.sendNotification(notification);
|
| channel.listen(handleRequest, onDone: done, onError: error);
|
| handlers = serverPlugin.createDomains(this);
|
| + sdkManager = new DartSdkManager(defaultSdkCreator);
|
| }
|
|
|
| /**
|
| @@ -427,6 +434,19 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| + * Return one of the SDKs that has been created, or `null` if no SDKs have
|
| + * been created yet.
|
| + */
|
| + DartSdk findSdk() {
|
| + DartSdk sdk = sdkManager.anySdk;
|
| + if (sdk != null) {
|
| + return sdk;
|
| + }
|
| + // TODO(brianwilkerson) Should we create an SDK using the default options?
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| * Return the preferred [AnalysisContext] for analyzing the given [path].
|
| * This will be the context that explicitly contains the path, if any such
|
| * context exists, otherwise it will be the first analysis context that
|
| @@ -510,11 +530,13 @@ class AnalysisServer {
|
| ContextSourcePair getContextSourcePair(String path) {
|
| // try SDK
|
| {
|
| - Uri uri = resourceProvider.pathContext.toUri(path);
|
| - Source sdkSource = defaultSdk.fromFileUri(uri);
|
| - if (sdkSource != null) {
|
| - AnalysisContext sdkContext = defaultSdk.context;
|
| - return new ContextSourcePair(sdkContext, sdkSource);
|
| + DartSdk sdk = findSdk();
|
| + if (sdk != null) {
|
| + Uri uri = resourceProvider.pathContext.toUri(path);
|
| + Source sdkSource = sdk.fromFileUri(uri);
|
| + if (sdkSource != null) {
|
| + return new ContextSourcePair(sdk.context, sdkSource);
|
| + }
|
| }
|
| }
|
| // try to find the deep-most containing context
|
| @@ -1459,15 +1481,20 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| }
|
|
|
| @override
|
| - AnalysisContext addContext(Folder folder, FolderDisposition disposition) {
|
| + AnalysisOptions get defaultAnalysisOptions =>
|
| + analysisServer.defaultContextOptions;
|
| +
|
| + @override
|
| + AnalysisContext addContext(
|
| + Folder folder, AnalysisOptions options, FolderDisposition disposition) {
|
| InternalAnalysisContext context =
|
| AnalysisEngine.instance.createAnalysisContext();
|
| context.contentCache = analysisServer.overlayState;
|
| analysisServer.folderMap[folder] = context;
|
| _locateEmbedderYamls(context, disposition);
|
| - context.sourceFactory = _createSourceFactory(context, disposition, folder);
|
| - context.analysisOptions =
|
| - new AnalysisOptionsImpl.from(analysisServer.defaultContextOptions);
|
| + context.sourceFactory =
|
| + _createSourceFactory(context, options, disposition, folder);
|
| + context.analysisOptions = options;
|
| analysisServer._onContextsChangedController
|
| .add(new ContextsChangedEvent(added: [context]));
|
| analysisServer.schedulePerformAnalysisOperation(context);
|
| @@ -1536,8 +1563,8 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| void updateContextPackageUriResolver(
|
| Folder contextFolder, FolderDisposition disposition) {
|
| AnalysisContext context = analysisServer.folderMap[contextFolder];
|
| - context.sourceFactory =
|
| - _createSourceFactory(context, disposition, contextFolder);
|
| + context.sourceFactory = _createSourceFactory(
|
| + context, context.analysisOptions, disposition, contextFolder);
|
| analysisServer._onContextsChangedController
|
| .add(new ContextsChangedEvent(changed: [context]));
|
| analysisServer.schedulePerformAnalysisOperation(context);
|
| @@ -1556,7 +1583,7 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| * given [disposition].
|
| */
|
| SourceFactory _createSourceFactory(InternalAnalysisContext context,
|
| - FolderDisposition disposition, Folder folder) {
|
| + AnalysisOptions options, FolderDisposition disposition, Folder folder) {
|
| List<UriResolver> resolvers = [];
|
| List<UriResolver> packageUriResolvers =
|
| disposition.createPackageUriResolvers(resourceProvider);
|
| @@ -1579,7 +1606,8 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| if (embedderUriResolver.length == 0) {
|
| // The embedder uri resolver has no mappings. Use the default Dart SDK
|
| // uri resolver.
|
| - resolvers.add(new DartUriResolver(analysisServer.defaultSdk));
|
| + resolvers.add(new DartUriResolver(
|
| + analysisServer.sdkManager.getSdkForOptions(options)));
|
| } else {
|
| // The embedder uri resolver has mappings, use it instead of the default
|
| // Dart SDK uri resolver.
|
|
|