Skip to content

Commit 6dde399

Browse files
committed
textDocument/documentSymbol should handle a non-fully initialized server
Sometimes requests will be processed when the server has not been initialized with client capabilities yet, this should not result in an error. Was previously: ``` [Error - 6:07:18 AM] Request textDocument/documentSymbol failed. Message: an exception was raised: ** (BadMapError) expected a map, got: nil (elixir 1.10.2) lib/map.ex:450: Map.get(nil, "textDocument", %{}) (language_server 0.3.0) lib/language_server/server.ex:398: anonymous fn/2 in ElixirLS.LanguageServer.Server.handle_request/2 (language_server 0.3.0) lib/language_server/server.ex:485: anonymous fn/3 in ElixirLS.LanguageServer.Server.handle_request_async/2 Code: -32000 ``` Fixes #172
1 parent 0e339c8 commit 6dde399

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
### Unreleased
22

3+
Bug Fixes:
4+
- Fix `textDocument/documentSymbol` on a non-fully initialized server (thanks [Jason Axelson](https://github.com/axelson)) [#173](https://github.com/elixir-lsp/elixir-ls/pull/173)
5+
36
### v0.3.2: 28 Mar 2020
47

58
Improvements:

apps/language_server/lib/language_server/server.ex

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,19 @@ defmodule ElixirLS.LanguageServer.Server do
394394
defp handle_request(document_symbol_req(_id, uri), state) do
395395
fun = fn ->
396396
hierarchical? =
397-
state.client_capabilities
398-
|> Map.get("textDocument", %{})
399-
|> Map.get("documentSymbol", %{})
400-
|> Map.get("hierarchicalDocumentSymbolSupport", false)
397+
get_in(state.client_capabilities, [
398+
"textDocument",
399+
"documentSymbol",
400+
"hierarchicalDocumentSymbolSupport"
401+
]) || false
401402

402-
DocumentSymbols.symbols(uri, state.source_files[uri].text, hierarchical?)
403+
source_file = state.source_files[uri]
404+
405+
if source_file do
406+
DocumentSymbols.symbols(uri, source_file.text, hierarchical?)
407+
else
408+
{:ok, []}
409+
end
403410
end
404411

405412
{:async, fun, state}

apps/language_server/test/server_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@ defmodule ElixirLS.LanguageServer.ServerTest do
126126
assert %{received_shutdown?: true} = :sys.get_state(server)
127127
end
128128

129+
test "document symbols request when there are no client capabilities and the source file is not loaded into the server",
130+
%{server: server} do
131+
server_state = :sys.get_state(server)
132+
assert server_state.client_capabilities == nil
133+
assert server_state.source_files == %{}
134+
135+
Server.receive_packet(server, document_symbol_req(1, "file:///file.ex"))
136+
137+
resp = assert_receive(%{"id" => 1}, 1000)
138+
assert resp["result"] == []
139+
end
140+
129141
test "incremental formatter", %{server: server} do
130142
in_fixture(__DIR__, "formatter", fn ->
131143
uri = Path.join([root_uri(), "file.ex"])

0 commit comments

Comments
 (0)