@@ -45,9 +45,16 @@ defmodule Expert.EngineNode do
4545 | path_append_arguments ( paths )
4646 ]
4747
48- port = Expert.Port . open_elixir ( state . project , args: args )
49-
50- % { state | port: port , started_by: from }
48+ case Expert.Port . open_elixir ( state . project , args: args ) do
49+ { :error , :no_elixir , message } ->
50+ GenLSP . error ( Expert . get_lsp ( ) , message )
51+ Expert . terminate ( "Failed to find an elixir executable, shutting down" , 1 )
52+ { :error , :no_elixir }
53+
54+ port ->
55+ state = % { state | port: port , started_by: from }
56+ { :ok , state }
57+ end
5158 end
5259
5360 def stop ( % __MODULE__ { } = state , from , stop_timeout ) do
@@ -166,48 +173,54 @@ defmodule Expert.EngineNode do
166173 defp glob_paths ( % Project { } = project ) do
167174 lsp = Expert . get_lsp ( )
168175 project_name = Project . name ( project )
169- { :ok , elixir , env } = Expert.Port . elixir_executable ( project )
170-
171- GenLSP . info ( lsp , "Found elixir for #{ project_name } at #{ elixir } " )
172-
173- expert_priv = :code . priv_dir ( :expert )
174- packaged_engine_source = Path . join ( [ expert_priv , "engine_source" , "apps" , "engine" ] )
175-
176- engine_source =
177- "EXPERT_ENGINE_PATH"
178- |> System . get_env ( packaged_engine_source )
179- |> Path . expand ( )
180-
181- build_engine_script = Path . join ( expert_priv , "build_engine.exs" )
182-
183- opts =
184- [
185- :stderr_to_stdout ,
186- args: [
187- elixir ,
188- build_engine_script ,
189- "--source-path" ,
190- engine_source ,
191- "--vsn" ,
192- Expert . vsn ( )
193- ] ,
194- env: Expert.Port . ensure_charlists ( env ) ,
195- cd: engine_source
196- ]
197-
198- launcher = Expert.Port . path ( )
199176
200- GenLSP . info ( lsp , "Finding or building engine for project #{ project_name } " )
201-
202- with_progress ( project , "Building engine for #{ project_name } " , fn ->
203- port =
204- Port . open (
205- { :spawn_executable , launcher } ,
206- opts
207- )
208-
209- wait_for_engine ( port )
210- end )
177+ case Expert.Port . elixir_executable ( project ) do
178+ { :ok , elixir , env } ->
179+ GenLSP . info ( lsp , "Found elixir for #{ project_name } at #{ elixir } " )
180+
181+ expert_priv = :code . priv_dir ( :expert )
182+ packaged_engine_source = Path . join ( [ expert_priv , "engine_source" , "apps" , "engine" ] )
183+
184+ engine_source =
185+ "EXPERT_ENGINE_PATH"
186+ |> System . get_env ( packaged_engine_source )
187+ |> Path . expand ( )
188+
189+ build_engine_script = Path . join ( expert_priv , "build_engine.exs" )
190+
191+ opts =
192+ [
193+ :stderr_to_stdout ,
194+ args: [
195+ elixir ,
196+ build_engine_script ,
197+ "--source-path" ,
198+ engine_source ,
199+ "--vsn" ,
200+ Expert . vsn ( )
201+ ] ,
202+ env: Expert.Port . ensure_charlists ( env ) ,
203+ cd: engine_source
204+ ]
205+
206+ launcher = Expert.Port . path ( )
207+
208+ GenLSP . info ( lsp , "Finding or building engine for project #{ project_name } " )
209+
210+ with_progress ( project , "Building engine for #{ project_name } " , fn ->
211+ port =
212+ Port . open (
213+ { :spawn_executable , launcher } ,
214+ opts
215+ )
216+
217+ wait_for_engine ( port )
218+ end )
219+
220+ { :error , :no_elixir , message } ->
221+ GenLSP . error ( Expert . get_lsp ( ) , message )
222+ Expert . terminate ( "Failed to find an elixir executable, shutting down" , 1 )
223+ end
211224 end
212225
213226 defp wait_for_engine ( port ) do
@@ -273,8 +286,14 @@ defmodule Expert.EngineNode do
273286 def handle_call ( { :start , paths } , from , % State { } = state ) do
274287 :ok = :net_kernel . monitor_nodes ( true , node_type: :all )
275288 Process . send_after ( self ( ) , :maybe_start_timeout , @ start_timeout )
276- state = State . start ( state , paths , from )
277- { :noreply , state }
289+
290+ case State . start ( state , paths , from ) do
291+ { :ok , state } ->
292+ { :noreply , state }
293+
294+ { :error , :no_elixir } ->
295+ { :reply , { :error , :no_elixir } , state }
296+ end
278297 end
279298
280299 @ impl true
0 commit comments