Class: RubyLsp::Requests::FoldingRanges

Inherits:
BaseRequest
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/ruby_lsp/requests/folding_ranges.rb

Overview

![Folding ranges demo](../../misc/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 “‘

Defined Under Namespace

Classes: PartialRange

Constant Summary collapse

SIMPLE_FOLDABLES =
T.let(
  [
    SyntaxTree::ArrayLiteral,
    SyntaxTree::BlockNode,
    SyntaxTree::Case,
    SyntaxTree::ClassDeclaration,
    SyntaxTree::Command,
    SyntaxTree::For,
    SyntaxTree::HashLiteral,
    SyntaxTree::Heredoc,
    SyntaxTree::IfNode,
    SyntaxTree::ModuleDeclaration,
    SyntaxTree::SClass,
    SyntaxTree::UnlessNode,
    SyntaxTree::UntilNode,
    SyntaxTree::WhileNode,
    SyntaxTree::Else,
    SyntaxTree::Ensure,
    SyntaxTree::Begin,
  ].freeze,
  T::Array[T.class_of(SyntaxTree::Node)],
)
NODES_WITH_STATEMENTS =
T.let(
  [
    SyntaxTree::Elsif,
    SyntaxTree::In,
    SyntaxTree::Rescue,
    SyntaxTree::When,
  ].freeze,
  T::Array[T.class_of(SyntaxTree::Node)],
)
StatementNode =
T.type_alias do
  T.any(
    SyntaxTree::Elsif,
    SyntaxTree::In,
    SyntaxTree::Rescue,
    SyntaxTree::When,
  )
end

Instance Method Summary collapse

Methods inherited from BaseRequest

#full_constant_name, #locate, #range_from_syntax_tree_node, #visible?

Constructor Details

#initialize(document) ⇒ FoldingRanges

Returns a new instance of FoldingRanges.



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

def initialize(document)
  super

  @ranges = T.let([], T::Array[LanguageServer::Protocol::Interface::FoldingRange])
  @partial_range = T.let(nil, T.nilable(PartialRange))
end

Instance Method Details

#runObject



72
73
74
75
76
77
78
79
# File 'lib/ruby_lsp/requests/folding_ranges.rb', line 72

def run
  if @document.parsed?
    visit(@document.tree)
    emit_partial_range
  end

  @ranges
end