anchor.diff:        }
       }
     }
  +
  +  @override
  +  void onServerStatus(ServerStatusParams event) {
  +    if (event.analysis != null) {
  +      _serverStatusController.add(event);
  +    }
  +  }
   }
  -
  -class _ServerListener with ServerListener {
  -  final Logger logger;
  -
  -  _ServerListener(this.logger);
  -
  -  @override
  -  void log(String prefix, String details) {
  -    logger.trace('[$prefix] $details');
  -  }
  -}
  -
  -String get _dartSdkVersion {
  -  String version = Platform.version;
  -
  -  // Remove the build date and OS.
  -  if (version.contains(' ')) {
  -    version = version.substring(0, version.indexOf(' '));
  -  }
  -
  -  // Convert a git hash to 8 chars.
  -  // '2.8.0-edge.fd992e423ef69ece9f44bd3ac58fa2355b563212'
  -  final RegExp versionRegExp = RegExp(r'^.*\.([0123456789abcdef]+)$');
  -  RegExpMatch match = versionRegExp.firstMatch(version);
  -  if (match != null && match.group(1).length == 40) {
  -    String commit = match.group(1);
  -    version = version.replaceAll(commit, commit.substring(0, 10));
  -  }
  -
  -  return version;
  -}
  
positive.code: 
      return MigrateOptions(argResults, dirPath);
    }
  
    void _displayIssues(
      Logger logger,
      String directory,
      List<AnalysisError> issues,
    ) {
      issues.sort((AnalysisError one, AnalysisError two) {
        if (one.location.file != two.location.file) {
          return one.location.file.compareTo(two.location.file);
        }
        return one.location.offset - two.location.offset;
      });
  
      IssueRenderer renderer = IssueRenderer(logger, directory);
      for (AnalysisError issue in issues) {
        renderer.render(issue);
      }
    }
  
    void _displayChangeSummary(
      Logger logger,
      String directory,
      EditDartfixResult migrationResults,
    ) {
      final Ansi ansi = logger.ansi;
  
      Map<String, List<DartFixSuggestion>> fileSuggestions = {};
      for (DartFixSuggestion suggestion in migrationResults.suggestions) {
        String file = suggestion.location.file;
        fileSuggestions.putIfAbsent(file, () => <DartFixSuggestion>[]);
        fileSuggestions[file].add(suggestion);
      }
  
      // present a diff-like view
      for (SourceFileEdit sourceFileEdit in migrationResults.edits) {
        String file = sourceFileEdit.file;
        String relPath = path.relative(file, from: directory);
        int count = sourceFileEdit.edits.length;
  
        logger.stdout('');
        logger.stdout('${ansi.emphasized(relPath)} '
            '($count ${pluralize('change', count)}):');
  
        String source;
        try {
          source = File(file).readAsStringSync();
        } catch (_) {}
  
        if (source == null) {
          logger.stdout('  (unable to retrieve source for file)');
        } else {
          SourcePrinter sourcePrinter = SourcePrinter(source);
  
          List<SourceEdit> edits = sortEdits(sourceFileEdit);
  
          // Apply edits.
          sourcePrinter.applyEdits(edits);
  
          // Render the changed lines.
          sourcePrinter.processChangedLines((lineNumber, lineText) {
            String prefix = '  line ${lineNumber.toString().padRight(3)} •';
            logger.stdout('$prefix ${lineText.trim()}');
          });
        }
      }
    }
  
    void _applyMigrationSuggestions(
      Logger logger,
      String directory,
      EditDartfixResult migrationResults,
    ) {
      // Apply the changes to disk.
      for (SourceFileEdit sourceFileEdit in migrationResults.edits) {
        String relPath = path.relative(sourceFileEdit.file, from: directory);
        int count = sourceFileEdit.edits.length;
        logger.stdout('  $relPath ($count ${pluralize('change', count)})');
  
        String source;
        try {
          source = File(sourceFileEdit.file).readAsStringSync();
        } catch (_) {}
  
        if (source == null) {
          logger.stdout('    Unable to retrieve source for file.');
        } else {
          source = applyEdits(sourceFileEdit, source);
  
          try {
            File(sourceFileEdit.file).writeAsStringSync(source);
          } catch (e) {
            logger.stdout('    Unable to write source for file: $e');
          }
        }
      }
    }
  
    Future _blockUntilSignalInterrupt() {
      Stream<ProcessSignal> stream = ProcessSignal.sigint.watch();
      return stream.first;
    }
  }
  
  
negative.code:     return completer.future;
    }
  
    Stream<ServerStatusParams> get serverStatusEvents =>
        _serverStatusController.stream;
  
    Future listenToServer(Server server) async {
      server.listenToOutput(notificationProcessor: handleEvent);
  
      await server.send(SERVER_REQUEST_SET_SUBSCRIPTIONS,
          ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
    }
  
    @override
    void onAnalysisErrors(AnalysisErrorsParams event) {
      _analysisErrorsController.add(event);
  