anchor.diff:      token = token.next;
       expectToken(token, TokenType.OPEN_SQUARE_BRACKET, 14, 1);
       BeginToken openSquareBracket = token;
  +    expect(openSquareBracketErrorToken.begin, same(openSquareBracket));
   
       token = token.next;
       expectToken(token, TokenType.CLOSE_SQUARE_BRACKET, 15, 0,
  
positive.code:   }
  
    void test_linestarts() {
      var scanner = createScanner("var\r\ni\n=\n1;\n");
      var token = scanner.tokenize();
      expect(token.lexeme, 'var');
      var lineStarts = scanner.lineStarts;
      expect(lineStarts, orderedEquals([0, 5, 7, 9, 12, 13]));
    }
  
    void test_linestarts_synthetic_string() {
      var scanner = createScanner("var\r\ns\n=\n'eh'\n'eh\n;\n");
      Token firstToken = scanner.tokenize();
      expect(firstToken.lexeme, 'var');
      var lineStarts = scanner.lineStarts;
      expect(lineStarts, orderedEquals([0, 5, 7, 9, 14, 18, 20, 21]));
      var token = firstToken;
      int index = 0;
      while (!token.isEof) {
        if (token is fasta.ErrorToken) {
          expect(token.charOffset, 14,
              reason: 'error token : $token, ${token.type}');
          expect(token.charCount, 3,
              reason: 'error token : $token, ${token.type}');
        } else {
          expect(token.charOffset, lineStarts[index],
              reason: 'token # $index : $token, ${token.type}');
          ++index;
        }
        token = token.next;
      }
    }
  
    void test_linestarts_synthetic_string_utf8() {
      var scanner = createScanner("var\r\ns\n=\n'éh'\n'éh\n;\n");
      Token firstToken = scanner.tokenize();
      expect(firstToken.lexeme, 'var');
      var lineStarts = scanner.lineStarts;
      expect(lineStarts, orderedEquals([0, 5, 7, 9, 14, 18, 20, 21]));
      var token = firstToken;
      int index = 0;
      while (!token.isEof) {
        if (token is! fasta.ErrorToken) {
          expect(token.charOffset, lineStarts[index],
              reason: 'token # $index : $token, ${token.type}');
          ++index;
        }
        token = token.next;
      }
    }
  
negative.code:         lexeme: '', isSynthetic: true);
  
      token = token.next;
      expectToken(token, TokenType.STRING, 4, 1, lexeme: "'");
    }
  
    void test_string_simple_unterminated_interpolation_block() {
      Token token = scan(r'"foo ${bar');
      expect((token as fasta.ErrorToken).errorCode, same(codeUnmatchedToken));
      var interpolationStartErrorToken = token as fasta.UnmatchedToken;
  
      token = token.next;
      expect((token as fasta.ErrorToken).errorCode, same(codeUnterminatedString));
      expect((token as fasta.UnterminatedString).start, '"');
  
      token = token.next;
      expectToken(token, TokenType.STRING, 0, 5, lexeme: '"foo ');
  
      token = token.next;
      expectToken(token, TokenType.STRING_INTERPOLATION_EXPRESSION, 5, 2);
      BeginToken interpolationStart = token;
      expect(interpolationStartErrorToken.begin, same(interpolationStart));
  
      token = token.next;
      expectToken(token, TokenType.IDENTIFIER, 7, 3, lexeme: 'bar');
  