From bb09876112049d223684b62481601263b693804c Mon Sep 17 00:00:00 2001 From: Zeke Dou <59962222+c4710n@users.noreply.github.com> Date: Sat, 6 May 2023 18:03:21 +0800 Subject: [PATCH] Add a new config - `elixirLS.autoInsertRequiredAlias` (#881) Co-authored-by: c4710n --- README.md | 1 + .../language_server/providers/completion.ex | 7 ++++- .../lib/language_server/server.ex | 6 +++- .../test/providers/completion_test.exs | 29 +++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 70a06f821..4bd4a8097 100644 --- a/README.md +++ b/README.md @@ -301,6 +301,7 @@ Below is a list configuration options supported by ElixirLS language server. Ple
elixirLS.fetchDeps
Automatically fetch project dependencies when compiling
elixirLS.suggestSpecs
Suggest @spec annotations inline using Dialyzer's inferred success typings (Requires Dialyzer)
elixirLS.trace.server
Traces the communication between VS Code and the Elixir language server.
+
elixirLS.autoInsertRequiredAlias
Enable auto-insert required alias. By default, it's true, which means enabled.
elixirLS.signatureAfterComplete
Show signature help after confirming autocomplete
elixirLS.enableTestLenses
Show code lenses to run tests in terminal
elixirLS.additionalWatchedExtensions
Additional file types capable of triggering a build on change
diff --git a/apps/language_server/lib/language_server/providers/completion.ex b/apps/language_server/lib/language_server/providers/completion.ex index 9291f2a36..8044db788 100644 --- a/apps/language_server/lib/language_server/providers/completion.ex +++ b/apps/language_server/lib/language_server/providers/completion.ex @@ -155,7 +155,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do ) items = - ElixirSense.suggestions(text, line, character, required_alias: true) + build_suggestions(text, line, character, options) |> maybe_reject_derived_functions(context, options) |> Enum.map(&from_completion_item(&1, context, options)) |> maybe_add_do(context) @@ -171,6 +171,11 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do {:ok, %{"isIncomplete" => is_incomplete(items_json), "items" => items_json}} end + defp build_suggestions(text, line, character, options) do + required_alias = Keyword.get(options, :auto_insert_required_alias, true) + ElixirSense.suggestions(text, line, character, required_alias: required_alias) + end + defp maybe_add_do(completion_items, context) do if String.ends_with?(context.text_before_cursor, " do") && context.text_after_cursor == "" do item = %__MODULE__{ diff --git a/apps/language_server/lib/language_server/server.ex b/apps/language_server/lib/language_server/server.ex index 197962006..a3ed740cb 100644 --- a/apps/language_server/lib/language_server/server.ex +++ b/apps/language_server/lib/language_server/server.ex @@ -670,6 +670,8 @@ defmodule ElixirLS.LanguageServer.Server do end defp handle_request(completion_req(_id, uri, line, character), state = %__MODULE__{}) do + settings = state.settings || %{} + source_file = get_source_file(state, uri) snippets_supported = @@ -710,7 +712,8 @@ defmodule ElixirLS.LanguageServer.Server do end |> MapSet.new() - signature_after_complete = Map.get(state.settings || %{}, "signatureAfterComplete", true) + auto_insert_required_alias = Map.get(settings, "autoInsertRequiredAlias", true) + signature_after_complete = Map.get(settings, "signatureAfterComplete", true) path = case uri do @@ -725,6 +728,7 @@ defmodule ElixirLS.LanguageServer.Server do tags_supported: tags_supported, signature_help_supported: signature_help_supported, locals_without_parens: locals_without_parens, + auto_insert_required_alias: auto_insert_required_alias, signature_after_complete: signature_after_complete, file_path: path ) diff --git a/apps/language_server/test/providers/completion_test.exs b/apps/language_server/test/providers/completion_test.exs index 7ad329d3a..fa1d59377 100644 --- a/apps/language_server/test/providers/completion_test.exs +++ b/apps/language_server/test/providers/completion_test.exs @@ -443,6 +443,35 @@ defmodule ElixirLS.LanguageServer.Providers.CompletionTest do ] = item["additionalTextEdits"] end + test "suggests nothing when auto_insert_required_alias is false" do + supports = Keyword.put(@supports, :auto_insert_required_alias, false) + + text = """ + defmodule MyModule do + @moduledoc \"\"\" + This + is a + long + moduledoc + + \"\"\" + + def dummy_function() do + ExampleS + # ^ + end + end + """ + + {line, char} = {10, 12} + TestUtils.assert_has_cursor_char(text, line, char) + + {:ok, %{"items" => items}} = Completion.completion(text, line, char, supports) + + # nothing is suggested + assert [] = items + end + test "no crash on first line" do text = "defmodule MyModule do"