Class: Solargraph::Source::Cursor

Inherits:
Object
  • Object
show all
Defined in:
lib/solargraph/source/cursor.rb

Overview

Information about a position in a source, including the word located there.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source, position) ⇒ Cursor

Returns a new instance of Cursor.

Parameters:



17
18
19
20
# File 'lib/solargraph/source/cursor.rb', line 17

def initialize source, position
  @source = source
  @position = Position.normalize(position)
end

Instance Attribute Details

#positionPosition (readonly)

Returns:



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

def position
  @position
end

#sourceSource (readonly)

Returns:



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

def source
  @source
end

Instance Method Details

#argument?Boolean

True if the statement at the cursor is an argument to a previous method.

Given the code ‘process(foo)`, a cursor pointing at `foo` would identify it as an argument being passed to the `process` method.

If #argument? is true, the #recipient method will return a cursor that points to the method receiving the argument.

Returns:

  • (Boolean)


91
92
93
94
# File 'lib/solargraph/source/cursor.rb', line 91

def argument?
  # @argument ||= !signature_position.nil?
  @argument ||= !recipient.nil?
end

#chainChain

Returns:



77
78
79
# File 'lib/solargraph/source/cursor.rb', line 77

def chain
  @chain ||= SourceChainer.chain(source, position)
end

#comment?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/solargraph/source/cursor.rb', line 97

def comment?
  @comment ||= source.comment_at?(position)
end

#end_of_wordString

The part of the word after the current position. Given the text ‘foo.bar`, the end_of_word at position (0,6) is `r`.

Returns:

  • (String)


53
54
55
56
57
58
# File 'lib/solargraph/source/cursor.rb', line 53

def end_of_word
  @end_of_word ||= begin
    match = source.code[offset..-1].to_s.match(end_word_pattern)
    match ? match[0] : ''
  end
end

#filenameString

Returns:

  • (String)


23
24
25
# File 'lib/solargraph/source/cursor.rb', line 23

def filename
  source.filename
end

#nodeObject



118
119
120
# File 'lib/solargraph/source/cursor.rb', line 118

def node
  @node ||= source.node_at(position.line, position.column)
end

#node_positionPosition

Returns:



123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/solargraph/source/cursor.rb', line 123

def node_position
  @node_position ||= begin
    if start_of_word.empty?
      match = source.code[0, offset].match(/[\s]*(\.|:+)[\s]*$/)
      if match
        Position.from_offset(source.code, offset - match[0].length)
      else
        position
      end
    else
      position
    end
  end
end

#offsetInteger

Returns:

  • (Integer)


143
144
145
# File 'lib/solargraph/source/cursor.rb', line 143

def offset
  @offset ||= Position.to_offset(source.code, position)
end

#rangeRange

The range of the word at the current position.

Returns:



68
69
70
71
72
73
74
# File 'lib/solargraph/source/cursor.rb', line 68

def range
  @range ||= begin
    s = Position.from_offset(source.code, offset - start_of_word.length)
    e = Position.from_offset(source.code, offset + end_of_word.length)
    Solargraph::Range.new(s, e)
  end
end

#recipientCursor? Also known as: receiver

Get a cursor pointing to the method that receives the current statement as an argument.

Returns:



110
111
112
113
114
115
# File 'lib/solargraph/source/cursor.rb', line 110

def recipient
  @recipient ||= begin
    node = recipient_node
    node ? Cursor.new(source, Range.from_node(node).ending) : nil
  end
end

#recipient_nodeObject



138
139
140
# File 'lib/solargraph/source/cursor.rb', line 138

def recipient_node
  @recipient_node ||= Solargraph::Parser::NodeMethods.find_recipient_node(self)
end

#start_of_constant?Boolean

Returns:

  • (Boolean)


61
62
63
# File 'lib/solargraph/source/cursor.rb', line 61

def start_of_constant?
  source.code[offset-2, 2] == '::'
end

#start_of_wordString

The part of the word before the current position. Given the text ‘foo.bar`, the start_of_word at position(0, 6) is `ba`.

Returns:

  • (String)


39
40
41
42
43
44
45
46
47
# File 'lib/solargraph/source/cursor.rb', line 39

def start_of_word
  @start_of_word ||= begin
    match = source.code[0..offset-1].to_s.match(start_word_pattern)
    result = (match ? match[0] : '')
    # Including the preceding colon if the word appears to be a symbol
    result = ":#{result}" if source.code[0..offset-result.length-1].end_with?(':') and !source.code[0..offset-result.length-1].end_with?('::')
    result
  end
end

#string?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/solargraph/source/cursor.rb', line 102

def string?
  @string ||= source.string_at?(position)
end

#wordString

The whole word at the current position. Given the text ‘foo.bar`, the word at position(0,6) is `bar`.

Returns:

  • (String)


31
32
33
# File 'lib/solargraph/source/cursor.rb', line 31

def word
  @word ||= start_of_word + end_of_word
end