Skip to content

Commit 32f8313

Browse files
authored
fix: start dedicated process for runtime logging (#94)
Fixes #92
1 parent 5753246 commit 32f8313

File tree

4 files changed

+51
-17
lines changed

4 files changed

+51
-17
lines changed

Diff for: lib/next_ls.ex

+7-7
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,15 @@ defmodule NextLS do
7070
extensions = Keyword.get(args, :extensions, [NextLS.ElixirExtension])
7171
cache = Keyword.fetch!(args, :cache)
7272
symbol_table = Keyword.fetch!(args, :symbol_table)
73+
{:ok, logger} = DynamicSupervisor.start_child(dynamic_supervisor, {NextLS.Logger, lsp: lsp})
7374

7475
{:ok,
7576
assign(lsp,
7677
exit_code: 1,
7778
documents: %{},
7879
refresh_refs: %{},
7980
cache: cache,
81+
logger: logger,
8082
symbol_table: symbol_table,
8183
task_supervisor: task_supervisor,
8284
dynamic_supervisor: dynamic_supervisor,
@@ -269,7 +271,11 @@ defmodule NextLS do
269271
{:ok, runtime} =
270272
DynamicSupervisor.start_child(
271273
lsp.assigns.dynamic_supervisor,
272-
{NextLS.Runtime, extension_registry: lsp.assigns.extension_registry, working_dir: working_dir, parent: self()}
274+
{NextLS.Runtime,
275+
extension_registry: lsp.assigns.extension_registry,
276+
working_dir: working_dir,
277+
parent: self(),
278+
logger: lsp.assigns.logger}
273279
)
274280

275281
Process.monitor(runtime)
@@ -447,12 +453,6 @@ defmodule NextLS do
447453
{:noreply, assign(lsp, runtime: nil)}
448454
end
449455

450-
def handle_info({:log, message}, lsp) do
451-
GenLSP.log(lsp, "[NextLS] " <> String.trim(message))
452-
453-
{:noreply, lsp}
454-
end
455-
456456
def handle_info(message, lsp) do
457457
GenLSP.log(lsp, "[NextLS] Unhanded message: #{inspect(message)}")
458458
{:noreply, lsp}

Diff for: lib/next_ls/logger.ex

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule NextLS.Logger do
2+
use GenServer
3+
4+
def start_link(arg) do
5+
GenServer.start_link(__MODULE__, arg, Keyword.take(arg, [:name]))
6+
end
7+
8+
def log(server, msg), do: GenServer.cast(server, {:log, :log, msg})
9+
def error(server, msg), do: GenServer.cast(server, {:log, :error, msg})
10+
def info(server, msg), do: GenServer.cast(server, {:log, :info, msg})
11+
def warning(server, msg), do: GenServer.cast(server, {:log, :warning, msg})
12+
13+
def init(args) do
14+
lsp = Keyword.fetch!(args, :lsp)
15+
{:ok, %{lsp: lsp}}
16+
end
17+
18+
def handle_cast({:log, type, msg}, state) do
19+
apply(GenLSP, type, [state.lsp, "[NextLS] #{msg}" |> String.trim()])
20+
{:noreply, state}
21+
end
22+
end

Diff for: lib/next_ls/runtime.ex

+6-5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ defmodule NextLS.Runtime do
4343
sname = "nextls-runtime-#{System.system_time()}"
4444
working_dir = Keyword.fetch!(opts, :working_dir)
4545
parent = Keyword.fetch!(opts, :parent)
46+
logger = Keyword.fetch!(opts, :logger)
4647
extension_registry = Keyword.fetch!(opts, :extension_registry)
4748

4849
port =
@@ -81,15 +82,15 @@ defmodule NextLS.Runtime do
8182
with {:ok, host} <- :inet.gethostname(),
8283
node <- :"#{sname}@#{host}",
8384
true <- connect(node, port, 120) do
84-
send(parent, {:log, "Connected to node #{node}"})
85+
NextLS.Logger.log(logger, "Connected to node #{node}")
8586

8687
:next_ls
8788
|> :code.priv_dir()
8889
|> Path.join("monkey/_next_ls_private_compiler.ex")
8990
|> then(&:rpc.call(node, Code, :compile_file, [&1]))
9091
|> tap(fn
9192
{:badrpc, :EXIT, {error, _}} ->
92-
send(parent, {:log, error})
93+
NextLS.Logger.error(logger, error)
9394

9495
_ ->
9596
:ok
@@ -103,7 +104,7 @@ defmodule NextLS.Runtime do
103104
end
104105
end)
105106

106-
{:ok, %{port: port, parent: parent, errors: nil, extension_registry: extension_registry}}
107+
{:ok, %{port: port, logger: logger, parent: parent, errors: nil, extension_registry: extension_registry}}
107108
end
108109

109110
@impl GenServer
@@ -143,12 +144,12 @@ defmodule NextLS.Runtime do
143144
end
144145

145146
def handle_info({port, {:data, data}}, %{port: port} = state) do
146-
send(state.parent, {:log, data})
147+
NextLS.Logger.log(state.logger, data)
147148
{:noreply, state}
148149
end
149150

150151
def handle_info({port, other}, %{port: port} = state) do
151-
send(state.parent, {:log, other})
152+
NextLS.Logger.log(state.logger, other)
152153
{:noreply, state}
153154
end
154155

Diff for: test/next_ls/runtime_test.exs

+16-5
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ defmodule NextLs.RuntimeTest do
2626
Task.start_link(fn ->
2727
recv = fn recv ->
2828
receive do
29-
{:log, msg} ->
30-
Logger.debug(msg)
29+
msg ->
30+
Logger.debug(inspect(msg))
3131
end
3232

3333
recv.(recv)
@@ -41,7 +41,11 @@ defmodule NextLs.RuntimeTest do
4141

4242
test "returns the response in an ok tuple", %{logger: logger, cwd: cwd} do
4343
start_supervised!({Registry, keys: :unique, name: RuntimeTestRegistry})
44-
pid = start_supervised!({Runtime, working_dir: cwd, parent: logger, extension_registry: RuntimeTestRegistry})
44+
45+
pid =
46+
start_supervised!(
47+
{Runtime, working_dir: cwd, parent: self(), logger: logger, extension_registry: RuntimeTestRegistry}
48+
)
4549

4650
Process.link(pid)
4751

@@ -52,7 +56,11 @@ defmodule NextLs.RuntimeTest do
5256

5357
test "call returns an error when the runtime is node ready", %{logger: logger, cwd: cwd} do
5458
start_supervised!({Registry, keys: :unique, name: RuntimeTestRegistry})
55-
pid = start_supervised!({Runtime, working_dir: cwd, parent: logger, extension_registry: RuntimeTestRegistry})
59+
60+
pid =
61+
start_supervised!(
62+
{Runtime, working_dir: cwd, parent: self(), logger: logger, extension_registry: RuntimeTestRegistry}
63+
)
5664

5765
Process.link(pid)
5866

@@ -63,7 +71,10 @@ defmodule NextLs.RuntimeTest do
6371
start_supervised!({Registry, keys: :unique, name: RuntimeTestRegistry})
6472

6573
capture_log(fn ->
66-
pid = start_supervised!({Runtime, working_dir: cwd, parent: logger, extension_registry: RuntimeTestRegistry})
74+
pid =
75+
start_supervised!(
76+
{Runtime, working_dir: cwd, parent: self(), logger: logger, extension_registry: RuntimeTestRegistry}
77+
)
6778

6879
Process.link(pid)
6980

0 commit comments

Comments
 (0)