| 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); | 
| -} | 
|  |