class IRB::SourceFinder::Source

Attributes

file[R]
line[R]

Public Class Methods

new(file, line, ast_source = nil) click to toggle source
# File lib/irb/source_finder.rb, line 11
def initialize(file, line, ast_source = nil)
  @file = file
  @line = line
  @ast_source = ast_source
end

Public Instance Methods

binary_file?() click to toggle source
# File lib/irb/source_finder.rb, line 21
def binary_file?
  # If the line is zero, it means that the target's source is probably in a binary file.
  @line.zero?
end
colorized_content() click to toggle source
# File lib/irb/source_finder.rb, line 30
def colorized_content
  if !binary_file? && file_exist?
    end_line = find_end
    # To correctly colorize, we need to colorize full content and extract the relevant lines.
    colored = IRB::Color.colorize_code(file_content)
    colored.lines[@line - 1...end_line].join
  elsif @ast_source
    IRB::Color.colorize_code(@ast_source)
  end
end
file_content() click to toggle source
# File lib/irb/source_finder.rb, line 26
def file_content
  @file_content ||= File.read(@file)
end
file_exist?() click to toggle source
# File lib/irb/source_finder.rb, line 17
def file_exist?
  File.exist?(@file)
end

Private Instance Methods

find_end() click to toggle source
# File lib/irb/source_finder.rb, line 43
def find_end
  lex = RubyLex.new
  code = file_content
  lines = code.lines[(@line - 1)..-1]
  tokens = RubyLex.ripper_lex_without_warning(lines.join)
  prev_tokens = []

  # chunk with line number
  tokens.chunk { |tok| tok.pos[0] }.each do |lnum, chunk|
    code = lines[0..lnum].join
    prev_tokens.concat chunk
    continue = lex.should_continue?(prev_tokens)
    syntax = lex.check_code_syntax(code, local_variables: [])
    if !continue && syntax == :valid
      return @line + lnum
    end
  end
  @line
end