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, #defined_in_gem?, #markdown_from_index_entries, #range_from_location, #range_from_node, #self_receiver?, #visible?

Constructor Details

#initialize(comments, dispatcher, 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
59
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 25

def initialize(comments, dispatcher, queue)
  super(dispatcher, queue)

  @_response = T.let([], ResponseType)
  @requires = T.let([], T::Array[Prism::CallNode])
  @finalized_response = T.let(false, T::Boolean)
  @comments = comments

  dispatcher.register(
    self,
    :on_if_node_enter,
    :on_in_node_enter,
    :on_rescue_node_enter,
    :on_when_node_enter,
    :on_interpolated_string_node_enter,
    :on_array_node_enter,
    :on_block_node_enter,
    :on_case_node_enter,
    :on_class_node_enter,
    :on_module_node_enter,
    :on_for_node_enter,
    :on_hash_node_enter,
    :on_singleton_class_node_enter,
    :on_unless_node_enter,
    :on_until_node_enter,
    :on_while_node_enter,
    :on_else_node_enter,
    :on_ensure_node_enter,
    :on_begin_node_enter,
    :on_string_concat_node_enter,
    :on_def_node_enter,
    :on_call_node_enter,
    :on_lambda_node_enter,
  )
end

Instance Method Details

#_responseObject



62
63
64
65
66
67
68
69
70
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 62

def _response
  unless @finalized_response
    push_comment_ranges
    emit_requires_range
    @finalized_response = true
  end

  @_response
end

#on_array_node_enter(node) ⇒ Object



101
102
103
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 101

def on_array_node_enter(node)
  add_simple_range(node)
end

#on_begin_node_enter(node) ⇒ Object



166
167
168
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 166

def on_begin_node_enter(node)
  add_simple_range(node)
end

#on_block_node_enter(node) ⇒ Object



106
107
108
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 106

def on_block_node_enter(node)
  add_simple_range(node)
end

#on_call_node_enter(node) ⇒ Object



194
195
196
197
198
199
200
201
202
203
204
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 194

def on_call_node_enter(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_enter(node) ⇒ Object



111
112
113
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 111

def on_case_node_enter(node)
  add_simple_range(node)
end

#on_class_node_enter(node) ⇒ Object



116
117
118
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 116

def on_class_node_enter(node)
  add_simple_range(node)
end

#on_def_node_enter(node) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 179

def on_def_node_enter(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_enter(node) ⇒ Object



156
157
158
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 156

def on_else_node_enter(node)
  add_simple_range(node)
end

#on_ensure_node_enter(node) ⇒ Object



161
162
163
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 161

def on_ensure_node_enter(node)
  add_simple_range(node)
end

#on_for_node_enter(node) ⇒ Object



126
127
128
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 126

def on_for_node_enter(node)
  add_simple_range(node)
end

#on_hash_node_enter(node) ⇒ Object



131
132
133
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 131

def on_hash_node_enter(node)
  add_simple_range(node)
end

#on_if_node_enter(node) ⇒ Object



73
74
75
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 73

def on_if_node_enter(node)
  add_statements_range(node)
end

#on_in_node_enter(node) ⇒ Object



78
79
80
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 78

def on_in_node_enter(node)
  add_statements_range(node)
end

#on_interpolated_string_node_enter(node) ⇒ Object



93
94
95
96
97
98
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 93

def on_interpolated_string_node_enter(node)
  opening_loc = node.opening_loc
  closing_loc = node.closing_loc

  add_lines_range(opening_loc.start_line, closing_loc.start_line - 1) if opening_loc && closing_loc
end

#on_lambda_node_enter(node) ⇒ Object



207
208
209
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 207

def on_lambda_node_enter(node)
  add_simple_range(node)
end

#on_module_node_enter(node) ⇒ Object



121
122
123
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 121

def on_module_node_enter(node)
  add_simple_range(node)
end

#on_rescue_node_enter(node) ⇒ Object



83
84
85
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 83

def on_rescue_node_enter(node)
  add_statements_range(node)
end

#on_singleton_class_node_enter(node) ⇒ Object



136
137
138
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 136

def on_singleton_class_node_enter(node)
  add_simple_range(node)
end

#on_string_concat_node_enter(node) ⇒ Object



171
172
173
174
175
176
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 171

def on_string_concat_node_enter(node)
  left = T.let(node.left, Prism::Node)
  left = left.left while left.is_a?(Prism::StringConcatNode)

  add_lines_range(left.location.start_line, node.right.location.end_line - 1)
end

#on_unless_node_enter(node) ⇒ Object



141
142
143
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 141

def on_unless_node_enter(node)
  add_simple_range(node)
end

#on_until_node_enter(node) ⇒ Object



146
147
148
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 146

def on_until_node_enter(node)
  add_simple_range(node)
end

#on_when_node_enter(node) ⇒ Object



88
89
90
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 88

def on_when_node_enter(node)
  add_statements_range(node)
end

#on_while_node_enter(node) ⇒ Object



151
152
153
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 151

def on_while_node_enter(node)
  add_simple_range(node)
end