From 74494502f826cf11ddb6ae331cab8b48af3aa49e Mon Sep 17 00:00:00 2001 From: Troy Sornson Date: Sat, 9 Mar 2024 21:22:30 -0700 Subject: [PATCH] Recalculate completion entries when crossing :: namespace boundary --- spec/reader_spec.cr | 2 +- src/reader.cr | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/spec/reader_spec.cr b/spec/reader_spec.cr index 4e9f446..7f1ad93 100644 --- a/spec/reader_spec.cr +++ b/spec/reader_spec.cr @@ -254,7 +254,7 @@ module Reply reader.auto_completion.verify(open: true, entries: %w(hello hey), name_filter: "h", selection_pos: 0) reader.editor.verify("42.hello") - SpecHelper.send(pipe_in, "\e\t") # shit_tab + SpecHelper.send(pipe_in, "\e\t") # shift_tab reader.auto_completion.verify(open: true, entries: %w(hello hey), name_filter: "h", selection_pos: 1) reader.editor.verify("42.hey") diff --git a/src/reader.cr b/src/reader.cr index f8bb5bb..1abdc27 100644 --- a/src/reader.cr +++ b/src/reader.cr @@ -371,19 +371,18 @@ module Reply if @auto_completion.open? if shift_tab replacement = @auto_completion.selection_previous + elsif current_word.ends_with?("::") + @auto_completion.close + replacement = compute_completions(current_word, word_begin) else replacement = @auto_completion.selection_next + if replacement.try(&.count("::")) != current_word.count("::") + @auto_completion.close + replacement = compute_completions(current_word, word_begin) + end end else - # Get whole expression before cursor, allow auto-completion to deduce the receiver type - expr = @editor.expression_before_cursor(x: word_begin) - - # Compute auto-completion, return `replacement` (`nil` if no entry, full name if only one entry, or the begin match of entries otherwise) - replacement = @auto_completion.complete_on(current_word, expr) - - if replacement && @auto_completion.entries.size >= 2 - @auto_completion.open - end + replacement = compute_completions(current_word, word_begin) end # Replace the current_word by the replacement word @@ -392,6 +391,19 @@ module Reply end end + private def compute_completions(current_word, word_begin) : String? + expr = @editor.expression_before_cursor(x: word_begin) + + # Compute auto-completion, return `replacement` (`nil` if no entry, full name if only one entry, or the begin match of entries otherwise) + replacement = @auto_completion.complete_on(current_word, expr) + + if replacement && @auto_completion.entries.size >= 2 + @auto_completion.open + end + + replacement + end + private def on_escape @auto_completion.close @editor.update