anchor.diff:      return null;
     }
   
  +  /// Return whether [a] and [b] options are equal for the purpose of
  +  /// command line analysis.
  +  bool _equalAnalysisOptions(AnalysisOptionsImpl a, AnalysisOptions b) {
  +    return a.enableAssertInitializer == b.enableAssertInitializer &&
  +        a.enableStrictCallChecks == b.enableStrictCallChecks &&
  +        a.enableLazyAssignmentOperators == b.enableLazyAssignmentOperators &&
  +        a.enableSuperMixins == b.enableSuperMixins &&
  +        a.enableTiming == b.enableTiming &&
  +        a.generateImplicitErrors == b.generateImplicitErrors &&
  +        a.generateSdkErrors == b.generateSdkErrors &&
  +        a.hint == b.hint &&
  +        a.lint == b.lint &&
  +        AnalysisOptionsImpl.compareLints(a.lintRules, b.lintRules) &&
  +        a.preserveComments == b.preserveComments &&
  +        a.strongMode == b.strongMode;
  +  }
  +
     _PackageInfo _findPackages(CommandLineOptions options) {
       if (packageResolverProvider != null) {
         // The resolver provider will do all the work later.
  
positive.code:       contextOptions.enableAssertInitializer = options.enableAssertInitializer;
      }
  
      return contextOptions;
    }
  
  
negative.code:     return new SourceFactory(resolvers, packageInfo.packages);
    }
  
    /// Collect all analyzable files at [filePath], recursively if it's a
    /// directory, ignoring links.
    Iterable<io.File> _collectFiles(String filePath) {
      // TODO(devoncarew): This needs to respect analysis_options excludes.
      List<io.File> files = <io.File>[];
      io.File file = new io.File(filePath);
      if (file.existsSync()) {
  