Skip to content

Commit 3fffcfb

Browse files
authored
Show require and require_relative completions on quotes (#1443)
1 parent fdac2fb commit 3fffcfb

File tree

3 files changed

+38
-8
lines changed

3 files changed

+38
-8
lines changed

lib/ruby_lsp/listeners/completion.rb

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,6 @@ def on_constant_path_node_enter(node)
100100

101101
sig { params(node: Prism::CallNode).void }
102102
def on_call_node_enter(node)
103-
return if @typechecker_enabled
104-
105103
name = node.message
106104
return unless name
107105

@@ -111,7 +109,7 @@ def on_call_node_enter(node)
111109
when "require_relative"
112110
complete_require_relative(node)
113111
else
114-
complete_self_receiver_method(node, name) if self_receiver?(node)
112+
complete_self_receiver_method(node, name) if !@typechecker_enabled && self_receiver?(node)
115113
end
116114
end
117115

@@ -142,14 +140,17 @@ def complete_require_relative(node)
142140

143141
origin_dir = Pathname.new(@uri.to_standardized_path).dirname
144142

145-
path_query = path_node_to_complete.content
143+
content = path_node_to_complete.content
146144
# if the path is not a directory, glob all possible next characters
147145
# for example ../somethi| (where | is the cursor position)
148146
# should find files for ../somethi*/
149-
path_query += "*/" unless path_query.end_with?("/")
150-
path_query += "**/*.rb"
147+
path_query = if content.end_with?("/") || content.empty?
148+
"#{content}**/*.rb"
149+
else
150+
"{#{content}*/**/*.rb,**/#{content}*.rb}"
151+
end
151152

152-
Dir.glob(path_query, base: origin_dir).sort!.each do |path|
153+
Dir.glob(path_query, File::FNM_PATHNAME | File::FNM_EXTGLOB, base: origin_dir).sort!.each do |path|
153154
@response_builder << build_completion(
154155
path.delete_suffix(".rb"),
155156
path_node_to_complete,

lib/ruby_lsp/requests/completion.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class << self
3434
def provider
3535
Interface::CompletionOptions.new(
3636
resolve_provider: false,
37-
trigger_characters: ["/"],
37+
trigger_characters: ["/", "\"", "'"],
3838
completion_item: {
3939
labelDetailsSupport: true,
4040
},

test/requests/completion_test.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,35 @@ def test_relative_completion_command_call
690690
assert_equal(expected.to_json, result.to_json)
691691
end
692692

693+
def test_relative_completion_command_call_without_leading_dot
694+
source = <<~RUBY
695+
Kernel.require_relative "b"
696+
RUBY
697+
698+
end_char = T.must(source.rindex('"'))
699+
start_position = { line: 0, character: T.must(source.index('"')) + 1 }
700+
end_position = { line: 0, character: end_char }
701+
702+
result = with_file_structure do |tmpdir|
703+
uri = URI("file://#{tmpdir}/foo/quxx.rb")
704+
document = RubyLsp::RubyDocument.new(source: source, version: 1, uri: uri)
705+
@store.set(uri: uri, source: document.source, version: 1)
706+
run_request(
707+
method: "textDocument/completion",
708+
params: { textDocument: { uri: uri.to_s }, position: { line: 0, character: end_char } },
709+
)
710+
end
711+
712+
expected = [
713+
path_completion("bar", start_position, end_position),
714+
path_completion("baz", start_position, end_position),
715+
path_completion("support/bar", start_position, end_position),
716+
path_completion("support/baz", start_position, end_position),
717+
]
718+
719+
assert_equal(expected.to_json, result.to_json)
720+
end
721+
693722
def test_relative_completion_with_partial_path
694723
prefix = "../suppo"
695724
source = <<~RUBY

0 commit comments

Comments
 (0)