Class: RubyLsp::Requests::FoldingRanges
- Extended by:
- T::Generic, T::Sig
- Defined in:
- lib/ruby_lsp/requests/folding_ranges.rb
Overview
![Folding ranges demo](../../folding_ranges.gif)
The [folding ranges](microsoft.github.io/language-server-protocol/specification#textDocument_foldingRange) request informs the editor of the ranges where and how code can be folded.
# Example
“‘ruby def say_hello # <– folding range start
puts "Hello"
end # <– folding range end “‘
Constant Summary collapse
- ResponseType =
type_member { { fixed: T::Array[Interface::FoldingRange] } }
Instance Method Summary collapse
- #_response ⇒ Object
-
#initialize(comments, emitter, queue) ⇒ FoldingRanges
constructor
A new instance of FoldingRanges.
- #on_array(node) ⇒ Object
- #on_begin(node) ⇒ Object
- #on_block(node) ⇒ Object
- #on_call(node) ⇒ Object
- #on_case(node) ⇒ Object
- #on_class(node) ⇒ Object
- #on_def(node) ⇒ Object
- #on_else(node) ⇒ Object
- #on_ensure(node) ⇒ Object
- #on_for(node) ⇒ Object
- #on_hash(node) ⇒ Object
- #on_if(node) ⇒ Object
- #on_in(node) ⇒ Object
- #on_interpolated_string(node) ⇒ Object
- #on_module(node) ⇒ Object
- #on_node(node) ⇒ Object
- #on_rescue(node) ⇒ Object
- #on_singleton_class(node) ⇒ Object
- #on_string_concat(node) ⇒ Object
- #on_unless(node) ⇒ Object
- #on_until(node) ⇒ Object
- #on_when(node) ⇒ Object
- #on_while(node) ⇒ Object
Methods inherited from Listener
Methods included from Support::Common
#create_code_lens, #markdown_from_index_entries, #range_from_location, #range_from_node, #visible?
Constructor Details
#initialize(comments, emitter, queue) ⇒ FoldingRanges
Returns a new instance of FoldingRanges.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 25 def initialize(comments, emitter, queue) super(emitter, queue) @_response = T.let([], ResponseType) @requires = T.let([], T::Array[YARP::CallNode]) @finalized_response = T.let(false, T::Boolean) @comments = comments emitter.register( self, :on_if, :on_in, :on_rescue, :on_when, :on_interpolated_string, :on_array, :on_block, :on_case, :on_class, :on_module, :on_for, :on_hash, :on_singleton_class, :on_unless, :on_until, :on_while, :on_else, :on_ensure, :on_begin, :on_string_concat, :on_def, :on_call, ) end |
Instance Method Details
#_response ⇒ Object
61 62 63 64 65 66 67 68 69 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 61 def _response unless @finalized_response push_comment_ranges emit_requires_range @finalized_response = true end @_response end |
#on_array(node) ⇒ Object
100 101 102 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 100 def on_array(node) add_simple_range(node) end |
#on_begin(node) ⇒ Object
165 166 167 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 165 def on_begin(node) add_simple_range(node) end |
#on_block(node) ⇒ Object
105 106 107 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 105 def on_block(node) add_simple_range(node) end |
#on_call(node) ⇒ Object
198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 198 def on_call(node) # If we find a require, don't visit the child nodes (prevent `super`), so that we can keep accumulating into # the `@requires` array and then push the range whenever we find a node that isn't a CallNode if require?(node) @requires << node return end location = node.location add_lines_range(location.start_line, location.end_line - 1) end |
#on_case(node) ⇒ Object
110 111 112 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 110 def on_case(node) add_simple_range(node) end |
#on_class(node) ⇒ Object
115 116 117 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 115 def on_class(node) add_simple_range(node) end |
#on_def(node) ⇒ Object
183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 183 def on_def(node) params = node.parameters parameter_loc = params&.location location = node.location if params && parameter_loc.end_line > location.start_line # Multiline parameters add_lines_range(location.start_line, parameter_loc.end_line) add_lines_range(parameter_loc.end_line + 1, location.end_line - 1) else add_lines_range(location.start_line, location.end_line - 1) end end |
#on_else(node) ⇒ Object
155 156 157 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 155 def on_else(node) add_simple_range(node) end |
#on_ensure(node) ⇒ Object
160 161 162 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 160 def on_ensure(node) add_simple_range(node) end |
#on_for(node) ⇒ Object
125 126 127 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 125 def on_for(node) add_simple_range(node) end |
#on_hash(node) ⇒ Object
130 131 132 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 130 def on_hash(node) add_simple_range(node) end |
#on_if(node) ⇒ Object
72 73 74 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 72 def on_if(node) add_statements_range(node) end |
#on_in(node) ⇒ Object
77 78 79 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 77 def on_in(node) add_statements_range(node) end |
#on_interpolated_string(node) ⇒ Object
92 93 94 95 96 97 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 92 def on_interpolated_string(node) opening_loc = node.opening_loc closing_loc = node.closing_loc add_lines_range(opening_loc.start_line, closing_loc.end_line - 1) if opening_loc && closing_loc end |
#on_module(node) ⇒ Object
120 121 122 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 120 def on_module(node) add_simple_range(node) end |
#on_node(node) ⇒ Object
170 171 172 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 170 def on_node(node) emit_requires_range unless node.is_a?(YARP::CallNode) end |
#on_rescue(node) ⇒ Object
82 83 84 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 82 def on_rescue(node) add_statements_range(node) end |
#on_singleton_class(node) ⇒ Object
135 136 137 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 135 def on_singleton_class(node) add_simple_range(node) end |
#on_string_concat(node) ⇒ Object
175 176 177 178 179 180 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 175 def on_string_concat(node) left = T.let(node.left, YARP::Node) left = left.left while left.is_a?(YARP::StringConcatNode) add_lines_range(left.location.start_line, node.right.location.end_line - 1) end |
#on_unless(node) ⇒ Object
140 141 142 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 140 def on_unless(node) add_simple_range(node) end |
#on_until(node) ⇒ Object
145 146 147 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 145 def on_until(node) add_simple_range(node) end |
#on_when(node) ⇒ Object
87 88 89 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 87 def on_when(node) add_statements_range(node) end |
#on_while(node) ⇒ Object
150 151 152 |
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 150 def on_while(node) add_simple_range(node) end |