Skip to content

Commit cca1096

Browse files
Kevin KalbKevinKalb
andauthored
WIP: added true, false and nil as keywords for completion (#978)
Co-authored-by: KevinKalb <kevin.kalb@aponia.de>
1 parent 7470e5d commit cca1096

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

apps/language_server/lib/language_server/providers/completion.ex

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
161161
|> Enum.map(&from_completion_item(&1, context, options))
162162
|> maybe_add_do(context)
163163
|> maybe_add_end(context)
164+
|> maybe_add_keywords(context)
164165
|> Enum.reject(&is_nil/1)
165166
|> sort_items()
166167

@@ -238,8 +239,40 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
238239
end
239240
end
240241

242+
defp maybe_add_keywords(completion_items, %{text_after_cursor: ""} = context) do
243+
kw = Map.get(context, :text_before_cursor) |> String.trim_leading() |> get_keyword()
244+
245+
if kw != "" do
246+
item = %__MODULE__{
247+
label: kw,
248+
kind: :keyword,
249+
detail: "keyword",
250+
insert_text: kw,
251+
tags: [],
252+
priority: 0
253+
}
254+
255+
[item | completion_items]
256+
else
257+
completion_items
258+
end
259+
end
260+
261+
defp maybe_add_keywords(completion_items, _context) do
262+
completion_items
263+
end
264+
241265
## Helpers
242266

267+
defp get_keyword(t) do
268+
cond do
269+
Enum.member?(["t", "tr", "tru", "true"], t) -> "true"
270+
Enum.member?(["f", "fa", "fal", "fals", "false"], t) -> "false"
271+
Enum.member?(["n", "ni", "nil"], t) -> "nil"
272+
true -> ""
273+
end
274+
end
275+
243276
defp is_incomplete(items) do
244277
if Enum.empty?(items) do
245278
false

apps/language_server/test/providers/completion_test.exs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,42 @@ defmodule ElixirLS.LanguageServer.Providers.CompletionTest do
685685
end
686686
end
687687

688+
describe "keyword completion" do
689+
setup do
690+
text = """
691+
defmodule MyModule do
692+
def dummy_function() do
693+
t
694+
#^
695+
end
696+
end
697+
"""
698+
699+
%{text: text, location: {2, 5}}
700+
end
701+
702+
test "first", context do
703+
%{text: text, location: {line, char}} = context
704+
705+
TestUtils.assert_has_cursor_char(text, line, char)
706+
707+
opts = Keyword.merge(@supports, signature_after_complete: true)
708+
{:ok, %{"items" => items}} = Completion.completion(text, line, char, opts)
709+
710+
[item] = items |> Enum.filter(&(&1["insertText"] == "true"))
711+
712+
assert %{
713+
"detail" => "keyword",
714+
"documentation" => %{:kind => "markdown", "value" => ""},
715+
"insertText" => "true",
716+
"insertTextFormat" => 2,
717+
"kind" => 14,
718+
"label" => "true",
719+
"sortText" => "00000000"
720+
} = item
721+
end
722+
end
723+
688724
describe "function completion" do
689725
setup do
690726
text = """

0 commit comments

Comments
 (0)