# 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