anchor.diff:  import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
   import 'package:analysis_server/src/utilities/flutter.dart';
   import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
  +import 'package:analyzer/dart/analysis/context_root.dart';
   import 'package:analyzer/dart/analysis/results.dart';
   import 'package:analyzer/dart/ast/ast.dart';
   import 'package:analyzer/dart/ast/token.dart';
  
positive.code:     var computer = RelevanceMetricsComputer();
      var stopwatch = Stopwatch();
      stopwatch.start();
      await computer.compute(rootPath,
          corpus: result['corpus'], verbose: result['verbose']);
      stopwatch.stop();
  
      var duration = Duration(milliseconds: stopwatch.elapsedMilliseconds);
  
negative.code:     return columnWidths;
    }
  
    /// Compute the metrics for the files in the context [root], creating a
    /// separate context collection to prevent accumulating memory. The metrics
    /// should be captured in the [collector]. Include additional details in the
    /// output if [verbose] is `true`.
    void _computeInContext(ContextRoot root, RelevanceDataCollector collector,
        {@required bool verbose}) async {
      // Create a new collection to avoid consuming large quantities of memory.
      final collection = AnalysisContextCollection(
        includedPaths: root.includedPaths.toList(),
        excludedPaths: root.excludedPaths.toList(),
        resourceProvider: PhysicalResourceProvider.INSTANCE,
      );
      var context = collection.contexts[0];
      for (var filePath in context.contextRoot.analyzedFiles()) {
        if (AnalysisEngine.isDartFileName(filePath)) {
          try {
            ResolvedUnitResult resolvedUnitResult =
                await context.currentSession.getResolvedUnit(filePath);
            //
            // Check for errors that cause the file to be skipped.
            //
            if (resolvedUnitResult == null) {
              print('File $filePath skipped because resolved unit was null.');
              if (verbose) {
                print('');
              }
              continue;
            } else if (resolvedUnitResult.state != ResultState.VALID) {
              print('File $filePath skipped because it could not be analyzed.');
              if (verbose) {
                print('');
              }
              continue;
            } else if (hasError(resolvedUnitResult)) {
              if (verbose) {
                print('File $filePath skipped due to errors:');
                for (var error in resolvedUnitResult.errors
                    .where((e) => e.severity == Severity.error)) {
                  print('  ${error.toString()}');
                }
                print('');
              } else {
                print('File $filePath skipped due to analysis errors.');
              }
              continue;
            }
  
            collector.initializeFrom(resolvedUnitResult);
            resolvedUnitResult.unit.accept(collector);
          } catch (exception, stacktrace) {
            print('Exception caught analyzing: "$filePath"');
            print(exception);
            print(stacktrace);
          }
        }
      }
    }
  
    Iterable<List<String>> _convertColumnsToRows(
  