| Index: lib/src/analysis_context.dart
|
| diff --git a/lib/src/analysis_context.dart b/lib/src/analysis_context.dart
|
| index e323783f9b043992641a04f9346ddc74fa5a2cf1..aa694e6af3e3b7a44018055357372fd55ace79e1 100644
|
| --- a/lib/src/analysis_context.dart
|
| +++ b/lib/src/analysis_context.dart
|
| @@ -4,14 +4,11 @@
|
|
|
| library dev_compiler.src.analysis_context;
|
|
|
| -import 'package:analyzer/file_system/file_system.dart';
|
| -import 'package:analyzer/file_system/memory_file_system.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| import 'package:analyzer/src/generated/java_io.dart' show JavaFile;
|
| import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
|
| import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
|
| import 'package:analyzer/src/generated/source_io.dart';
|
| -import 'package:path/path.dart' as path;
|
|
|
| import 'package:dev_compiler/strong_mode.dart' show StrongModeOptions;
|
|
|
| @@ -33,11 +30,20 @@ AnalysisContext createAnalysisContextWithSources(
|
| /// Creates an analysis context that contains our restricted typing rules.
|
| AnalysisContext createAnalysisContext(StrongModeOptions options) {
|
| AnalysisContextImpl res = AnalysisEngine.instance.createAnalysisContext();
|
| - res.libraryResolverFactory =
|
| - (context) => new LibraryResolverWithInference(context, options);
|
| + enableDevCompilerInference(res, options);
|
| return res;
|
| }
|
|
|
| +/// Enables dev_compiler inference rules.
|
| +// TODO(jmesserly): is there a cleaner way to plug this in?
|
| +void enableDevCompilerInference(
|
| + AnalysisContextImpl context, StrongModeOptions options) {
|
| + if (context.libraryResolverFactory is! LibraryResolverWithInference) {
|
| + context.libraryResolverFactory =
|
| + (c) => new LibraryResolverWithInference(c, options);
|
| + }
|
| +}
|
| +
|
| /// Creates a SourceFactory configured by the [options].
|
| ///
|
| /// Use [options.useMockSdk] to specify the SDK mode, or use [sdkResolver]
|
| @@ -46,7 +52,7 @@ AnalysisContext createAnalysisContext(StrongModeOptions options) {
|
| /// If supplied, [fileResolvers] will override the default `file:` and
|
| /// `package:` URI resolvers.
|
| SourceFactory createSourceFactory(SourceResolverOptions options,
|
| - {DartUriResolver sdkResolver, List fileResolvers}) {
|
| + {DartUriResolver sdkResolver, List<UriResolver> fileResolvers}) {
|
| var sdkResolver = options.useMockSdk
|
| ? createMockSdkResolver(mockSdkSources)
|
| : createSdkPathResolver(options.dartSdkPath);
|
| @@ -56,19 +62,20 @@ SourceFactory createSourceFactory(SourceResolverOptions options,
|
| resolvers.add(new CustomUriResolver(options.customUrlMappings));
|
| }
|
| resolvers.add(sdkResolver);
|
| - if (options.useImplicitHtml) {
|
| - resolvers.add(_createImplicitEntryResolver(options));
|
| - }
|
| - if (fileResolvers == null) {
|
| - fileResolvers = [new FileUriResolver()];
|
| - fileResolvers.add(options.useMultiPackage
|
| - ? new MultiPackageResolver(options.packagePaths)
|
| - : new PackageUriResolver([new JavaFile(options.packageRoot)]));
|
| - }
|
| + if (fileResolvers == null) fileResolvers = createFileResolvers(options);
|
| resolvers.addAll(fileResolvers);
|
| return new SourceFactory(resolvers);
|
| }
|
|
|
| +List<UriResolver> createFileResolvers(SourceResolverOptions options) {
|
| + return [
|
| + new FileUriResolver(),
|
| + options.useMultiPackage
|
| + ? new MultiPackageResolver(options.packagePaths)
|
| + : new PackageUriResolver([new JavaFile(options.packageRoot)])
|
| + ];
|
| +}
|
| +
|
| /// Creates a [DartUriResolver] that uses a mock 'dart:' library contents.
|
| DartUriResolver createMockSdkResolver(Map<String, String> mockSources) =>
|
| new MockDartSdk(mockSources, reportMissing: true).resolver;
|
| @@ -77,26 +84,3 @@ DartUriResolver createMockSdkResolver(Map<String, String> mockSources) =>
|
| DartUriResolver createSdkPathResolver(String sdkPath) => new DartUriResolver(
|
| new DirectoryBasedDartSdk(
|
| new JavaFile(sdkPath), /*useDart2jsPaths:*/ true));
|
| -
|
| -UriResolver _createImplicitEntryResolver(SourceResolverOptions options) {
|
| - var entry = path.absolute(SourceResolverOptions.implicitHtmlFile);
|
| - var src = path.absolute(options.entryPointFile);
|
| - var provider = new MemoryResourceProvider();
|
| - provider.newFile(
|
| - entry, '<body><script type="application/dart" src="$src"></script>');
|
| - return new ExistingSourceUriResolver(new ResourceUriResolver(provider));
|
| -}
|
| -
|
| -/// A UriResolver that continues to the next one if it fails to find an existing
|
| -/// source file. This is unlike normal URI resolvers, that always return
|
| -/// something, even if it is a non-existing file.
|
| -class ExistingSourceUriResolver implements UriResolver {
|
| - final UriResolver resolver;
|
| - ExistingSourceUriResolver(this.resolver);
|
| -
|
| - Source resolveAbsolute(Uri uri) {
|
| - var src = resolver.resolveAbsolute(uri);
|
| - return src.exists() ? src : null;
|
| - }
|
| - Uri restoreAbsolute(Source source) => resolver.restoreAbsolute(source);
|
| -}
|
|
|