Skip to content

Commit 00c3306

Browse files
authored
New resolver to untangle embedder SDK problem (#1605)
1 parent 29f75aa commit 00c3306

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

lib/src/model.dart

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,4 +415,4 @@ packages:
415415
source: hosted
416416
version: "2.1.13"
417417
sdks:
418-
dart: ">=2.0.0-dev <=2.0.0-dev.22.0"
418+
dart: ">=2.0.0-dev <=2.0.0-dev.24.0"

0 commit comments

Comments
 (0)