diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart index 2d4d08faed6..ac5bceda2a0 100644 --- a/pkg/analysis_server/lib/src/context_manager.dart +++ b/pkg/analysis_server/lib/src/context_manager.dart @@ -19,6 +19,7 @@ import 'package:analyzer/source/package_map_provider.dart'; import 'package:analyzer/source/package_map_resolver.dart'; import 'package:analyzer/source/path_filter.dart'; import 'package:analyzer/source/pub_package_map_provider.dart'; +import 'package:analyzer/source/sdk_ext.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/java_io.dart'; import 'package:analyzer/src/generated/source.dart'; @@ -1352,7 +1353,8 @@ class PackageMapDisposition extends FolderDisposition { @override Iterable createPackageUriResolvers( ResourceProvider resourceProvider) => - [new PackageMapUriResolver(resourceProvider, packageMap)]; + [new SdkExtUriResolver(packageMap), + new PackageMapUriResolver(resourceProvider, packageMap)]; } /** @@ -1370,6 +1372,19 @@ class PackagesFileDisposition extends FolderDisposition { @override Iterable createPackageUriResolvers( - ResourceProvider resourceProvider) => - const []; + ResourceProvider resourceProvider) { + if (packages != null) { + // Construct package map for the SdkExtUriResolver. + Map> packageMap = >{}; + packages.asMap().forEach((String name, Uri uri) { + if (uri.scheme == 'file' || uri.scheme == '' /* unspecified */) { + var path = resourceProvider.pathContext.fromUri(uri); + packageMap[name] = [resourceProvider.getFolder(path)]; + } + }); + return [new SdkExtUriResolver(packageMap)]; + } else { + return const []; + } + } } diff --git a/pkg/analysis_server/test/context_manager_test.dart b/pkg/analysis_server/test/context_manager_test.dart index c810386b6b3..2096933c20f 100644 --- a/pkg/analysis_server/test/context_manager_test.dart +++ b/pkg/analysis_server/test/context_manager_test.dart @@ -344,6 +344,45 @@ analyzer: expect(contexts[1].name, equals('/my/proj/lib')); } + // TODO(paulberry): This test only tests PackagesFileDisposition. + // Once http://dartbug.com/23909 is fixed, add a test for sdk extensions + // and PackageMapDisposition. + test_sdk_ext_packagespec() async { + // Create files. + String libPath = newFolder([projPath, LIB_NAME]); + newFile([libPath, 'main.dart']); + newFile([libPath, 'nope.dart']); + String sdkExtPath = newFolder([projPath, 'sdk_ext']); + newFile([sdkExtPath, 'entry.dart']); + String sdkExtSrcPath = newFolder([projPath, 'sdk_ext', 'src']); + newFile([sdkExtSrcPath, 'part.dart']); + // Setup sdk extension mapping. + newFile( + [libPath, '_sdkext'], + r''' +{ + "dart:foobar": "../sdk_ext/entry.dart" +} +'''); + // Setup .packages file + newFile( + [projPath, '.packages'], + r''' +test_pack:lib/ +'''); + // Setup context. + manager.setRoots([projPath], [], {}); + // Confirm that one context was created. + var contexts = + manager.contextsInAnalysisRoot(resourceProvider.newFolder(projPath)); + expect(contexts, isNotNull); + expect(contexts.length, equals(1)); + var context = contexts[0]; + var source = context.sourceFactory.forUri('dart:foobar'); + expect(source.fullName, equals('/my/proj/sdk_ext/entry.dart')); + } + + test_refresh_folder_with_packagespec() { // create a context with a .packages file String packagespecFile = posix.join(projPath, '.packages');