Skip to content

New resolver to untangle embedder SDK problem #1605

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 48 additions & 4 deletions lib/src/model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5056,20 +5056,30 @@ class PackageBuilder {
SourceFactory get sourceFactory {
List<UriResolver> resolvers = [];
resolvers.add(new SdkExtUriResolver(packageMap));
resolvers.add(new PackageMapUriResolver(
PhysicalResourceProvider.INSTANCE, packageMap));
final UriResolver packageResolver = new PackageMapUriResolver(
PhysicalResourceProvider.INSTANCE, packageMap);
UriResolver sdkResolver;
if (embedderSdk == null || embedderSdk.urlMappings.length == 0) {
// The embedder uri resolver has no mappings. Use the default Dart SDK
// uri resolver.
resolvers.add(new DartUriResolver(sdk));
sdkResolver = new DartUriResolver(sdk);
} else {
// The embedder uri resolver has mappings, use it instead of the default
// Dart SDK uri resolver.
resolvers.add(embedderResolver);
sdkResolver = embedderResolver;
}

/// [AnalysisDriver] seems to require package resolvers that
/// never resolve to embedded SDK files, and the resolvers list must still
/// contain a DartUriResolver. This hack won't be necessary once analyzer
/// has a clean public API.
resolvers.add(new PackageWithoutSdkResolver(packageResolver, sdkResolver));
resolvers.add(sdkResolver);
resolvers.add(
new fileSystem.ResourceUriResolver(PhysicalResourceProvider.INSTANCE));

assert(
resolvers.any((UriResolver resolver) => resolver is DartUriResolver));
SourceFactory sourceFactory = new SourceFactory(resolvers);
return sourceFactory;
}
Expand Down Expand Up @@ -5289,3 +5299,37 @@ class PackageBuilder {
}
}
}

/// This class resolves package URIs, but only if a given SdkResolver doesn't
/// resolve them.
///
/// TODO(jcollins-g): remove this hackery when a clean public API to analyzer
/// exists, and port dartdoc to it.
class PackageWithoutSdkResolver extends UriResolver {
final UriResolver _packageResolver;
final UriResolver _sdkResolver;

PackageWithoutSdkResolver(this._packageResolver, this._sdkResolver);

@override
Source resolveAbsolute(Uri uri, [Uri actualUri]) {
if (_sdkResolver.resolveAbsolute(uri, actualUri) == null) {
return _packageResolver.resolveAbsolute(uri, actualUri);
}
return null;
}

@override
Uri restoreAbsolute(Source source) {
Uri resolved;
try {
resolved = _sdkResolver.restoreAbsolute(source);
} catch (ArgumentError) {
// SDK resolvers really don't like being thrown package paths.
}
if (resolved == null) {
return _packageResolver.restoreAbsolute(source);
}
return null;
}
}
2 changes: 1 addition & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -415,4 +415,4 @@ packages:
source: hosted
version: "2.1.13"
sdks:
dart: ">=2.0.0-dev <=2.0.0-dev.22.0"
dart: ">=2.0.0-dev <=2.0.0-dev.24.0"