Skip to content

Commit 5737e71

Browse files
committed
support __MODULE__ and attributes in replace remote function code action
1 parent 9640d0b commit 5737e71

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

apps/language_server/lib/language_server/providers/code_action/replace_remote_function.ex

+4-4
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ defmodule ElixirLS.LanguageServer.Providers.CodeAction.ReplaceRemoteFunction do
119119

120120
ast
121121
|> Macro.postwalk(fn
122-
{:., function_meta, [{:__aliases__, module_meta, module_alias}, ^function_atom]} ->
122+
{:., function_meta, [{:__aliases__, module_meta, module_alias = [h | _]}, ^function_atom]}
123+
when is_atom(h) ->
123124
case expand_alias(source_file, module_alias, line_number) do
124125
{:ok, ^module} ->
125126
{:., function_meta, [{:__aliases__, module_meta, module_alias}, suggestion]}
@@ -128,9 +129,8 @@ defmodule ElixirLS.LanguageServer.Providers.CodeAction.ReplaceRemoteFunction do
128129
{:., function_meta, [{:__aliases__, module_meta, module_alias}, function_atom]}
129130
end
130131

131-
# erlang call
132-
{:., function_meta, [^module, ^function_atom]} ->
133-
{:., function_meta, [module, suggestion]}
132+
{:., function_meta, [remote, ^function_atom]} ->
133+
{:., function_meta, [remote, suggestion]}
134134

135135
other ->
136136
other

apps/language_server/test/providers/code_action/replace_remote_function_test.exs

+30
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,36 @@ defmodule ElixirLS.LanguageServer.Providers.CodeAction.ReplaceRemoteFunctionTest
257257

258258
assert result == "alias ElixirLS.Test.RemoteFunction, as: Remote\nRemote.foo(42)"
259259
end
260+
261+
test "handles __MODULE__" do
262+
message = """
263+
ElixirLS.Test.RemoteFunction.fou/1 is undefined or private. Did you mean:
264+
* foo/1
265+
"""
266+
267+
{:ok, [result]} =
268+
~q{
269+
__MODULE__.fou(42)
270+
}
271+
|> modify(message: message, suggestion: "__MODULE__.foo", line: 0)
272+
273+
assert result == "__MODULE__.foo(42)"
274+
end
275+
276+
test "handles __MODULE__.Submodule alias" do
277+
message = """
278+
ElixirLS.Test.RemoteFunction.fou/1 is undefined or private. Did you mean:
279+
* foo/1
280+
"""
281+
282+
{:ok, [result]} =
283+
~q{
284+
__MODULE__.RemoteFunction.fou(42)
285+
}
286+
|> modify(message: message, suggestion: "__MODULE__.RemoteFunction.foo", line: 0)
287+
288+
assert result == "__MODULE__.RemoteFunction.foo(42)"
289+
end
260290
end
261291
end
262292

0 commit comments

Comments
 (0)