Skip to content

Commit

Permalink
complete with parens if there are remote calls (#916)
Browse files Browse the repository at this point in the history
* complete with parens if there are remote calls

* move to context and using Code.Fragment.cursor_context/1
  • Loading branch information
oo6 committed Jun 26, 2023
1 parent 58e2301 commit 5ae6425
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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
Expand All @@ -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)

Expand Down
19 changes: 19 additions & 0 deletions apps/language_server/test/providers/completion_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5ae6425

Please sign in to comment.