Class: LanguageServer::Protocol::Interface::Position

Inherits:
Object
  • Object
show all
Defined in:
lib/language_server/protocol/interface/position.rb,
sig/language_server/protocol/interface/position.rbs

Overview

Position in a text document expressed as zero-based line and character offset. Prior to 3.17 the offsets were always based on a UTF-16 string representation. So a string of the form a𐐀b the character offset of the character a is 0, the character offset of 𐐀 is 1 and the character offset of b is 3 since 𐐀 is represented using two code units in UTF-16. Since 3.17 clients and servers can agree on a different string encoding representation (e.g. UTF-8). The client announces it's supported encoding via the client capability general.positionEncodings. The value is an array of position encodings the client supports, with decreasing preference (e.g. the encoding at index 0 is the most preferred one). To stay backwards compatible the only mandatory encoding is UTF-16 represented via the string utf-16. The server can pick one of the encodings offered by the client and signals that encoding back to the client via the initialize result's property capabilities.positionEncoding. If the string value utf-16 is missing from the client's capability general.positionEncodings servers can safely assume that the client supports UTF-16. If the server omits the position encoding in its initialize result the encoding defaults to the string value utf-16. Implementation considerations: since the conversion from one encoding into another requires the content of the file / line the conversion is best done where the file is read which is usually on the server side.

Positions are line end character agnostic. So you can not specify a position that denotes \r|\n or \n| where | represents the character offset.

Since:

  • 3.17.0 - support for negotiated position encoding.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(line:, character:) ⇒ Position

Returns a new instance of Position.

Parameters:

  • line: (Integer)
  • character: (Integer)

Since:

  • 3.17.0 - support for negotiated position encoding.



34
35
36
37
38
39
40
41
# File 'lib/language_server/protocol/interface/position.rb', line 34

def initialize(line:, character:)
  @attributes = {}

  @attributes[:line] = line
  @attributes[:character] = character

  @attributes.freeze
end

Instance Attribute Details

#attributesHash[Symbol, untyped] (readonly)

Returns:

  • (Hash[Symbol, untyped])

Since:

  • 3.17.0 - support for negotiated position encoding.



68
69
70
# File 'lib/language_server/protocol/interface/position.rb', line 68

def attributes
  @attributes
end

Instance Method Details

#characteruinteger

Character offset on a line in a document (zero-based).

The meaning of this offset is determined by the negotiated PositionEncodingKind.

If the character value is greater than the line length it defaults back to the line length.

Returns:

  • (uinteger)

Since:

  • 3.17.0 - support for negotiated position encoding.



64
65
66
# File 'lib/language_server/protocol/interface/position.rb', line 64

def character
  attributes.fetch(:character)
end

#lineuinteger

Line position in a document (zero-based).

If a line number is greater than the number of lines in a document, it defaults back to the number of lines in the document. If a line number is negative, it defaults to 0.

Returns:

  • (uinteger)

Since:

  • 3.17.0 - support for negotiated position encoding.



50
51
52
# File 'lib/language_server/protocol/interface/position.rb', line 50

def line
  attributes.fetch(:line)
end

#to_hashHash[Symbol, untyped]

Returns:

  • (Hash[Symbol, untyped])

Since:

  • 3.17.0 - support for negotiated position encoding.



70
71
72
# File 'lib/language_server/protocol/interface/position.rb', line 70

def to_hash
  attributes
end

#to_json(*args) ⇒ String

Parameters:

  • (Object)

Returns:

  • (String)

Since:

  • 3.17.0 - support for negotiated position encoding.



74
75
76
# File 'lib/language_server/protocol/interface/position.rb', line 74

def to_json(*args)
  to_hash.to_json(*args)
end