@@ -5056,20 +5056,30 @@ class PackageBuilder {
50565056 SourceFactory get sourceFactory {
50575057 List <UriResolver > resolvers = [];
50585058 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;
50615062 if (embedderSdk == null || embedderSdk.urlMappings.length == 0 ) {
50625063 // The embedder uri resolver has no mappings. Use the default Dart SDK
50635064 // uri resolver.
5064- resolvers. add ( new DartUriResolver (sdk) );
5065+ sdkResolver = new DartUriResolver (sdk);
50655066 } else {
50665067 // The embedder uri resolver has mappings, use it instead of the default
50675068 // Dart SDK uri resolver.
5068- resolvers. add ( embedderResolver) ;
5069+ sdkResolver = embedderResolver;
50695070 }
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);
50705078 resolvers.add (
50715079 new fileSystem.ResourceUriResolver (PhysicalResourceProvider .INSTANCE ));
50725080
5081+ assert (
5082+ resolvers.any ((UriResolver resolver) => resolver is DartUriResolver ));
50735083 SourceFactory sourceFactory = new SourceFactory (resolvers);
50745084 return sourceFactory;
50755085 }
@@ -5289,3 +5299,37 @@ class PackageBuilder {
52895299 }
52905300 }
52915301}
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