Class: RubyLsp::Listeners::FoldingRanges

Inherits:
RubyLsp::Listener show all
Extended by:
T::Generic, T::Sig
Defined in:
lib/ruby_lsp/listeners/folding_ranges.rb

Constant Summary collapse

ResponseType =
type_member { { fixed: T::Array[Interface::FoldingRange] } }

Instance Method Summary collapse

Methods inherited from RubyLsp::Listener

#response

Methods included from Requests::Support::Common

#create_code_lens, #markdown_from_index_entries, #not_in_dependencies?, #range_from_location, #range_from_node, #self_receiver?, #visible?

Constructor Details

#initialize(comments, dispatcher) ⇒ FoldingRanges

Returns a new instance of FoldingRanges.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 13

def initialize(comments, dispatcher)
  super(dispatcher)

  @_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_case_match_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_def_node_enter,
    :on_call_node_enter,
    :on_lambda_node_enter,
  )
end

Instance Method Details

#_responseObject



50
51
52
53
54
55
56
57
58
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 50

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

  @_response
end

#on_array_node_enter(node) ⇒ Object



89
90
91
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 89

def on_array_node_enter(node)
  add_simple_range(node)
end

#on_begin_node_enter(node) ⇒ Object



159
160
161
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 159

def on_begin_node_enter(node)
  add_simple_range(node)
end

#on_block_node_enter(node) ⇒ Object



94
95
96
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 94

def on_block_node_enter(node)
  add_simple_range(node)
end

#on_call_node_enter(node) ⇒ Object



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

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_match_node_enter(node) ⇒ Object



104
105
106
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 104

def on_case_match_node_enter(node)
  add_simple_range(node)
end

#on_case_node_enter(node) ⇒ Object



99
100
101
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 99

def on_case_node_enter(node)
  add_simple_range(node)
end

#on_class_node_enter(node) ⇒ Object



109
110
111
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 109

def on_class_node_enter(node)
  add_simple_range(node)
end

#on_def_node_enter(node) ⇒ Object



164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 164

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



149
150
151
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 149

def on_else_node_enter(node)
  add_simple_range(node)
end

#on_ensure_node_enter(node) ⇒ Object



154
155
156
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 154

def on_ensure_node_enter(node)
  add_simple_range(node)
end

#on_for_node_enter(node) ⇒ Object



119
120
121
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 119

def on_for_node_enter(node)
  add_simple_range(node)
end

#on_hash_node_enter(node) ⇒ Object



124
125
126
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 124

def on_hash_node_enter(node)
  add_simple_range(node)
end

#on_if_node_enter(node) ⇒ Object



61
62
63
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 61

def on_if_node_enter(node)
  add_statements_range(node)
end

#on_in_node_enter(node) ⇒ Object



66
67
68
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 66

def on_in_node_enter(node)
  add_statements_range(node)
end

#on_interpolated_string_node_enter(node) ⇒ Object



81
82
83
84
85
86
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 81

def on_interpolated_string_node_enter(node)
  opening_loc = node.opening_loc || node.location
  closing_loc = node.closing_loc || node.parts.last&.location || node.location

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

#on_lambda_node_enter(node) ⇒ Object



192
193
194
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 192

def on_lambda_node_enter(node)
  add_simple_range(node)
end

#on_module_node_enter(node) ⇒ Object



114
115
116
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 114

def on_module_node_enter(node)
  add_simple_range(node)
end

#on_rescue_node_enter(node) ⇒ Object



71
72
73
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 71

def on_rescue_node_enter(node)
  add_statements_range(node)
end

#on_singleton_class_node_enter(node) ⇒ Object



129
130
131
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 129

def on_singleton_class_node_enter(node)
  add_simple_range(node)
end

#on_unless_node_enter(node) ⇒ Object



134
135
136
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 134

def on_unless_node_enter(node)
  add_simple_range(node)
end

#on_until_node_enter(node) ⇒ Object



139
140
141
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 139

def on_until_node_enter(node)
  add_simple_range(node)
end

#on_when_node_enter(node) ⇒ Object



76
77
78
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 76

def on_when_node_enter(node)
  add_statements_range(node)
end

#on_while_node_enter(node) ⇒ Object



144
145
146
# File 'lib/ruby_lsp/listeners/folding_ranges.rb', line 144

def on_while_node_enter(node)
  add_simple_range(node)
end