Class: Prism::Source

Inherits:
Object
  • Object
show all
Defined in:
lib/prism/parse_result.rb,
ext/prism/extension.c

Overview

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.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source, start_line = 1, offsets = compute_offsets(source)) ⇒ 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.



20
21
22
23
24
# 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

Instance Attribute Details

#offsetsObject (readonly)

The list of newline byte offsets in the source code.



15
16
17
# File 'lib/prism/parse_result.rb', line 15

def offsets
  @offsets
end

#sourceObject (readonly)

The source code that this source object represents.



9
10
11
# File 'lib/prism/parse_result.rb', line 9

def source
  @source
end

#start_lineObject

The line number where this source starts.



12
13
14
# File 'lib/prism/parse_result.rb', line 12

def start_line
  @start_line
end

Instance Method Details

#character_column(byte_offset) ⇒ Object

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



55
56
57
# 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) ⇒ Object

Return the character offset for the given byte offset.



50
51
52
# File 'lib/prism/parse_result.rb', line 50

def character_offset(byte_offset)
  source.byteslice(0, byte_offset).length
end

#column(byte_offset) ⇒ Object

Return the column number for the given byte offset.



45
46
47
# File 'lib/prism/parse_result.rb', line 45

def column(byte_offset)
  byte_offset - line_start(byte_offset)
end

#line(byte_offset) ⇒ Object

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



34
35
36
# File 'lib/prism/parse_result.rb', line 34

def line(byte_offset)
  start_line + find_line(byte_offset)
end

#line_start(byte_offset) ⇒ Object

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



40
41
42
# File 'lib/prism/parse_result.rb', line 40

def line_start(byte_offset)
  offsets[find_line(byte_offset)]
end

#slice(byte_offset, length) ⇒ Object

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



28
29
30
# File 'lib/prism/parse_result.rb', line 28

def slice(byte_offset, length)
  source.byteslice(byte_offset, length)
end