Class: Solargraph::Position

Inherits:
Object
  • Object
show all
Includes:
Equality
Defined in:
lib/solargraph/position.rb

Overview

The zero-based line and column numbers of a position in a string.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Equality

#eql?, #freeze, #hash

Constructor Details

#initialize(line, character) ⇒ Position

Returns a new instance of Position.

Parameters:



19
20
21
22
# File 'lib/solargraph/position.rb', line 19

def initialize line, character
  @line = line
  @character = character
end

Instance Attribute Details

#characterInteger (readonly) Also known as: column

Returns:



13
14
15
# File 'lib/solargraph/position.rb', line 13

def character
  @character
end

#lineInteger (readonly)

Returns:



10
11
12
# File 'lib/solargraph/position.rb', line 10

def line
  @line
end

Class Method Details

.from_offset(text, offset) ⇒ Position

Get a position for the specified text and offset.

Parameters:

Returns:

Raises:

  • if the offset is outside the text range



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/solargraph/position.rb', line 96

def self.from_offset text, offset
  raise InvalidOffsetError if offset > text.length

  cursor = 0
  line = 0
  character = offset
  newline_index = -1

  while (newline_index = text.index("\n", newline_index + 1)) && newline_index < offset
    line += 1
    character = offset - newline_index - 1
  end
  character = 0 if character.nil? and (cursor - offset).between?(0, 1)
  raise InvalidOffsetError if character.nil?
  Position.new(line, character)
end

.line_char_to_offset(text, line, character) ⇒ Integer

Get a numeric offset for the specified text and a position identified by its line and character.

Parameters:

Returns:



85
86
87
# File 'lib/solargraph/position.rb', line 85

def self.line_char_to_offset text, line, character
  to_offset(text, Position.new(line, character))
end

.normalize(object) ⇒ Position

A helper method for generating positions from arrays of integers. The original parameter is returned if it is already a position.

Parameters:

Returns:

Raises:

  • if the object cannot be converted to a position.



120
121
122
123
124
# File 'lib/solargraph/position.rb', line 120

def self.normalize object
  return object if object.is_a?(Position)
  return Position.new(object[0], object[1]) if object.is_a?(Array)
  raise ArgumentError, "Unable to convert #{object.class} to Position"
end

.to_offset(text, position) ⇒ Integer

Get a numeric offset for the specified text and position.

Parameters:

Returns:



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/solargraph/position.rb', line 59

def self.to_offset text, position
  return 0 if text.empty?

  newline_index = -1
  line = -1
  last_line_index = 0

  while (newline_index = text.index("\n", newline_index + 1)) && line <= position.line
    line += 1
    break if line == position.line

    line_length = newline_index - last_line_index
    last_line_index = newline_index
  end

  last_line_index += 1 if position.line > 0
  last_line_index + position.character
end

Instance Method Details

#<=>(other) ⇒ Object

Parameters:



30
31
32
33
34
35
36
37
# File 'lib/solargraph/position.rb', line 30

def <=>(other)
  return nil unless other.is_a?(Position)
  if line == other.line
    character <=> other.character
  else
    line <=> other.line
  end
end

#==(other) ⇒ Object



126
127
128
129
130
# File 'lib/solargraph/position.rb', line 126

def == other
  return false unless other.is_a?(Position)
  # @sg-ignore https://github.com/castwide/solargraph/pull/1114
  line == other.line and character == other.character
end

#inspectObject



50
51
52
# File 'lib/solargraph/position.rb', line 50

def inspect
  "#<#{self.class} #{line}, #{character}>"
end

#to_hashHash

Get a hash of the position. This representation is suitable for use in the language server protocol.

Returns:



43
44
45
46
47
48
# File 'lib/solargraph/position.rb', line 43

def to_hash
  {
    line: line,
    character: character
  }
end