Skip to content

Commit ddd28de

Browse files
dvicmhanberg
andauthored
feat(definition): go to dependency (#171)
Co-authored-by: Mitchell Hanberg <[email protected]>
1 parent 9864fc4 commit ddd28de

File tree

6 files changed

+426
-60
lines changed

6 files changed

+426
-60
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444
run: rm -rf tmp
4545

4646
- name: Run Tests
47-
run: elixir --erl '-kernel prevent_overlapping_partitions false' -S mix test
47+
run: elixir --erl '-kernel prevent_overlapping_partitions false' -S mix test --max-cases 2
4848

4949
formatter:
5050
runs-on: ubuntu-latest

lib/next_ls.ex

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ defmodule NextLS do
194194
WHERE refs.identifier = ?
195195
AND refs.type = ?
196196
AND refs.module = ?
197-
AND NOT like('/home/runner/work/elixir/%', refs.file)
197+
AND refs.source = 'user'
198198
""",
199199
[function, "function", module]
200200
)
@@ -207,7 +207,7 @@ defmodule NextLS do
207207
FROM "references" as refs
208208
WHERE refs.module = ?
209209
AND refs.type = ?
210-
AND NOT like('/home/runner/work/elixir/%', refs.file)
210+
AND refs.source = 'user'
211211
""",
212212
[module, "alias"]
213213
)
@@ -216,12 +216,12 @@ defmodule NextLS do
216216
[]
217217
end
218218

219-
for [file, start_line, end_line, start_column, end_column] <- references do
219+
for [file, startl, endl, startc, endc] <- references, match?({:ok, _}, File.stat(file)) do
220220
%Location{
221221
uri: "file://#{file}",
222222
range: %Range{
223-
start: %Position{line: clamp(start_line - 1), character: clamp(start_column - 1)},
224-
end: %Position{line: clamp(end_line - 1), character: clamp(end_column - 1)}
223+
start: %Position{line: clamp(startl - 1), character: clamp(startc - 1)},
224+
end: %Position{line: clamp(endl - 1), character: clamp(endc - 1)}
225225
}
226226
}
227227
end
@@ -241,9 +241,33 @@ defmodule NextLS do
241241
end
242242
end
243243

244+
symbols = fn pid ->
245+
rows =
246+
DB.query(
247+
pid,
248+
~Q"""
249+
SELECT *
250+
FROM symbols
251+
WHERE source = 'user';
252+
""",
253+
[]
254+
)
255+
256+
for [_pk, module, file, type, name, line, column | _] <- rows do
257+
%{
258+
module: module,
259+
file: file,
260+
type: type,
261+
name: name,
262+
line: line,
263+
column: column
264+
}
265+
end
266+
end
267+
244268
symbols =
245269
dispatch(lsp.assigns.registry, :databases, fn entries ->
246-
for {pid, _} <- entries, symbol <- DB.symbols(pid), filter.(symbol.name) do
270+
for {pid, _} <- entries, symbol <- symbols.(pid), filter.(symbol.name) do
247271
name =
248272
if symbol.type != "defstruct" do
249273
"#{symbol.type} #{symbol.name}"

lib/next_ls/db.ex

Lines changed: 16 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ defmodule NextLS.DB do
1313
@spec query(pid(), query(), list()) :: list()
1414
def query(server, query, args \\ []), do: GenServer.call(server, {:query, query, args}, :infinity)
1515

16-
@spec symbols(pid()) :: list(map())
17-
def symbols(server), do: GenServer.call(server, :symbols, :infinity)
18-
1916
@spec insert_symbol(pid(), map()) :: :ok
2017
def insert_symbol(server, payload), do: GenServer.cast(server, {:insert_symbol, payload})
2118

@@ -51,34 +48,6 @@ defmodule NextLS.DB do
5148
{:reply, rows, s}
5249
end
5350

54-
def handle_call(:symbols, _from, %{conn: conn} = s) do
55-
rows =
56-
__query__(
57-
{conn, s.logger},
58-
~Q"""
59-
SELECT
60-
*
61-
FROM
62-
symbols;
63-
""",
64-
[]
65-
)
66-
67-
symbols =
68-
for [_pk, module, file, type, name, line, column | _] <- rows do
69-
%{
70-
module: module,
71-
file: file,
72-
type: type,
73-
name: name,
74-
line: line,
75-
column: column
76-
}
77-
end
78-
79-
{:reply, symbols, s}
80-
end
81-
8251
def handle_cast({:insert_symbol, symbol}, %{conn: conn} = s) do
8352
{:message_queue_len, count} = Process.info(self(), :message_queue_len)
8453
NextLS.DB.Activity.update(s.activity, count)
@@ -88,7 +57,8 @@ defmodule NextLS.DB do
8857
module_line: module_line,
8958
struct: struct,
9059
file: file,
91-
defs: defs
60+
defs: defs,
61+
source: source
9262
} = symbol
9363

9464
__query__(
@@ -103,10 +73,10 @@ defmodule NextLS.DB do
10373
__query__(
10474
{conn, s.logger},
10575
~Q"""
106-
INSERT INTO symbols (module, file, type, name, line, 'column')
107-
VALUES (?, ?, ?, ?, ?, ?);
76+
INSERT INTO symbols (module, file, type, name, line, 'column', source)
77+
VALUES (?, ?, ?, ?, ?, ?, ?);
10878
""",
109-
[mod, file, "defmodule", mod, module_line, 1]
79+
[mod, file, "defmodule", mod, module_line, 1, source]
11080
)
11181

11282
if struct do
@@ -115,21 +85,21 @@ defmodule NextLS.DB do
11585
__query__(
11686
{conn, s.logger},
11787
~Q"""
118-
INSERT INTO symbols (module, file, type, name, line, 'column')
119-
VALUES (?, ?, ?, ?, ?, ?);
88+
INSERT INTO symbols (module, file, type, name, line, 'column', source)
89+
VALUES (?, ?, ?, ?, ?, ?, ?);
12090
""",
121-
[mod, file, "defstruct", "%#{Macro.to_string(mod)}{}", meta[:line], 1]
91+
[mod, file, "defstruct", "%#{Macro.to_string(mod)}{}", meta[:line], 1, source]
12292
)
12393
end
12494

12595
for {name, {:v1, type, _meta, clauses}} <- defs, {meta, _, _, _} <- clauses do
12696
__query__(
12797
{conn, s.logger},
12898
~Q"""
129-
INSERT INTO symbols (module, file, type, name, line, 'column')
130-
VALUES (?, ?, ?, ?, ?, ?);
99+
INSERT INTO symbols (module, file, type, name, line, 'column', source)
100+
VALUES (?, ?, ?, ?, ?, ?, ?);
131101
""",
132-
[mod, file, type, name, meta[:line], meta[:column] || 1]
102+
[mod, file, type, name, meta[:line], meta[:column] || 1, source]
133103
)
134104
end
135105

@@ -145,7 +115,8 @@ defmodule NextLS.DB do
145115
identifier: identifier,
146116
file: file,
147117
type: type,
148-
module: module
118+
module: module,
119+
source: source
149120
} = reference
150121

151122
line = meta[:line] || 1
@@ -157,10 +128,10 @@ defmodule NextLS.DB do
157128
__query__(
158129
{conn, s.logger},
159130
~Q"""
160-
INSERT INTO 'references' (identifier, arity, file, type, module, start_line, start_column, end_line, end_column)
161-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);
131+
INSERT INTO 'references' (identifier, arity, file, type, module, start_line, start_column, end_line, end_column, source)
132+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
162133
""",
163-
[identifier, reference[:arity], file, type, module, start_line, start_column, end_line, end_column]
134+
[identifier, reference[:arity], file, type, module, start_line, start_column, end_line, end_column, source]
164135
)
165136

166137
{:noreply, s}

lib/next_ls/db/schema.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ defmodule NextLS.DB.Schema do
2323

2424
alias NextLS.DB
2525

26-
@version 3
26+
@version 4
2727

2828
def init(conn) do
2929
# FIXME: this is odd tech debt. not a big deal but is confusing
@@ -95,6 +95,7 @@ defmodule NextLS.DB.Schema do
9595
start_column integer NOT NULL,
9696
end_line integer NOT NULL,
9797
end_column integer NOT NULL,
98+
source text NOT NULL DEFAULT 'user',
9899
inserted_at text NOT NULL DEFAULT CURRENT_TIMESTAMP
99100
)
100101
""",

priv/monkey/_next_ls_private_compiler.ex

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,57 @@
1+
defmodule NextLSPrivate.DepTracer do
2+
@moduledoc false
3+
4+
@source "dep"
5+
6+
def trace(:start, _env) do
7+
:ok
8+
end
9+
10+
def trace({:on_module, bytecode, _}, env) do
11+
parent = parent_pid()
12+
13+
defs = Module.definitions_in(env.module)
14+
15+
defs =
16+
for {name, arity} = _def <- defs do
17+
{name, Module.get_definition(env.module, {name, arity})}
18+
end
19+
20+
{:ok, {_, [{~c"Dbgi", bin}]}} = :beam_lib.chunks(bytecode, [~c"Dbgi"])
21+
22+
{:debug_info_v1, _, {_, %{line: line, struct: struct}, _}} = :erlang.binary_to_term(bin)
23+
24+
Process.send(
25+
parent,
26+
{:tracer,
27+
%{
28+
file: env.file,
29+
module: env.module,
30+
module_line: line,
31+
struct: struct,
32+
defs: defs,
33+
source: @source
34+
}},
35+
[]
36+
)
37+
38+
:ok
39+
end
40+
41+
def trace(_event, _env) do
42+
:ok
43+
end
44+
45+
defp parent_pid do
46+
"NEXTLS_PARENT_PID" |> System.get_env() |> Base.decode64!() |> :erlang.binary_to_term()
47+
end
48+
end
49+
150
defmodule NextLSPrivate.Tracer do
251
@moduledoc false
52+
53+
@source "user"
54+
355
def trace(:start, _env) do
456
:ok
557
end
@@ -17,7 +69,8 @@ defmodule NextLSPrivate.Tracer do
1769
identifier: Map.get(alias_map, module, module),
1870
file: env.file,
1971
type: :alias,
20-
module: module
72+
module: module,
73+
source: @source
2174
}},
2275
[]
2376
)
@@ -42,7 +95,8 @@ defmodule NextLSPrivate.Tracer do
4295
arity: arity,
4396
file: env.file,
4497
type: :function,
45-
module: module
98+
module: module,
99+
source: @source
46100
}},
47101
[]
48102
)
@@ -63,7 +117,8 @@ defmodule NextLSPrivate.Tracer do
63117
arity: arity,
64118
file: env.file,
65119
type: :function,
66-
module: env.module
120+
module: env.module,
121+
source: @source
67122
}},
68123
[]
69124
)
@@ -93,7 +148,8 @@ defmodule NextLSPrivate.Tracer do
93148
module: env.module,
94149
module_line: line,
95150
struct: struct,
96-
defs: defs
151+
defs: defs,
152+
source: @source
97153
}},
98154
[]
99155
)
@@ -113,11 +169,15 @@ end
113169
defmodule :_next_ls_private_compiler do
114170
@moduledoc false
115171

172+
@tracers Code.get_compiler_option(:tracers)
173+
116174
def compile do
117175
# keep stdout on this node
118176
Process.group_leader(self(), Process.whereis(:user))
119177
Code.put_compiler_option(:parser_options, columns: true, token_metadata: true)
120178

179+
Code.put_compiler_option(:tracers, [NextLSPrivate.DepTracer | @tracers])
180+
121181
Mix.Task.clear()
122182

123183
# load the paths for deps and compile them
@@ -129,12 +189,12 @@ defmodule :_next_ls_private_compiler do
129189
# task was not re-enabled it seems
130190
Mix.Task.rerun("deps.loadpaths")
131191

192+
Code.put_compiler_option(:tracers, [NextLSPrivate.Tracer | @tracers])
193+
132194
Mix.Task.rerun("compile", [
133195
"--ignore-module-conflict",
134196
"--no-protocol-consolidation",
135-
"--return-errors",
136-
"--tracer",
137-
"NextLSPrivate.Tracer"
197+
"--return-errors"
138198
])
139199
rescue
140200
e -> {:error, e}

0 commit comments

Comments
 (0)