From 94b71f31152f011e55a6db8569a5fb6019e11a54 Mon Sep 17 00:00:00 2001 From: c4710n Date: Thu, 4 May 2023 16:57:06 +0800 Subject: [PATCH] Add a new config - `elixirLS.autoInsertRequiredAlias` --- 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"