anchor.diff:      % has a bug that chokes on {Line, Col} locations in typed record
       % definitions
       TokensWithOnlyLineNumbers = flatten_token_locations(ProcessedTokens),
  -    {Forms, Errors}           = parse_tokens(TokensWithOnlyLineNumbers, FileName),
  +
  +    Version = otp_version(),
  +    {Forms, Errors}           = parse_tokens(TokensWithOnlyLineNumbers, FileName, Version),
       parse_has_errors(TokenInfo, Forms, Errors).
   
   
  
positive.code:     TransformFun(Tokens).
  
  
  parse_tokens(Tokens, FileName) ->
      parse_tokens(Tokens, [], [], [], FileName).
  
  parse_tokens([], _, FormAcc, ErrorAcc, _) ->
      {lists:reverse(FormAcc), lists:reverse(ErrorAcc)};
  parse_tokens([{dot, _}=Token|Rest], TokenAcc, FormAcc, ErrorAcc, FileName) ->
      case erl_parse:parse_form(lists:reverse([Token|TokenAcc])) of
          {ok, {attribute, _, file, {NewFileName, _Line}} = AbsForm} ->
              parse_tokens(Rest, [], [AbsForm|FormAcc], ErrorAcc, NewFileName);
          {ok, {attribute, La, record, {Record, Fields}} = AbsForm} ->
              case epp:normalize_typed_record_fields(Fields) of
                  {typed, NewFields} ->
                      parse_tokens(Rest, [], lists:reverse([
                                  {attribute, La, record, {Record, NewFields}},
                                  {attribute, La, type, {{record, Record}, Fields, []}}],
                              FormAcc), ErrorAcc, FileName);
                  not_typed ->
                      parse_tokens(Rest, [], [AbsForm|FormAcc], ErrorAcc, FileName)
              end;
          {ok, AbsForm} ->
              parse_tokens(Rest, [], [AbsForm|FormAcc], ErrorAcc, FileName);
          {error, ErrorInfo} ->
              parse_tokens(Rest, [], FormAcc, [{FileName, ErrorInfo}|ErrorAcc], FileName)
      end;
  parse_tokens([{eof, Location}], TokenAcc, FormAcc, ErrorAcc, FileName) ->
      parse_tokens([], TokenAcc, [{eof, Location}|FormAcc], ErrorAcc, FileName);
  parse_tokens([Token|Rest], TokenAcc, FormAcc, ErrorAcc, FileName) ->
      parse_tokens(Rest, [Token|TokenAcc], FormAcc, ErrorAcc, FileName).
  
  scan_transform(FileContents) ->
      scan_transform(FileContents, {1, 1}).
  
negative.code: -spec parse_text('undefined' | [atom() | [any()] | char()],binary(),_,_) -> {'error',{'undefined' | [any()],[any(),...]}} |
                                                                              {'error',[{_,_}]} |
                                                                              {'ok',[any()],_}.
  -spec parse_tokens([any()],'undefined' | [atom() | [any()] | char()], otp_version()) -> {[any()],[{_,_}]}.
  -spec parse_tokens([any()],[any()],[any()],[{_,{_,_,_}}],_, otp_version()) -> {[any()],[{_,_}]}.
  -spec scan_transform(binary()) -> syntaxTree().
  -spec scan_transform('eof' | binary() | string(),integer() | {integer(),pos_integer()}) -> {'error',{integer() | {_,_},atom() | tuple(),_}} | {'ok',[{_,_} | {_,_,_},...]}.
  -spec transform_char(special_char() |char()) -> 'error' | {'ok',[any()]}.
  