# class Prism::Source

This represents a source of Ruby code that has been parsed. It is used in conjunction with locations to allow them to resolve line numbers and source ranges.

### Attributes

offsets[R]

The list of newline byte offsets in the source code.

source[R]

The source code that this source object represents.

start_line[RW]

The line number where this source starts.

### Public Class Methods

new(source, start_line = 1, offsets = compute_offsets(source)) click to toggle source

Create a new source object with the given source code and newline byte offsets. If no newline byte offsets are given, they will be computed from the source code.

    # File lib/prism/parse_result.rb, line 20
    def initialize(source, start_line = 1, offsets = compute_offsets(source))
      @source = source
      @start_line = start_line
      @offsets = offsets
    end

### Public Instance Methods

character_column(byte_offset) click to toggle source

Return the column number in characters for the given byte offset.

    # File lib/prism/parse_result.rb, line 55
    def character_column(byte_offset)
      character_offset(byte_offset) - character_offset(line_start(byte_offset))
    end

character_offset(byte_offset) click to toggle source

Return the character offset for the given byte offset.

    # File lib/prism/parse_result.rb, line 50
    def character_offset(byte_offset)
      source.byteslice(0, byte_offset).length
    end

column(byte_offset) click to toggle source

Return the column number for the given byte offset.

    # File lib/prism/parse_result.rb, line 45
    def column(byte_offset)
      byte_offset - line_start(byte_offset)
    end

line(byte_offset) click to toggle source

Binary search through the offsets to find the line number for the given byte offset.

    # File lib/prism/parse_result.rb, line 34
    def line(byte_offset)
      start_line + find_line(byte_offset)
    end

line_start(byte_offset) click to toggle source

Return the byte offset of the start of the line corresponding to the given byte offset.

    # File lib/prism/parse_result.rb, line 40
    def line_start(byte_offset)
      offsets[find_line(byte_offset)]
    end

slice(byte_offset, length) click to toggle source

Perform a byteslice on the source code using the given byte offset and byte length.

    # File lib/prism/parse_result.rb, line 28
    def slice(byte_offset, length)
      source.byteslice(byte_offset, length)
    end

### Private Instance Methods

compute_offsets(code) click to toggle source

`Find` all of the newlines in the source code and return their byte offsets from the start of the string an array.

    # File lib/prism/parse_result.rb, line 83
    def compute_offsets(code)
      offsets = [0]
      code.b.scan("\n") { offsets << $~.end(0) }
      offsets
    end

find_line(byte_offset) click to toggle source

Binary search through the offsets to find the line number for the given byte offset.

    # File lib/prism/parse_result.rb, line 63
    def find_line(byte_offset)
      left = 0
      right = offsets.length - 1

      while left <= right
        mid = left + (right - left) / 2
        return mid if offsets[mid] == byte_offset

        if offsets[mid] < byte_offset
          left = mid + 1
        else
          right = mid - 1
        end
      end

      left - 1
    end