Skip to content

Commit 07209bd

Browse files
authored
add additional extensions, clean (#569)
* rebase cleanup * guard against nil settings during testing * fix for merge mixup, all tests pass * add test
1 parent 4def53f commit 07209bd

File tree

2 files changed

+53
-21
lines changed

2 files changed

+53
-21
lines changed

apps/language_server/lib/language_server/server.ex

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ defmodule ElixirLS.LanguageServer.Server do
7171
end
7272
end
7373

74-
@watched_extensions [
74+
@default_watched_extensions [
7575
".ex",
7676
".exs",
7777
".erl",
@@ -266,23 +266,7 @@ defmodule ElixirLS.LanguageServer.Server do
266266
Process.send_after(self(), :default_config, 5000)
267267

268268
if state.supports_dynamic do
269-
watchers = for ext <- @watched_extensions, do: %{"globPattern" => "**/*" <> ext}
270-
271-
register_capability_result =
272-
JsonRpc.register_capability_request("workspace/didChangeWatchedFiles", %{
273-
"watchers" => watchers
274-
})
275-
276-
case register_capability_result do
277-
{:ok, nil} ->
278-
:ok
279-
280-
other ->
281-
JsonRpc.log_message(
282-
:error,
283-
"client/registerCapability returned: #{inspect(other)}"
284-
)
285-
end
269+
add_watched_extensions(state, @default_watched_extensions)
286270
end
287271

288272
state
@@ -313,8 +297,8 @@ defmodule ElixirLS.LanguageServer.Server do
313297

314298
new_settings =
315299
case changed_settings do
316-
%{"elixirLS" => changed_settings} when is_map(changed_settings) ->
317-
Map.merge(prev_settings, changed_settings)
300+
%{"elixirLS" => settings} when is_map(settings) ->
301+
Map.merge(prev_settings, settings)
318302

319303
_ ->
320304
prev_settings
@@ -415,11 +399,15 @@ defmodule ElixirLS.LanguageServer.Server do
415399
defp handle_notification(did_change_watched_files(changes), state = %__MODULE__{}) do
416400
changes = Enum.filter(changes, &match?(%{"uri" => "file:" <> _}, &1))
417401

402+
# `settings` may not always be available here, like during testing
403+
additional_watched_extensions =
404+
Map.get(state.settings || %{}, "additionalWatchedExtensions", [])
405+
418406
needs_build =
419407
Enum.any?(changes, fn %{"uri" => uri = "file:" <> _, "type" => type} ->
420408
path = SourceFile.path_from_uri(uri)
421409

422-
Path.extname(path) in @watched_extensions and
410+
Path.extname(path) in (additional_watched_extensions ++ @default_watched_extensions) and
423411
(type in [1, 3] or not Map.has_key?(state.source_files, uri) or
424412
state.source_files[uri].dirty?)
425413
end)
@@ -1101,6 +1089,7 @@ defmodule ElixirLS.LanguageServer.Server do
11011089
mix_env = Map.get(settings, "mixEnv", "test")
11021090
mix_target = Map.get(settings, "mixTarget")
11031091
project_dir = Map.get(settings, "projectDir")
1092+
additional_watched_extensions = Map.get(settings, "additionalWatchedExtensions", [])
11041093

11051094
state =
11061095
state
@@ -1109,11 +1098,36 @@ defmodule ElixirLS.LanguageServer.Server do
11091098
|> maybe_set_mix_target(mix_target)
11101099
|> set_project_dir(project_dir)
11111100
|> set_dialyzer_enabled(enable_dialyzer)
1101+
|> add_watched_extensions(additional_watched_extensions)
11121102

11131103
state = create_gitignore(state)
11141104
trigger_build(%{state | settings: settings})
11151105
end
11161106

1107+
defp add_watched_extensions(state = %__MODULE__{}, []) do
1108+
state
1109+
end
1110+
1111+
defp add_watched_extensions(state = %__MODULE__{}, exts) when is_list(exts) do
1112+
case JsonRpc.register_capability_request(
1113+
"workspace/didChangeWatchedFiles",
1114+
%{
1115+
"watchers" => Enum.map(exts, &%{"globPattern" => "**/*" <> &1})
1116+
}
1117+
) do
1118+
{:ok, nil} ->
1119+
:ok
1120+
1121+
other ->
1122+
JsonRpc.log_message(
1123+
:error,
1124+
"client/registerCapability returned: #{inspect(other)}"
1125+
)
1126+
end
1127+
1128+
state
1129+
end
1130+
11171131
defp set_dialyzer_enabled(state = %__MODULE__{}, enable_dialyzer) do
11181132
cond do
11191133
enable_dialyzer and state.dialyzer_sup == nil and is_binary(state.project_dir) ->

apps/language_server/test/server_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,24 @@ defmodule ElixirLS.LanguageServer.ServerTest do
652652
assert state.needs_build? || state.build_running?
653653
end
654654

655+
# https://github.com/elixir-lsp/elixir-ls/pull/569
656+
@tag :additional_extension
657+
test "watched file updated outside, non-default extension", %{server: server} do
658+
uri = "file:///file.veex"
659+
fake_initialize(server)
660+
661+
# Simulate settings related to this test
662+
:sys.replace_state(server, fn state ->
663+
%{state | settings: %{"additionalWatchedExtensions" => [".veex"]}}
664+
end)
665+
666+
# Check if *.veex file triggers build
667+
Server.receive_packet(server, did_change_watched_files([%{"uri" => uri, "type" => 2}]))
668+
669+
state = :sys.get_state(server)
670+
assert state.needs_build? || state.build_running?
671+
end
672+
655673
test "gracefully skip not supported URI scheme", %{server: server} do
656674
uri = "git://github.com/user/repo.git"
657675
fake_initialize(server)

0 commit comments

Comments
 (0)