anchor.diff:      final sourceResolver = new SourceResolver.fromPackageRoots(
           packageRoots, includeDefaultPackageRoot);
   
  -    return new _SourceCrawler._(sourceResolver);
  +    return new _SourceCrawler._(sourceResolver, allowedDartPaths);
     }
   
  -  _SourceCrawler._(this._sourceResolver);
  +  _SourceCrawler._(this._sourceResolver, [this.allowedDartPaths = const []]);
   
     /// Crawls, starting at [path], invoking [crawlFile] for each file.
     @override
  
positive.code:       bool analyzeFunctionBodies: false,
        bool includeDefaultPackageRoot: true,
        List<String> packageRoots,
        bool preserveComments: false}) => new _SourceCrawler(analyzeFunctionBodies, includeDefaultPackageRoot, packageRoots, preserveComments);
  
    /// Resolves and crawls [path], and all files imported (recursively). Returns
    /// an [Iterable] of all the ASTs parsed.
  
negative.code:   final Map<String, LibraryTuple> _libraries = {};
    final SourceResolver _sourceResolver;
  
    final List<String> allowedDartPaths;
  
    factory _SourceCrawler(
        bool analyzeFunctionBodies,
        bool includeDefaultPackageRoot,
        List<String> packageRoots,
        bool preserveComments,
        List<String> allowedDartPaths) {
      if (packageRoots == null) {
        packageRoots = [Platform.packageRoot];
      }
  