Skip to content

Commit 049f956

Browse files
Add end keyword to completions
1 parent 879aed9 commit 049f956

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
138138
|> maybe_reject_derived_functions(context, options)
139139
|> Enum.map(&from_completion_item(&1, context, options))
140140
|> maybe_add_do(context)
141+
|> maybe_add_end(context)
141142

142143
items_json =
143144
items
@@ -166,6 +167,23 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
166167
end
167168
end
168169

170+
defp maybe_add_end(completion_items, context) do
171+
if String.ends_with?(context.text_before_cursor, "end") && context.text_after_cursor == "" do
172+
item = %__MODULE__{
173+
label: "end",
174+
kind: :keyword,
175+
detail: "keyword",
176+
insert_text: "end",
177+
tags: [],
178+
priority: 0
179+
}
180+
181+
[item | completion_items]
182+
else
183+
completion_items
184+
end
185+
end
186+
169187
## Helpers
170188

171189
defp is_incomplete(items) do

apps/language_server/test/providers/completion_test.exs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,35 @@ defmodule ElixirLS.LanguageServer.Providers.CompletionTest do
5151
assert first_item["label"] == "do"
5252
end
5353

54+
test "end is returned" do
55+
text = """
56+
defmodule MyModule do
57+
require Logger
58+
59+
def engineering_department, do: :eng
60+
61+
def fun do
62+
:ok
63+
end
64+
# ^
65+
end
66+
"""
67+
68+
{line, char} = {7, 5}
69+
TestUtils.assert_has_cursor_char(text, line, char)
70+
71+
{:ok, %{"items" => [first_item | items]}} = Completion.completion(text, line, char, @supports)
72+
73+
assert first_item["label"] == "end"
74+
75+
completions =
76+
items
77+
|> Enum.filter(&(&1["detail"] =~ "engineering_department"))
78+
|> Enum.map(& &1["insertText"])
79+
80+
assert completions == ["engineering_department()"]
81+
end
82+
5483
test "returns all Logger completions on normal require" do
5584
text = """
5685
defmodule MyModule do

0 commit comments

Comments
 (0)