Skip to content

Commit 10a9d20

Browse files
committed
feat: progress messages for workspace indexing
1 parent b202da1 commit 10a9d20

File tree

7 files changed

+86
-15
lines changed

7 files changed

+86
-15
lines changed

lib/next_ls.ex

+1
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ defmodule NextLS do
375375
{NextLS.Runtime.Supervisor,
376376
path: Path.join(working_dir, ".elixir-tools"),
377377
name: name,
378+
lsp: lsp,
378379
registry: lsp.assigns.registry,
379380
logger: lsp.assigns.logger,
380381
runtime: [

lib/next_ls/db.ex

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
defmodule NextLS.DB do
2-
@moduledoc false
2+
@moduledoc nil
33
use GenServer
44

55
import __MODULE__.Query
@@ -26,6 +26,7 @@ defmodule NextLS.DB do
2626
file = Keyword.fetch!(args, :file)
2727
registry = Keyword.fetch!(args, :registry)
2828
logger = Keyword.fetch!(args, :logger)
29+
activity = Keyword.fetch!(args, :activity)
2930
Registry.register(registry, :databases, %{})
3031
{:ok, conn} = Exqlite.Basic.open(file)
3132

@@ -35,11 +36,14 @@ defmodule NextLS.DB do
3536
%{
3637
conn: conn,
3738
file: file,
38-
logger: logger
39+
logger: logger,
40+
activity: activity
3941
}}
4042
end
4143

4244
def handle_call({:query, query, args}, _from, %{conn: conn} = s) do
45+
{:message_queue_len, count} = Process.info(self(), :message_queue_len)
46+
NextLS.DB.Activity.update(s.activity, count)
4347
rows = __query__({conn, s.logger}, query, args)
4448

4549
{:reply, rows, s}
@@ -74,6 +78,9 @@ defmodule NextLS.DB do
7478
end
7579

7680
def handle_cast({:insert_symbol, symbol}, %{conn: conn} = s) do
81+
{:message_queue_len, count} = Process.info(self(), :message_queue_len)
82+
NextLS.DB.Activity.update(s.activity, count)
83+
7784
%{
7885
module: mod,
7986
module_line: module_line,
@@ -128,6 +135,9 @@ defmodule NextLS.DB do
128135
end
129136

130137
def handle_cast({:insert_reference, reference}, %{conn: conn} = s) do
138+
{:message_queue_len, count} = Process.info(self(), :message_queue_len)
139+
NextLS.DB.Activity.update(s.activity, count)
140+
131141
%{
132142
meta: meta,
133143
identifier: identifier,

lib/next_ls/db/activity.ex

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
defmodule NextLS.DB.Activity do
2+
@moduledoc false
3+
@behaviour :gen_statem
4+
5+
def child_spec(opts) do
6+
%{
7+
id: opts[:name] || opts[:id],
8+
start: {__MODULE__, :start_link, [opts]}
9+
}
10+
end
11+
12+
def start_link(args) do
13+
:gen_statem.start_link({:local, Keyword.get(args, :name)}, __MODULE__, Keyword.drop(args, [:name]), [])
14+
end
15+
16+
def update(statem, count), do: :gen_statem.cast(statem, count)
17+
18+
@impl :gen_statem
19+
def callback_mode, do: :state_functions
20+
21+
@impl :gen_statem
22+
def init(args) do
23+
logger = Keyword.fetch!(args, :logger)
24+
lsp = Keyword.fetch!(args, :lsp)
25+
26+
{:ok, :waiting, %{count: 0, logger: logger, lsp: lsp, token: nil}}
27+
end
28+
29+
def active(:cast, 0, data) do
30+
{:keep_state, %{data | count: 0}, [{:state_timeout, 100, :waiting}]}
31+
end
32+
33+
def active(:cast, mailbox_count, %{count: 0} = data) do
34+
{:keep_state, %{data | count: mailbox_count}, [{:state_timeout, :cancel}]}
35+
end
36+
37+
def active(:cast, mailbox_count, data) do
38+
{:keep_state, %{data | count: mailbox_count}, []}
39+
end
40+
41+
def active(:state_timeout, :waiting, data) do
42+
NextLS.Progress.stop(data.lsp, data.token, "Finished indexing!")
43+
{:next_state, :waiting, %{data | token: nil}}
44+
end
45+
46+
def waiting(:cast, 0, _data) do
47+
:keep_state_and_data
48+
end
49+
50+
def waiting(:cast, mailbox_count, data) do
51+
token = NextLS.Progress.token()
52+
NextLS.Progress.start(data.lsp, token, "Indexing!")
53+
{:next_state, :active, %{data | count: mailbox_count, token: token}}
54+
end
55+
end

lib/next_ls/runtime/supervisor.ex

+6-3
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,24 @@ defmodule NextLS.Runtime.Supervisor do
1010
@impl true
1111
def init(init_arg) do
1212
name = init_arg[:name]
13+
lsp = init_arg[:lsp]
1314
registry = init_arg[:registry]
1415
logger = init_arg[:logger]
1516
hidden_folder = init_arg[:path]
1617
File.mkdir_p!(hidden_folder)
1718
File.write!(Path.join(hidden_folder, ".gitignore"), "*\n")
1819

19-
symbol_table_name = :"symbol-table-#{name}"
2020
db_name = :"db-#{name}"
2121
sidecar_name = :"sidecar-#{name}"
22+
db_activity = :"db-activity-#{name}"
2223

2324
Registry.register(registry, :runtime_supervisors, %{name: name})
2425

2526
children = [
26-
{NextLS.DB, logger: logger, file: "#{hidden_folder}/nextls.db", registry: registry, name: db_name},
27-
{NextLS.Runtime.Sidecar, name: sidecar_name, db: db_name, symbol_table: symbol_table_name},
27+
{NextLS.Runtime.Sidecar, name: sidecar_name, db: db_name},
28+
{NextLS.DB.Activity, logger: logger, name: db_activity, lsp: lsp},
29+
{NextLS.DB,
30+
logger: logger, file: "#{hidden_folder}/nextls.db", registry: registry, name: db_name, activity: db_activity},
2831
{NextLS.Runtime, init_arg[:runtime] ++ [name: name, registry: registry, parent: sidecar_name, db: db_name]}
2932
]
3033

test/next_ls/definition_test.exs

+7-7
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ defmodule NextLS.DefinitionTest do
6262
assert_request(client, "client/registerCapability", fn _params -> nil end)
6363

6464
assert_is_ready(context, "my_proj")
65-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
65+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
6666

6767
uri = uri(bar)
6868

@@ -96,7 +96,7 @@ defmodule NextLS.DefinitionTest do
9696
assert_request(client, "client/registerCapability", fn _params -> nil end)
9797

9898
assert_is_ready(context, "my_proj")
99-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
99+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
100100

101101
uri = uri(bar)
102102

@@ -132,7 +132,7 @@ defmodule NextLS.DefinitionTest do
132132
assert_request(client, "client/registerCapability", fn _params -> nil end)
133133

134134
assert_is_ready(context, "my_proj")
135-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
135+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
136136

137137
uri = uri(bar)
138138

@@ -228,7 +228,7 @@ defmodule NextLS.DefinitionTest do
228228
assert :ok == notify(client, %{method: "initialized", jsonrpc: "2.0", params: %{}})
229229
assert_request(client, "client/registerCapability", fn _params -> nil end)
230230

231-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
231+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
232232

233233
uri = uri(bar)
234234

@@ -262,7 +262,7 @@ defmodule NextLS.DefinitionTest do
262262
assert_request(client, "client/registerCapability", fn _params -> nil end)
263263

264264
assert_is_ready(context, "my_proj")
265-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
265+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
266266

267267
uri = uri(bar)
268268

@@ -298,7 +298,7 @@ defmodule NextLS.DefinitionTest do
298298
assert_request(client, "client/registerCapability", fn _params -> nil end)
299299

300300
assert_is_ready(context, "my_proj")
301-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
301+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
302302

303303
uri = uri(bar)
304304

@@ -369,7 +369,7 @@ defmodule NextLS.DefinitionTest do
369369
assert :ok == notify(client, %{method: "initialized", jsonrpc: "2.0", params: %{}})
370370
assert_request(client, "client/registerCapability", fn _params -> nil end)
371371
assert_is_ready(context, "my_proj")
372-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
372+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
373373

374374
uri = uri(bar)
375375

test/next_ls/references_test.exs

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ defmodule NextLS.ReferencesTest do
4545
assert_request(client, "client/registerCapability", fn _params -> nil end)
4646
assert_is_ready(context, "my_proj")
4747
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
48+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
4849

4950
request(client, %{
5051
method: "textDocument/references",
@@ -78,6 +79,7 @@ defmodule NextLS.ReferencesTest do
7879
assert_request(client, "client/registerCapability", fn _params -> nil end)
7980
assert_is_ready(context, "my_proj")
8081
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
82+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
8183

8284
request(client, %{
8385
method: "textDocument/references",

test/next_ls_test.exs

+3-3
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ defmodule NextLSTest do
240240
assert_request(client, "client/registerCapability", fn _params -> nil end)
241241

242242
assert_is_ready(context, "my_proj")
243-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
243+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
244244

245245
request client, %{
246246
method: "workspace/symbol",
@@ -331,7 +331,7 @@ defmodule NextLSTest do
331331
assert_request(client, "client/registerCapability", fn _params -> nil end)
332332

333333
assert_is_ready(context, "my_proj")
334-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
334+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
335335

336336
request client, %{
337337
method: "workspace/symbol",
@@ -387,7 +387,7 @@ defmodule NextLSTest do
387387
assert_request(client, "client/registerCapability", fn _params -> nil end)
388388

389389
assert_is_ready(context, "my_proj")
390-
assert_notification "window/logMessage", %{"message" => "[NextLS] Compiled!"}
390+
assert_notification "$/progress", %{"value" => %{"kind" => "end", "message" => "Finished indexing!"}}
391391

392392
request client, %{method: "workspace/symbol", id: 2, jsonrpc: "2.0", params: %{query: ""}}
393393

0 commit comments

Comments
 (0)