diff --git a/lib/ruby_lsp/listeners/completion.rb b/lib/ruby_lsp/listeners/completion.rb index 260d7046a..f98bee511 100644 --- a/lib/ruby_lsp/listeners/completion.rb +++ b/lib/ruby_lsp/listeners/completion.rb @@ -43,7 +43,9 @@ def on_string_node_enter(node) def on_constant_read_node_enter(node) return if DependencyDetector.instance.typechecker - name = node.slice + name = constant_name(node) + return if name.nil? + candidates = @index.prefix_search(name, @nesting) candidates.each do |entries| complete_name = T.must(entries.first).name @@ -62,7 +64,8 @@ def on_constant_read_node_enter(node) def on_constant_path_node_enter(node) return if DependencyDetector.instance.typechecker - name = node.slice + name = constant_name(node) + return if name.nil? top_level_reference = if name.start_with?("::") name = name.delete_prefix("::") diff --git a/lib/ruby_lsp/listeners/definition.rb b/lib/ruby_lsp/listeners/definition.rb index e0f1b1374..4e1aeec6c 100644 --- a/lib/ruby_lsp/listeners/definition.rb +++ b/lib/ruby_lsp/listeners/definition.rb @@ -45,12 +45,18 @@ def on_call_node_enter(node) sig { params(node: Prism::ConstantPathNode).void } def on_constant_path_node_enter(node) - find_in_index(node.slice) + name = constant_name(node) + return if name.nil? + + find_in_index(name) end sig { params(node: Prism::ConstantReadNode).void } def on_constant_read_node_enter(node) - find_in_index(node.slice) + name = constant_name(node) + return if name.nil? + + find_in_index(name) end private diff --git a/lib/ruby_lsp/listeners/hover.rb b/lib/ruby_lsp/listeners/hover.rb index 10efba331..708be1275 100644 --- a/lib/ruby_lsp/listeners/hover.rb +++ b/lib/ruby_lsp/listeners/hover.rb @@ -55,7 +55,10 @@ def initialize(response_builder, uri, nesting, index, dispatcher, typechecker_en def on_constant_read_node_enter(node) return if @typechecker_enabled - generate_hover(node.slice, node.location) + name = constant_name(node) + return if name.nil? + + generate_hover(name, node.location) end sig { params(node: Prism::ConstantWriteNode).void } @@ -69,7 +72,10 @@ def on_constant_write_node_enter(node) def on_constant_path_node_enter(node) return if DependencyDetector.instance.typechecker - generate_hover(node.slice, node.location) + name = constant_name(node) + return if name.nil? + + generate_hover(name, node.location) end sig { params(node: Prism::CallNode).void } diff --git a/lib/ruby_lsp/requests/support/common.rb b/lib/ruby_lsp/requests/support/common.rb index 7f37c741c..bf8e6e4e4 100644 --- a/lib/ruby_lsp/requests/support/common.rb +++ b/lib/ruby_lsp/requests/support/common.rb @@ -116,6 +116,21 @@ def markdown_from_index_entries(title, entries) #{content} MARKDOWN end + + sig do + params( + node: T.any( + Prism::ConstantPathNode, + Prism::ConstantReadNode, + Prism::ConstantPathTargetNode, + ), + ).returns(T.nilable(String)) + end + def constant_name(node) + node.full_name + rescue Prism::ConstantPathNode::DynamicPartsInConstantPathError + nil + end end end end