@@ -71,7 +71,7 @@ defmodule ElixirLS.LanguageServer.Server do
71
71
end
72
72
end
73
73
74
- @ watched_extensions [
74
+ @ default_watched_extensions [
75
75
".ex" ,
76
76
".exs" ,
77
77
".erl" ,
@@ -266,23 +266,7 @@ defmodule ElixirLS.LanguageServer.Server do
266
266
Process . send_after ( self ( ) , :default_config , 5000 )
267
267
268
268
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 )
286
270
end
287
271
288
272
state
@@ -313,8 +297,8 @@ defmodule ElixirLS.LanguageServer.Server do
313
297
314
298
new_settings =
315
299
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 )
318
302
319
303
_ ->
320
304
prev_settings
@@ -415,11 +399,15 @@ defmodule ElixirLS.LanguageServer.Server do
415
399
defp handle_notification ( did_change_watched_files ( changes ) , state = % __MODULE__ { } ) do
416
400
changes = Enum . filter ( changes , & match? ( % { "uri" => "file:" <> _ } , & 1 ) )
417
401
402
+ # `settings` may not always be available here, like during testing
403
+ additional_watched_extensions =
404
+ Map . get ( state . settings || % { } , "additionalWatchedExtensions" , [ ] )
405
+
418
406
needs_build =
419
407
Enum . any? ( changes , fn % { "uri" => uri = "file:" <> _ , "type" => type } ->
420
408
path = SourceFile . path_from_uri ( uri )
421
409
422
- Path . extname ( path ) in @ watched_extensions and
410
+ Path . extname ( path ) in ( additional_watched_extensions ++ @ default_watched_extensions ) and
423
411
( type in [ 1 , 3 ] or not Map . has_key? ( state . source_files , uri ) or
424
412
state . source_files [ uri ] . dirty? )
425
413
end )
@@ -1101,6 +1089,7 @@ defmodule ElixirLS.LanguageServer.Server do
1101
1089
mix_env = Map . get ( settings , "mixEnv" , "test" )
1102
1090
mix_target = Map . get ( settings , "mixTarget" )
1103
1091
project_dir = Map . get ( settings , "projectDir" )
1092
+ additional_watched_extensions = Map . get ( settings , "additionalWatchedExtensions" , [ ] )
1104
1093
1105
1094
state =
1106
1095
state
@@ -1109,11 +1098,36 @@ defmodule ElixirLS.LanguageServer.Server do
1109
1098
|> maybe_set_mix_target ( mix_target )
1110
1099
|> set_project_dir ( project_dir )
1111
1100
|> set_dialyzer_enabled ( enable_dialyzer )
1101
+ |> add_watched_extensions ( additional_watched_extensions )
1112
1102
1113
1103
state = create_gitignore ( state )
1114
1104
trigger_build ( % { state | settings: settings } )
1115
1105
end
1116
1106
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
+
1117
1131
defp set_dialyzer_enabled ( state = % __MODULE__ { } , enable_dialyzer ) do
1118
1132
cond do
1119
1133
enable_dialyzer and state . dialyzer_sup == nil and is_binary ( state . project_dir ) ->
0 commit comments