@@ -5056,20 +5056,30 @@ class PackageBuilder {
5056
5056
SourceFactory get sourceFactory {
5057
5057
List <UriResolver > resolvers = [];
5058
5058
resolvers.add (new SdkExtUriResolver (packageMap));
5059
- resolvers.add (new PackageMapUriResolver (
5060
- PhysicalResourceProvider .INSTANCE , packageMap));
5059
+ final UriResolver packageResolver = new PackageMapUriResolver (
5060
+ PhysicalResourceProvider .INSTANCE , packageMap);
5061
+ UriResolver sdkResolver;
5061
5062
if (embedderSdk == null || embedderSdk.urlMappings.length == 0 ) {
5062
5063
// The embedder uri resolver has no mappings. Use the default Dart SDK
5063
5064
// uri resolver.
5064
- resolvers. add ( new DartUriResolver (sdk) );
5065
+ sdkResolver = new DartUriResolver (sdk);
5065
5066
} else {
5066
5067
// The embedder uri resolver has mappings, use it instead of the default
5067
5068
// Dart SDK uri resolver.
5068
- resolvers. add ( embedderResolver) ;
5069
+ sdkResolver = embedderResolver;
5069
5070
}
5071
+
5072
+ /// [AnalysisDriver] seems to require package resolvers that
5073
+ /// never resolve to embedded SDK files, and the resolvers list must still
5074
+ /// contain a DartUriResolver. This hack won't be necessary once analyzer
5075
+ /// has a clean public API.
5076
+ resolvers.add (new PackageWithoutSdkResolver (packageResolver, sdkResolver));
5077
+ resolvers.add (sdkResolver);
5070
5078
resolvers.add (
5071
5079
new fileSystem.ResourceUriResolver (PhysicalResourceProvider .INSTANCE ));
5072
5080
5081
+ assert (
5082
+ resolvers.any ((UriResolver resolver) => resolver is DartUriResolver ));
5073
5083
SourceFactory sourceFactory = new SourceFactory (resolvers);
5074
5084
return sourceFactory;
5075
5085
}
@@ -5289,3 +5299,37 @@ class PackageBuilder {
5289
5299
}
5290
5300
}
5291
5301
}
5302
+
5303
+ /// This class resolves package URIs, but only if a given SdkResolver doesn't
5304
+ /// resolve them.
5305
+ ///
5306
+ /// TODO(jcollins-g): remove this hackery when a clean public API to analyzer
5307
+ /// exists, and port dartdoc to it.
5308
+ class PackageWithoutSdkResolver extends UriResolver {
5309
+ final UriResolver _packageResolver;
5310
+ final UriResolver _sdkResolver;
5311
+
5312
+ PackageWithoutSdkResolver (this ._packageResolver, this ._sdkResolver);
5313
+
5314
+ @override
5315
+ Source resolveAbsolute (Uri uri, [Uri actualUri]) {
5316
+ if (_sdkResolver.resolveAbsolute (uri, actualUri) == null ) {
5317
+ return _packageResolver.resolveAbsolute (uri, actualUri);
5318
+ }
5319
+ return null ;
5320
+ }
5321
+
5322
+ @override
5323
+ Uri restoreAbsolute (Source source) {
5324
+ Uri resolved;
5325
+ try {
5326
+ resolved = _sdkResolver.restoreAbsolute (source);
5327
+ } catch (ArgumentError ) {
5328
+ // SDK resolvers really don't like being thrown package paths.
5329
+ }
5330
+ if (resolved == null ) {
5331
+ return _packageResolver.restoreAbsolute (source);
5332
+ }
5333
+ return null ;
5334
+ }
5335
+ }
0 commit comments