class RubyLex
def self.interpolate_ripper_ignored_tokens(code, tokens)
Example: DATA part, token after heredoc_beg when heredoc has unclosed embexpr.
Some part of the code is not included in Ripper's token.
def self.interpolate_ripper_ignored_tokens(code, tokens) line_positions = [0] code.lines.each do |line| line_positions << line_positions.last + line.bytesize end prev_byte_pos = 0 interpolated = [] prev_line = 1 tokens.each do |t| line, col = t.pos byte_pos = line_positions[line - 1] + col if prev_byte_pos < byte_pos tok = code.byteslice(prev_byte_pos...byte_pos) pos = [prev_line, prev_byte_pos - line_positions[prev_line - 1]] interpolated << Ripper::Lexer::Elem.new(pos, :on_ignored_by_ripper, tok, 0) prev_line += tok.count("\n") end interpolated << t prev_byte_pos = byte_pos + t.tok.bytesize prev_line += t.tok.count("\n") end if prev_byte_pos < code.bytesize tok = code.byteslice(prev_byte_pos..) pos = [prev_line, prev_byte_pos - line_positions[prev_line - 1]] interpolated << Ripper::Lexer::Elem.new(pos, :on_ignored_by_ripper, tok, 0) end interpolated end