From 5ae6425f30931b47e83e744e416a0458b507a304 Mon Sep 17 00:00:00 2001 From: Milo Lee Date: Tue, 27 Jun 2023 05:18:41 +0800 Subject: [PATCH] complete with parens if there are remote calls (#916) * complete with parens if there are remote calls * move to context and using Code.Fragment.cursor_context/1 --- .../language_server/providers/completion.ex | 4 +++- .../test/providers/completion_test.exs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/apps/language_server/lib/language_server/providers/completion.ex b/apps/language_server/lib/language_server/providers/completion.ex index f077a606f..e632f7b34 100644 --- a/apps/language_server/lib/language_server/providers/completion.ex +++ b/apps/language_server/lib/language_server/providers/completion.ex @@ -138,6 +138,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do text_before_cursor: text_before_cursor, text_after_cursor: text_after_cursor, prefix: prefix, + remote_calls?: match?({:dot, _, _}, Code.Fragment.cursor_context(prefix)), def_before: def_before, pipe_before?: Regex.match?(Regex.recompile!(~r/\|>\s*#{prefix}$/), text_before_cursor), capture_before?: Regex.match?(Regex.recompile!(~r/&#{prefix}$/), text_before_cursor), @@ -1030,6 +1031,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do } = info %{ + remote_calls?: remote_calls?, pipe_before?: pipe_before?, capture_before?: capture_before?, text_after_cursor: text_after_cursor @@ -1038,7 +1040,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do locals_without_parens = Keyword.get(options, :locals_without_parens) signature_help_supported? = Keyword.get(options, :signature_help_supported, false) signature_after_complete? = Keyword.get(options, :signature_after_complete, true) - with_parens? = function_name_with_parens?(name, arity, locals_without_parens) + with_parens? = remote_calls? || function_name_with_parens?(name, arity, locals_without_parens) trigger_signature? = signature_help_supported? && ((arity == 1 && !pipe_before?) || arity > 1) diff --git a/apps/language_server/test/providers/completion_test.exs b/apps/language_server/test/providers/completion_test.exs index 067ce49c9..73821ba40 100644 --- a/apps/language_server/test/providers/completion_test.exs +++ b/apps/language_server/test/providers/completion_test.exs @@ -829,6 +829,25 @@ defmodule ElixirLS.LanguageServer.Providers.CompletionTest do assert item["command"] == @signature_command end + test "complete with parens if there are remote calls" do + text = """ + defmodule MyModule do + def dummy_function() do + Map.drop + # ^ + end + end + """ + + {line, char} = {2, 12} + TestUtils.assert_has_cursor_char(text, line, char) + + opts = Keyword.merge(@supports, locals_without_parens: MapSet.new(drop: 2)) + {:ok, %{"items" => [item]}} = Completion.completion(text, line, char, opts) + + assert item["insertText"] == "drop($1)$0" + end + test "function with arity 0 does not triggers signature" do text = """ defmodule MyModule do