Skip to content

Commit 949a31d

Browse files
committed
references improvements
1 parent ec6ac2c commit 949a31d

File tree

21 files changed

+489
-63
lines changed

21 files changed

+489
-63
lines changed

apps/language_server/lib/language_server/providers/references/locator.ex

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ defmodule ElixirLS.LanguageServer.Providers.References.Locator do
4949
metadata,
5050
trace
5151
)
52+
|> Enum.uniq()
5253
end
5354
end
5455

@@ -117,8 +118,20 @@ defmodule ElixirLS.LanguageServer.Providers.References.Locator do
117118

118119
binding_env = Binding.from_env(env, metadata, call.position)
119120

121+
mod_or_nil =
122+
case call.kind do
123+
:local_function ->
124+
nil
125+
126+
:local_macro ->
127+
nil
128+
129+
_ ->
130+
call.mod
131+
end
132+
120133
found =
121-
{call.mod, function}
134+
{mod_or_nil, function}
122135
|> wrap_atom
123136
|> expand(binding_env, env.module, env.aliases)
124137
|> Introspection.actual_mod_fun(

apps/language_server/lib/language_server/tracer.ex

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -201,24 +201,41 @@ defmodule ElixirLS.LanguageServer.Tracer do
201201

202202
def trace({kind, meta, module, name, arity}, %Macro.Env{} = env)
203203
when kind in [:imported_function, :imported_macro, :remote_function, :remote_macro] do
204-
register_call(meta, module, name, arity, env)
204+
register_call(meta, module, name, arity, kind, env)
205+
end
206+
207+
def trace({:imported_quoted, meta, module, name, arities}, env) do
208+
for arity <- arities do
209+
register_call(meta, module, name, arity, :imported_quoted, env)
210+
end
211+
212+
:ok
205213
end
206214

207215
def trace({kind, meta, name, arity}, %Macro.Env{} = env)
208216
when kind in [:local_function, :local_macro] do
209-
register_call(meta, env.module, name, arity, env)
217+
register_call(meta, env.module, name, arity, kind, env)
210218
end
211219

212220
def trace({:alias_reference, meta, module}, %Macro.Env{} = env) do
213-
register_call(meta, module, nil, nil, env)
221+
register_call(meta, module, nil, nil, :alias_reference, env)
214222
end
215223

216224
def trace({:alias, meta, module, _as, _opts}, %Macro.Env{} = env) do
217-
register_call(meta, module, nil, nil, env)
225+
register_call(meta, module, nil, nil, :alias, env)
218226
end
219227

220228
def trace({kind, meta, module, _opts}, %Macro.Env{} = env) when kind in [:import, :require] do
221-
register_call(meta, module, nil, nil, env)
229+
register_call(meta, module, nil, nil, kind, env)
230+
end
231+
232+
def trace({:struct_expansion, meta, name, _assocs}, %Macro.Env{} = env) do
233+
register_call(meta, name, nil, nil, :struct_expansion, env)
234+
end
235+
236+
def trace({:alias_expansion, meta, as, alias}, %Macro.Env{} = env) do
237+
register_call(meta, as, nil, nil, :alias_expansion_as, env)
238+
register_call(meta, alias, nil, nil, :alias_expansion, env)
222239
end
223240

224241
def trace(_trace, _env) do
@@ -266,22 +283,26 @@ defmodule ElixirLS.LanguageServer.Tracer do
266283
}
267284
end
268285

269-
defp register_call(meta, module, name, arity, env) do
286+
defp register_call(meta, module, name, arity, kind, env) do
270287
if in_project_sources?(env.file) do
271-
do_register_call(meta, module, name, arity, env)
288+
do_register_call(meta, module, name, arity, kind, env)
272289
end
273290

274291
:ok
275292
end
276293

277-
defp do_register_call(meta, module, name, arity, env) do
294+
defp do_register_call(meta, module, name, arity, kind, env) do
278295
callee = {module, name, arity}
279296

280297
line = meta[:line]
281298
column = meta[:column]
299+
282300
# TODO meta can have last or maybe other?
301+
# last
302+
# end_of_expression
303+
# closing
283304

284-
:ets.insert(table_name(:calls), {{callee, env.file, line, column}, :ok})
305+
:ets.insert(table_name(:calls), {{callee, env.file, line, column}, kind})
285306
end
286307

287308
def get_trace do
@@ -291,12 +312,13 @@ defmodule ElixirLS.LanguageServer.Tracer do
291312

292313
try do
293314
:ets.tab2list(table)
294-
|> Enum.map(fn {{callee, file, line, column}, _} ->
315+
|> Enum.map(fn {{callee, file, line, column}, kind} ->
295316
%{
296317
callee: callee,
297318
file: file,
298319
line: line,
299-
column: column
320+
column: column,
321+
kind: kind
300322
}
301323
end)
302324
|> Enum.group_by(fn %{callee: callee} -> callee end)

0 commit comments

Comments
 (0)