Chromium Code Reviews| 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) { |
|
vsm
2015/07/16 13:58:16
Will this ever fail? It's checking if a factory i
Jennifer Messerly
2015/07/16 16:36:19
doh! good catch :)
|
| + 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); |
| -} |