Class: RubyLsp::Requests::FoldingRanges

Inherits:
Listener
  • Object
show all
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

Methods inherited from Listener

#response

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

#_responseObject



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