@@ -4059,6 +4059,34 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
4059
4059
assert [ % { name: "opt_name" } ] = list |> Enum . filter ( & ( & 1 . type == :param_option ) )
4060
4060
end
4061
4061
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
+
4062
4090
test "metadata params" do
4063
4091
buffer = """
4064
4092
defmodule Foo do
@@ -4075,6 +4103,22 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
4075
4103
assert [ % { name: "bar" } , % { name: "foo" } ] = list |> Enum . filter ( & ( & 1 . type == :param_option ) )
4076
4104
end
4077
4105
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
+
4078
4122
test "metadata params multiple specs" do
4079
4123
buffer = """
4080
4124
defmodule Foo do
@@ -4092,6 +4136,25 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
4092
4136
assert [ % { name: "bar" } , % { name: "foo" } ] = list |> Enum . filter ( & ( & 1 . type == :param_option ) )
4093
4137
end
4094
4138
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
+
4095
4158
test "metadata params with default args" do
4096
4159
buffer = """
4097
4160
defmodule Foo do
@@ -4107,6 +4170,86 @@ defmodule ElixirLS.LanguageServer.Providers.Completion.SuggestionTest do
4107
4170
list = Suggestion . suggestions ( buffer , 6 , 10 )
4108
4171
assert [ % { name: "bar" } , % { name: "foo" } ] = list |> Enum . filter ( & ( & 1 . type == :param_option ) )
4109
4172
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
4110
4253
end
4111
4254
4112
4255
describe "suggestions for typespecs" do
0 commit comments