anchor.diff:    }
   
     @override
  -  String get name => cmdName;
  -
  -  @override
  -  String get description => cmdDescription;
  -
  -  @override
  -  String get invocation {
  -    return '${super.invocation} [project or directory]';
  -  }
  -
  -  @override
     ArgParser get argParser {
       // We override this in order to configure the help text line wrapping.
       return _argParser ??= ArgParser(
         usageLineLength: stdout.hasTerminal ? stdout.terminalColumns : null,
       );
     }
  +
  +  @override
  +  String get description => cmdDescription;
  +
  +  @override
  +  String get invocation {
  +    return '${super.invocation} [project or directory]';
  +  }
  +
  +  @override
  +  String get name => cmdName;
   
     @override
     FutureOr<int> run() async {
  
positive.code:       for (var edit in edits)
          edit.offset: [AtomicEdit.replace(edit.length, edit.replacement)]
      };
    }
  }
  
  /// The result of a round of static analysis; primarily a list of
  /// [AnalysisError]s.
  class AnalysisResult {
    final List<AnalysisError> errors;
    final Map<String, LineInfo> lineInfo;
    final Context pathContext;
    final String rootDirectory;
  
    AnalysisResult(
        this.errors, this.lineInfo, this.pathContext, this.rootDirectory) {
      errors.sort((AnalysisError one, AnalysisError two) {
        if (one.source != two.source) {
          return one.source.fullName.compareTo(two.source.fullName);
        }
        return one.offset - two.offset;
      });
    }
  
    bool get hasErrors => errors.isNotEmpty;
  
    /// Whether the errors include any which may be the result of not yet having
    /// run "pub get".
    bool get hasImportErrors => errors.any(
        (error) => error.errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST);
  
    /// Converts the list of errors into JSON, for displaying in the web preview.
    List<Map<String, dynamic>> toJson() {
      var result = <Map<String, dynamic>>[];
      // severity • Message ... at foo/bar.dart:6:1 • (error_code)
      for (var error in errors) {
        var lineInfoForThisFile = lineInfo[error.source.fullName];
        var location = lineInfoForThisFile.getLocation(error.offset);
        var path =
            pathContext.relative(error.source.fullName, from: rootDirectory);
        result.add({
          'severity': error.severity.name,
          'message': _removePeriod(error.message),
          'location': '$path:${location.lineNumber}:${location.columnNumber}',
          'code': error.errorCode.name.toLowerCase(),
        });
      }
      return result;
    }
  }
  
  
negative.code:   return value.endsWith('.') ? value.substring(0, value.length - 1) : value;
  }
  
  /// The result of a round of static analysis; primarily a list of
  /// [AnalysisError]s.
  class AnalysisResult {
    final List<AnalysisError> errors;
    final Map<String, LineInfo> lineInfo;
    final Context pathContext;
    final String rootDirectory;
  
    AnalysisResult(
        this.errors, this.lineInfo, this.pathContext, this.rootDirectory) {
      errors.sort((AnalysisError one, AnalysisError two) {
        if (one.source != two.source) {
          return one.source.fullName.compareTo(two.source.fullName);
        }
        return one.offset - two.offset;
      });
    }
  
    bool get hasErrors => errors.isNotEmpty;
  
    /// Whether the errors include any which may be the result of not yet having
    /// run "pub get".
    bool get hasImportErrors => errors.any(
        (error) => error.errorCode == CompileTimeErrorCode.URI_DOES_NOT_EXIST);
  
    /// Converts the list of errors into JSON, for displaying in the web preview.
    List<Map<String, dynamic>> toJson() {
      var result = <Map<String, dynamic>>[];
      // severity • Message ... at foo/bar.dart:6:1 • (error_code)
      for (var error in errors) {
        var lineInfoForThisFile = lineInfo[error.source.fullName];
        var location = lineInfoForThisFile.getLocation(error.offset);
        var path =
            pathContext.relative(error.source.fullName, from: rootDirectory);
        result.add({
          'severity': error.severity.name,
          'message': _removePeriod(error.message),
          'location': '$path:${location.lineNumber}:${location.columnNumber}',
          'code': error.errorCode.name.toLowerCase(),
        });
      }
      return result;
    }
  }
  
  /// Data structure recording command-line options for the migration tool that
  /// have been passed in by the client.
  class CommandLineOptions {
  