anchor.diff:      lineStarts.add(offset - column + 1);
     }
   
  -  @override
     Token tokenize() {
       fasta.ScannerResult result = fasta.scanString(_contents,
           includeComments: _preserveComments,
  
positive.code:  * any context, so it always resolves such conflicts by scanning the longest
   * possible token.
   */
  class Scanner extends fe.Scanner {
    /**
     * The source being scanned.
     */
    final Source source;
  
    /**
     * The error listener that will be informed of any errors that are found
     * during the scan.
     */
    final AnalysisErrorListener _errorListener;
  
    /**
     * Initialize a newly created scanner to scan characters from the given
     * [source]. The given character [reader] will be used to read the characters
     * in the source. The given [_errorListener] will be informed of any errors
     * that are found.
     */
    factory Scanner(Source source, CharacterReader reader,
            AnalysisErrorListener errorListener) =>
        new Scanner.fasta(source, errorListener,
            contents: reader.getContents(), offset: reader.offset);
  
    factory Scanner.fasta(Source source, AnalysisErrorListener errorListener,
        {String contents, int offset: -1}) {
      return new _Scanner2(
          source, contents ?? source.contents.data, offset, errorListener);
    }
  
    // Deprecated
    Scanner.old(this.source, CharacterReader reader, this._errorListener)
        : super.create(reader);
  
    @override
    void reportError(
        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
      _errorListener
          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
    }
  }
  
  /**
   * Replacement scanner based on fasta.
   */
  class _Scanner2 implements Scanner {
    @override
    final Source source;
  
    /**
  
negative.code:    */
    bool _preserveComments = true;
  
    final List<int> lineStarts = <int>[];
  
    Token firstToken;
  
    bool scanGenericMethodComments = false;
  
    bool scanLazyAssignmentOperators = false;
  
    /**
     * Initialize a newly created scanner to scan characters from the given
     * [source]. The given character [reader] will be used to read the characters
     * in the source. The given [_errorListener] will be informed of any errors
     * that are found.
     */
    factory Scanner(Source source, CharacterReader reader,
            AnalysisErrorListener errorListener) =>
        new Scanner.fasta(source, errorListener,
            contents: reader.getContents(), offset: reader.offset);
  
    factory Scanner.fasta(Source source, AnalysisErrorListener errorListener,
        {String contents, int offset: -1}) {
      return new Scanner._(
          source, contents ?? source.contents.data, offset, errorListener);
    }
  
    Scanner._(
        this.source, this._contents, this._readerOffset, this._errorListener) {
      lineStarts.add(0);
    }
  
    set preserveComments(bool preserveComments) {
      this._preserveComments = preserveComments;
    }
  
    void reportError(
        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
      _errorListener
          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
    }
  
    void setSourceStart(int line, int column) {
      int offset = _readerOffset;
      if (line < 1 || column < 1 || offset < 0 || (line + column - 2) >= offset) {
  