Class: RubyLsp::Requests::SelectionRanges
- Inherits:
-
Object
- Object
- RubyLsp::Requests::SelectionRanges
- Extended by:
- T::Sig
- Includes:
- RubyLsp::Requests::Support::Common
- Defined in:
- lib/ruby_lsp/requests/selection_ranges.rb
Overview

The [selection ranges](microsoft.github.io/language-server-protocol/specification#textDocument_selectionRange) request informs the editor of ranges that the user may want to select based on the location(s) of their cursor(s).
Trigger this request with: Ctrl + Shift + -> or Ctrl + Shift + <-
Note that if using VSCode Neovim, you will need to be in Insert mode for this to work correctly.
# Example
“‘ruby def foo # –> The next selection range encompasses the entire method definition.
puts "Hello, world!" # --> Cursor is on this line
end “‘
Instance Method Summary collapse
-
#initialize(document) ⇒ SelectionRanges
constructor
A new instance of SelectionRanges.
- #run ⇒ Object
Methods included from RubyLsp::Requests::Support::Common
#create_code_lens, #markdown_from_index_entries, #range_from_location, #range_from_node, #visible?
Constructor Details
#initialize(document) ⇒ SelectionRanges
Returns a new instance of SelectionRanges.
27 28 29 30 31 |
# File 'lib/ruby_lsp/requests/selection_ranges.rb', line 27 def initialize(document) @document = document @ranges = T.let([], T::Array[Support::SelectionRange]) @stack = T.let([], T::Array[Support::SelectionRange]) end |
Instance Method Details
#run ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/ruby_lsp/requests/selection_ranges.rb', line 34 def run # [node, parent] queue = [[@document.tree, nil]] until queue.empty? node, parent = queue.shift next unless node range = Support::SelectionRange.new(range: range_from_location(node.location), parent: parent) T.unsafe(queue).unshift(*node.child_nodes.map { |child| [child, range] }) @ranges.unshift(range) end @ranges end |