@@ -587,8 +587,7 @@ defmodule ElixirLS.LanguageServer.Server do
587
587
end
588
588
end
589
589
590
- defp handle_notification ( did_change_watched_files ( changes ) , state = % __MODULE__ { } )
591
- when is_binary ( state . project_dir ) do
590
+ defp handle_notification ( did_change_watched_files ( changes ) , state = % __MODULE__ { mix_project?: true } ) do
592
591
changes = Enum . filter ( changes , & match? ( % { "uri" => "file:" <> _ } , & 1 ) )
593
592
594
593
# `settings` may not always be available here, like during testing
@@ -657,7 +656,7 @@ defmodule ElixirLS.LanguageServer.Server do
657
656
end
658
657
659
658
defp handle_notification ( did_change_watched_files ( _changes ) , state = % __MODULE__ { } ) do
660
- # swallow notification if project_dir is not yet set
659
+ # swallow notification if we are not in mix_project
661
660
state
662
661
end
663
662
@@ -1127,17 +1126,19 @@ defmodule ElixirLS.LanguageServer.Server do
1127
1126
end
1128
1127
1129
1128
defp get_spec_code_lenses ( state = % __MODULE__ { } , uri , source_file ) do
1130
- if is_binary ( state . project_dir ) and dialyzer_enabled? ( state ) and ! ! state . settings [ "suggestSpecs" ] do
1129
+ enabled? = Map . get ( state . settings || { } , "suggestSpecs" , true )
1130
+ if state . mix_project? and dialyzer_enabled? ( state ) and enabled? do
1131
1131
CodeLens . spec_code_lens ( state . server_instance_id , uri , source_file . text )
1132
1132
else
1133
1133
{ :ok , [ ] }
1134
1134
end
1135
1135
end
1136
1136
1137
1137
defp get_test_code_lenses ( state = % __MODULE__ { } , uri , source_file ) do
1138
- enabled = state . settings [ "enableTestLenses" ] || false
1138
+ # TODO check why test run from lense fails when autoBuild is disabled
1139
+ enabled? = Map . get ( state . settings || { } , "autoBuild" , true ) and Map . get ( state . settings || { } , "enableTestLenses" , false )
1139
1140
1140
- if is_binary ( state . project_dir ) and enabled do
1141
+ if state . mix_project? and enabled? and ElixirLS.LanguageServer.MixProject . loaded? do
1141
1142
get_test_code_lenses (
1142
1143
state ,
1143
1144
uri ,
@@ -1232,19 +1233,20 @@ defmodule ElixirLS.LanguageServer.Server do
1232
1233
# Build
1233
1234
1234
1235
defp trigger_build ( state = % __MODULE__ { project_dir: project_dir } ) do
1235
- build_automatically = Map . get ( state . settings || % { } , "autoBuild" , true )
1236
-
1237
1236
cond do
1238
- not build_enabled? ( state ) ->
1237
+ not state . mix_project? ->
1239
1238
state
1240
1239
1241
- not state . build_running? and build_automatically ->
1242
- fetch_deps? = Map . get ( state . settings || % { } , "fetchDeps" , false )
1240
+ not state . build_running? ->
1241
+ opts = [
1242
+ fetch_deps?: Map . get ( state . settings || % { } , "fetchDeps" , false ) ,
1243
+ compile?: Map . get ( state . settings || % { } , "autoBuild" , true )
1244
+ ]
1243
1245
1244
1246
{ _pid , build_ref } = case File . cwd ( ) do
1245
1247
{ :ok , cwd } ->
1246
1248
if Path . absname ( cwd ) == Path . absname ( project_dir ) do
1247
- Build . build ( self ( ) , project_dir , fetch_deps?: fetch_deps? )
1249
+ Build . build ( self ( ) , project_dir , opts )
1248
1250
else
1249
1251
Logger . info ( "Skipping build because cwd changed from #{ project_dir } to #{ cwd } " )
1250
1252
{ nil , nil }
@@ -1255,7 +1257,7 @@ defmodule ElixirLS.LanguageServer.Server do
1255
1257
# try to change back to project dir
1256
1258
case File . cd ( project_dir ) do
1257
1259
:ok ->
1258
- Build . build ( self ( ) , project_dir , fetch_deps?: fetch_deps? )
1260
+ Build . build ( self ( ) , project_dir , opts )
1259
1261
{ :error , reason } ->
1260
1262
message = "Cannot change directory to project dir #{ project_dir } : #{ inspect ( reason ) } "
1261
1263
Logger . error ( message )
@@ -1273,6 +1275,7 @@ defmodule ElixirLS.LanguageServer.Server do
1273
1275
}
1274
1276
1275
1277
true ->
1278
+ # build already running, schedule another one
1276
1279
% __MODULE__ { state | needs_build?: true , analysis_ready?: false }
1277
1280
end
1278
1281
end
@@ -1373,10 +1376,6 @@ defmodule ElixirLS.LanguageServer.Server do
1373
1376
end
1374
1377
end
1375
1378
1376
- defp build_enabled? ( state = % __MODULE__ { } ) do
1377
- is_binary ( state . project_dir )
1378
- end
1379
-
1380
1379
defp dialyzer_enabled? ( state = % __MODULE__ { } ) do
1381
1380
state . dialyzer_sup != nil
1382
1381
end
@@ -1471,7 +1470,7 @@ defmodule ElixirLS.LanguageServer.Server do
1471
1470
1472
1471
defp set_settings ( state = % __MODULE__ { } , settings ) do
1473
1472
enable_dialyzer =
1474
- Dialyzer . check_support ( ) == :ok && Map . get ( settings , "dialyzerEnabled" , true )
1473
+ Dialyzer . check_support ( ) == :ok and Map . get ( settings , "autoBuild" , true ) and Map . get ( settings , "dialyzerEnabled" , true )
1475
1474
1476
1475
env_vars = Map . get ( settings , "envVariables" )
1477
1476
mix_env = Map . get ( settings , "mixEnv" )
@@ -1584,11 +1583,11 @@ defmodule ElixirLS.LanguageServer.Server do
1584
1583
1585
1584
defp set_dialyzer_enabled ( state = % __MODULE__ { } , enable_dialyzer ) do
1586
1585
cond do
1587
- enable_dialyzer and state . dialyzer_sup == nil and is_binary ( state . project_dir ) ->
1586
+ enable_dialyzer and state . mix_project? and state . dialyzer_sup == nil ->
1588
1587
{ :ok , pid } = Dialyzer.Supervisor . start_link ( state . project_dir )
1589
- % { state | dialyzer_sup: pid }
1588
+ % { state | dialyzer_sup: pid , analysis_ready?: false }
1590
1589
1591
- not enable_dialyzer and state . dialyzer_sup != nil ->
1590
+ not ( enable_dialyzer and state . mix_project? ) and state . dialyzer_sup != nil ->
1592
1591
Process . exit ( state . dialyzer_sup , :normal )
1593
1592
% { state | dialyzer_sup: nil , analysis_ready?: false }
1594
1593
0 commit comments