Skip to content

Commit

Permalink
Add heredoc delimiter documentation on hover
Browse files Browse the repository at this point in the history
Co-authored-by: Nick Schwaderer <Schwad@users.noreply.github.com>
  • Loading branch information
vinistock and Schwad committed Sep 24, 2024
1 parent 00e95a9 commit 5f233fa
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
29 changes: 29 additions & 0 deletions lib/ruby_lsp/listeners/hover.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Hover
Prism::InstanceVariableWriteNode,
Prism::SymbolNode,
Prism::StringNode,
Prism::InterpolatedStringNode,
Prism::SuperNode,
Prism::ForwardingSuperNode,
],
Expand Down Expand Up @@ -68,9 +69,21 @@ def initialize(response_builder, global_state, uri, node_context, dispatcher, so
:on_instance_variable_target_node_enter,
:on_super_node_enter,
:on_forwarding_super_node_enter,
:on_string_node_enter,
:on_interpolated_string_node_enter,
)
end

sig { params(node: Prism::StringNode).void }
def on_string_node_enter(node)
generate_heredoc_hover(node)
end

sig { params(node: Prism::InterpolatedStringNode).void }
def on_interpolated_string_node_enter(node)
generate_heredoc_hover(node)
end

sig { params(node: Prism::ConstantReadNode).void }
def on_constant_read_node_enter(node)
return if @sorbet_level != RubyDocument::SorbetLevel::Ignore
Expand Down Expand Up @@ -155,6 +168,22 @@ def on_forwarding_super_node_enter(node)

private

sig { params(node: T.any(Prism::InterpolatedStringNode, Prism::StringNode)).void }
def generate_heredoc_hover(node)
opening_content = node.opening_loc&.slice
return unless opening_content

match = /(?<=<<(-|~))(?<quote>['"`]?)(?<delimiter>\w+)\k<quote>/.match(opening_content)
heredoc_delimiter = match && match.named_captures["delimiter"]

if heredoc_delimiter
@response_builder.push(
"This is a heredoc definition using the `#{heredoc_delimiter}` delimiter",
category: :documentation,
)
end
end

sig { void }
def handle_super_node_hover
# Sorbet can handle super hover on typed true or higher
Expand Down
14 changes: 14 additions & 0 deletions test/expectations/hover/heredoc.exp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"params": [
{
"line": 0,
"character": 2
}
],
"result": {
"contents": {
"kind": "markdown",
"value": "This is a heredoc definition using the `HEREDOC` delimiter"
}
}
}

0 comments on commit 5f233fa

Please sign in to comment.