Skip to content

Commit fb6241c

Browse files
authored
WorkspaceSymbols index after successful build (#263)
* WorkspaceSymbols index after successful build Previously WorkspaceSymbols depended on a side-effect of running Dialyzer: #110 (comment) Now that the Build step loads all modules (added in #227) we need to change the WorkspaceSymbols index to be rebuilt after a successful compile. * Fix tests Allow WorkspaceSymbol to have it's own instance of the GenServer for the test by being parameterized by the server's registered name * Give Server some more time to respond This is probably necessary now because workspace symbols is running earlier * Bump up the timeout
1 parent 269e78d commit fb6241c

File tree

4 files changed

+35
-41
lines changed

4 files changed

+35
-41
lines changed

apps/language_server/lib/language_server/providers/workspace_symbols.ex

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,36 +53,36 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do
5353
## Client API
5454

5555
@spec symbols(String.t()) :: {:ok, [symbol_information_t]}
56-
def symbols(query) do
56+
def symbols(query, server \\ __MODULE__) do
5757
results =
5858
case query do
5959
"f " <> fun_query ->
60-
query(:functions, fun_query)
60+
query(:functions, fun_query, server)
6161

6262
"t " <> type_query ->
63-
query(:types, type_query)
63+
query(:types, type_query, server)
6464

6565
"c " <> callback_query ->
66-
query(:callbacks, callback_query)
66+
query(:callbacks, callback_query, server)
6767

6868
module_query ->
69-
query(:modules, module_query)
69+
query(:modules, module_query, server)
7070
end
7171

7272
{:ok, results}
7373
end
7474

7575
def start_link(opts) do
76-
GenServer.start_link(__MODULE__, :ok, opts |> Keyword.put(:name, __MODULE__))
76+
GenServer.start_link(__MODULE__, :ok, opts |> Keyword.put_new(:name, __MODULE__))
7777
end
7878

79-
def notify_build_complete do
80-
GenServer.cast(__MODULE__, :build_complete)
79+
def notify_build_complete(server \\ __MODULE__) do
80+
GenServer.cast(server, :build_complete)
8181
end
8282

8383
@spec notify_uris_modified([String.t()]) :: :ok
84-
def notify_uris_modified(uris) do
85-
GenServer.cast(__MODULE__, {:uris_modified, uris})
84+
def notify_uris_modified(uris, server \\ __MODULE__) do
85+
GenServer.cast(server, {:uris_modified, uris})
8686
end
8787

8888
## Server Callbacks
@@ -351,13 +351,13 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do
351351
|> elem(0)
352352
end
353353

354-
defp query(kind, query) do
354+
defp query(kind, query, server) do
355355
case String.trim(query) do
356356
"" ->
357357
[]
358358

359359
trimmed ->
360-
GenServer.call(__MODULE__, {:query, kind, trimmed})
360+
GenServer.call(server, {:query, kind, trimmed})
361361
end
362362
end
363363

apps/language_server/lib/language_server/server.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ defmodule ElixirLS.LanguageServer.Server do
183183
_ -> handle_build_result(:error, [Build.exception_to_diagnostic(reason)], state)
184184
end
185185

186+
if reason == :normal do
187+
WorkspaceSymbols.notify_build_complete()
188+
end
189+
186190
state = if state.needs_build?, do: trigger_build(state), else: state
187191
{:noreply, state}
188192
end
@@ -670,8 +674,6 @@ defmodule ElixirLS.LanguageServer.Server do
670674
GenServer.reply(from, contracts)
671675
end
672676

673-
WorkspaceSymbols.notify_build_complete()
674-
675677
%{state | analysis_ready?: true, awaiting_contracts: dirty}
676678
else
677679
state

apps/language_server/test/providers/workspace_symbols_test.exs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
22
use ExUnit.Case, async: false
33
alias ElixirLS.LanguageServer.Providers.WorkspaceSymbols
44

5+
@server_name WorkspaceSymbolsTestServer
6+
57
setup do
68
alias ElixirLS.Utils.PacketCapture
79
packet_capture = start_supervised!({PacketCapture, self()})
810
Process.register(packet_capture, :elixir_ls_test_process)
911

10-
pid =
11-
case WorkspaceSymbols.start_link([]) do
12-
{:ok, pid} -> pid
13-
{:error, {:already_started, pid}} -> pid
14-
end
12+
{:ok, pid} = WorkspaceSymbols.start_link(name: @server_name)
1513

1614
state = :sys.get_state(pid)
1715

@@ -31,19 +29,15 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
3129
}
3230
end)
3331

34-
WorkspaceSymbols.notify_build_complete()
32+
WorkspaceSymbols.notify_build_complete(@server_name)
3533

3634
wait_until_indexed(pid)
3735

38-
on_exit(fn ->
39-
:sys.replace_state(pid, fn _ -> state end)
40-
end)
41-
4236
{:ok, %{}}
4337
end
4438

4539
test "empty query" do
46-
assert {:ok, []} == WorkspaceSymbols.symbols("")
40+
assert {:ok, []} == WorkspaceSymbols.symbols("", @server_name)
4741

4842
assert_receive %{
4943
"method" => "window/logMessage",
@@ -62,7 +56,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
6256
},
6357
name: "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"
6458
}
65-
]} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.")
59+
]} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", @server_name)
6660

6761
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
6862

@@ -76,7 +70,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
7670
},
7771
name: "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"
7872
}
79-
]} = WorkspaceSymbols.symbols("work")
73+
]} = WorkspaceSymbols.symbols("work", @server_name)
8074

8175
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
8276
end
@@ -129,7 +123,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
129123
name: "f ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.__info__/1"
130124
}
131125
]
132-
} = WorkspaceSymbols.symbols("f ElixirLS.LanguageServer.Fixtures.")
126+
} = WorkspaceSymbols.symbols("f ElixirLS.LanguageServer.Fixtures.", @server_name)
133127

134128
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
135129

@@ -143,7 +137,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
143137
},
144138
name: "f ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_function/1"
145139
}
146-
]} = WorkspaceSymbols.symbols("f fun")
140+
]} = WorkspaceSymbols.symbols("f fun", @server_name)
147141

148142
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
149143
end
@@ -168,7 +162,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
168162
name: "t ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0"
169163
}
170164
]
171-
} = WorkspaceSymbols.symbols("t ElixirLS.LanguageServer.Fixtures.")
165+
} = WorkspaceSymbols.symbols("t ElixirLS.LanguageServer.Fixtures.", @server_name)
172166

173167
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
174168

@@ -184,7 +178,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
184178
name: "t ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0"
185179
}
186180
]
187-
} = WorkspaceSymbols.symbols("t opa")
181+
} = WorkspaceSymbols.symbols("t opa", @server_name)
188182

189183
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
190184
end
@@ -209,7 +203,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
209203
name: "c ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1"
210204
}
211205
]
212-
} = WorkspaceSymbols.symbols("c ElixirLS.LanguageServer.Fixtures.")
206+
} = WorkspaceSymbols.symbols("c ElixirLS.LanguageServer.Fixtures.", @server_name)
213207

214208
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
215209

@@ -223,7 +217,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
223217
},
224218
name: "c ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1"
225219
}
226-
]} = WorkspaceSymbols.symbols("c macr")
220+
]} = WorkspaceSymbols.symbols("c macr", @server_name)
227221

228222
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
229223
end

apps/language_server/test/server_test.exs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,13 @@ defmodule ElixirLS.LanguageServer.ServerTest do
267267
"uri" => ^error_file,
268268
"diagnostics" => [
269269
%{
270-
"message" =>
271-
"(CompileError) undefined function does_not_exist" <>
272-
_,
270+
"message" => "(CompileError) undefined function does_not_exist" <> _,
273271
"range" => %{"end" => %{"line" => 3}, "start" => %{"line" => 3}},
274272
"severity" => 1
275273
}
276274
]
277-
})
275+
}),
276+
1000
278277
end)
279278
end
280279

@@ -288,14 +287,13 @@ defmodule ElixirLS.LanguageServer.ServerTest do
288287
"uri" => ^error_file,
289288
"diagnostics" => [
290289
%{
291-
"message" =>
292-
"(SyntaxError) syntax error before: ','" <>
293-
_,
290+
"message" => "(SyntaxError) syntax error before: ','" <> _,
294291
"range" => %{"end" => %{"line" => 1}, "start" => %{"line" => 1}},
295292
"severity" => 1
296293
}
297294
]
298-
})
295+
}),
296+
1000
299297
end)
300298
end
301299

0 commit comments

Comments
 (0)