Skip to content

Commit e409542

Browse files
committed
more tests
1 parent 1b770f1 commit e409542

File tree

3 files changed

+168
-1
lines changed

3 files changed

+168
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.Reducers.Params do
5151
cursor_context.cursor_position,
5252
not elixir_prefix
5353
) do
54-
list = for opt <- ElixirSense.Core.Options.get_param_options(mod, fun, npar + 1, buffer_metadata) do
54+
list = for opt <- ElixirSense.Core.Options.get_param_options(mod, fun, npar + 1, env, buffer_metadata) do
5555
case opt do
5656
{name, type} ->
5757
# match on atom:

apps/language_server/test/providers/completion/suggestions_test.exs

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4059,6 +4059,34 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
40594059
assert [%{name: "opt_name"}] = list |> Enum.filter(&(&1.type == :param_option))
40604060
end
40614061

4062+
test "params with multiple functions" do
4063+
buffer = """
4064+
ElixirSenseExample.ModuleWithTypespecs.Local.multiple_functions()
4065+
"""
4066+
4067+
list = Suggestion.suggestions(buffer, 1, 65)
4068+
assert [%{name: "foo"}, %{name: "bar"}] = list |> Enum.filter(&(&1.type == :param_option))
4069+
end
4070+
4071+
test "params from callback" do
4072+
buffer = """
4073+
ElixirSenseExample.ModuleWithTypespecs.Impl.some()
4074+
"""
4075+
4076+
list = Suggestion.suggestions(buffer, 1, 50)
4077+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4078+
end
4079+
4080+
test "params from macrocallback" do
4081+
buffer = """
4082+
require ElixirSenseExample.ModuleWithTypespecs.MacroImpl
4083+
ElixirSenseExample.ModuleWithTypespecs.MacroImpl.some()
4084+
"""
4085+
4086+
list = Suggestion.suggestions(buffer, 2, 55)
4087+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4088+
end
4089+
40624090
test "metadata params" do
40634091
buffer = """
40644092
defmodule Foo do
@@ -4075,6 +4103,22 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
40754103
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
40764104
end
40774105

4106+
test "metadata params macro" do
4107+
buffer = """
4108+
defmodule Foo do
4109+
@spec some([{:foo, integer()} | {:bar, String.t()}]) :: Macro.t()
4110+
defmacro some(options), do: :ok
4111+
4112+
def go do
4113+
some()
4114+
end
4115+
end
4116+
"""
4117+
4118+
list = Suggestion.suggestions(buffer, 6, 10)
4119+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4120+
end
4121+
40784122
test "metadata params multiple specs" do
40794123
buffer = """
40804124
defmodule Foo do
@@ -4092,6 +4136,25 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
40924136
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
40934137
end
40944138

4139+
test "metadata params multiple functions" do
4140+
buffer = """
4141+
defmodule Foo do
4142+
@spec some([{:foo, integer()}]) :: :ok
4143+
def some(options), do: :ok
4144+
4145+
@spec some([{:bar, String.t()}]) :: :ok
4146+
def some(options, a), do: :ok
4147+
4148+
def go do
4149+
some()
4150+
end
4151+
end
4152+
"""
4153+
4154+
list = Suggestion.suggestions(buffer, 9, 10)
4155+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4156+
end
4157+
40954158
test "metadata params with default args" do
40964159
buffer = """
40974160
defmodule Foo do
@@ -4107,6 +4170,86 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
41074170
list = Suggestion.suggestions(buffer, 6, 10)
41084171
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
41094172
end
4173+
4174+
test "metadata params from callback" do
4175+
buffer = """
4176+
defmodule Foo do
4177+
@callback some([{:foo, integer()} | {:bar, String.t()}]) :: :ok
4178+
end
4179+
4180+
defmodule Bar do
4181+
@behaviour Foo
4182+
4183+
@impl true
4184+
def some(options), do: :ok
4185+
4186+
def go do
4187+
some()
4188+
end
4189+
end
4190+
"""
4191+
4192+
list = Suggestion.suggestions(buffer, 12, 10)
4193+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4194+
end
4195+
4196+
test "metadata params from macrocallback" do
4197+
buffer = """
4198+
defmodule Foo do
4199+
@macrocallback some([{:foo, integer()} | {:bar, String.t()}]) :: Macro.t()
4200+
end
4201+
4202+
defmodule Bar do
4203+
@behaviour Foo
4204+
4205+
@impl true
4206+
defmacro some(options), do: :ok
4207+
4208+
def go do
4209+
some()
4210+
end
4211+
end
4212+
"""
4213+
4214+
list = Suggestion.suggestions(buffer, 12, 10)
4215+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4216+
end
4217+
4218+
test "metadata params from compiled module callback" do
4219+
buffer = """
4220+
defmodule Bar do
4221+
@behaviour ElixirSenseExample.ModuleWithTypespecs.Behaviour
4222+
4223+
@impl true
4224+
def some(options), do: :ok
4225+
4226+
def go do
4227+
some()
4228+
end
4229+
end
4230+
"""
4231+
4232+
list = Suggestion.suggestions(buffer, 8, 10)
4233+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4234+
end
4235+
4236+
test "metadata params from compiled module macrocallback" do
4237+
buffer = """
4238+
defmodule Bar do
4239+
@behaviour ElixirSenseExample.ModuleWithTypespecs.MacroBehaviour
4240+
4241+
@impl true
4242+
defmacro some(options), do: :ok
4243+
4244+
def go do
4245+
some()
4246+
end
4247+
end
4248+
"""
4249+
4250+
list = Suggestion.suggestions(buffer, 8, 10)
4251+
assert [%{name: "bar"}, %{name: "foo"}] = list |> Enum.filter(&(&1.type == :param_option))
4252+
end
41104253
end
41114254

41124255
describe "suggestions for typespecs" do

apps/language_server/test/support/module_with_typespecs.ex

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,5 +192,29 @@ defmodule ElixirSenseExample.ModuleWithTypespecs do
192192

193193
@spec fun_with_default(atom, [{:foo, integer()} | {:bar, String.t()}]) :: :ok
194194
def fun_with_default(a \\ nil, options), do: :ok
195+
196+
@spec multiple_functions([{:foo, integer()}]) :: :ok
197+
def multiple_functions(options), do: :ok
198+
199+
@spec multiple_functions([{:bar, String.t()}]) :: :ok
200+
def multiple_functions(options, a), do: :ok
201+
end
202+
203+
defmodule Behaviour do
204+
@callback some([{:foo, integer()} | {:bar, String.t()}]) :: :ok
205+
end
206+
207+
defmodule Impl do
208+
@behaviour Behaviour
209+
def some(a), do: :ok
210+
end
211+
212+
defmodule MacroBehaviour do
213+
@macrocallback some([{:foo, integer()} | {:bar, String.t()}]) :: Macro.t()
214+
end
215+
216+
defmodule MacroImpl do
217+
@behaviour MacroBehaviour
218+
defmacro some(a), do: :ok
195219
end
196220
end

0 commit comments

Comments
 (0)