anchor.diff:      lineStarts.add(offset - column + 1);
     }
   
  -  @override
     Token tokenize() {
       fasta.ScannerResult result = fasta.scanString(_contents,
           includeComments: _preserveComments,
  
positive.code:    */
    bool _preserveComments = true;
  
    @override
    final List<int> lineStarts = <int>[];
  
    @override
    Token firstToken;
  
    @override
    bool scanGenericMethodComments = false;
  
    @override
    bool scanLazyAssignmentOperators = false;
  
    _Scanner2(
        this.source, this._contents, this._readerOffset, this._errorListener) {
      lineStarts.add(0);
    }
  
    @override
    bool get hasUnmatchedGroups {
      throw 'unsupported operation';
    }
  
    @override
    set preserveComments(bool preserveComments) {
      this._preserveComments = preserveComments;
    }
  
    @override
    Token get tail {
      throw 'unsupported operation';
    }
  
    @override
    void appendToken(Token token) {
      throw 'unsupported operation';
    }
  
    @override
    int bigSwitch(int next) {
      throw 'unsupported operation';
    }
  
    @override
    void recordStartOfLine() {
      throw 'unsupported operation';
    }
  
    @override
    void reportError(
        ScannerErrorCode errorCode, int offset, List<Object> arguments) {
      _errorListener
          .onError(new AnalysisError(source, offset, 1, errorCode, arguments));
    }
  
    @override
    void setSourceStart(int line, int column) {
      int offset = _readerOffset;
      if (line < 1 || column < 1 || offset < 0 || (line + column - 2) >= offset) {
  
negative.code:  * any context, so it always resolves such conflicts by scanning the longest
   * possible token.
   */
  class Scanner {
    final Source source;
  
    /**
  