class IRB::SourceFinder::Source
Attributes
Public Class Methods
Source
# File bundled-src/irb-1.16.0/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
Source
# File bundled-src/irb-1.16.0/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
Source
# File bundled-src/irb-1.16.0/lib/irb/source_finder.rb, line 30 def colorized_content if !binary_file? && file_exist? # To correctly colorize, we need to colorize full content and extract the relevant lines. colored_lines = IRB::Color.colorize_code(file_content).lines # Handle wrong line number case: line_no passed to eval is wrong, file is edited after load, etc return if colored_lines.size < @line colored_lines[@line - 1...find_end].join elsif @ast_source IRB::Color.colorize_code(@ast_source) end end
Source
# File bundled-src/irb-1.16.0/lib/irb/source_finder.rb, line 26 def file_content @file_content ||= File.read(@file) end
Source
# File bundled-src/irb-1.16.0/lib/irb/source_finder.rb, line 17 def file_exist? File.exist?(@file) end
Private Instance Methods
Source
# File bundled-src/irb-1.16.0/lib/irb/source_finder.rb, line 46 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