@@ -244,76 +244,74 @@ func (handler *INOLanguageServer) CheckCppDocumentSymbols() error {
244244 return nil
245245}
246246
247- func (ls * INOLanguageServer ) startClangd (inoParams * lsp.InitializeParams ) error {
248- logger := NewLSPFunctionLogger (color .HiCyanString , "INIT --- " )
249- logger .Logf ("initializing workbench: %s" , inoParams .RootURI )
250-
251- // Start clangd asynchronously
252- ls .writeLock (logger , false ) // do not wait for clangd... we are starting it :-)
253- defer ls .writeUnlock (logger )
247+ func (ls * INOLanguageServer ) InitializeReqFromIDE (ctx context.Context , logger jsonrpc.FunctionLogger , inoParams * lsp.InitializeParams ) (* lsp.InitializeResult , * jsonrpc.ResponseError ) {
248+ ls .writeLock (logger , false /* do not wait for clangd... we are going to start it! */ )
249+ go func () {
250+ defer streams .CatchAndLogPanic ()
251+ // the lock is "moved" into the goroutine
252+ defer ls .writeUnlock (logger )
254253
255- ls .sketchRoot = inoParams .RootURI .AsPath ()
256- ls .sketchName = ls .sketchRoot .Base ()
257- ls .buildSketchCpp = ls .buildSketchRoot .Join (ls .sketchName + ".ino.cpp" )
254+ logger := NewLSPFunctionLogger (color .HiCyanString , "INIT --- " )
255+ logger .Logf ("initializing workbench: %s" , inoParams .RootURI )
258256
259- if err := ls .generateBuildEnvironment (logger ); err != nil {
260- return err
261- }
262-
263- if cppContent , err := ls .buildSketchCpp .ReadFile (); err == nil {
264- ls .sketchMapper = sourcemapper .CreateInoMapper (cppContent )
265- ls .sketchMapper .CppText .Version = 1
266- } else {
267- return errors .WithMessage (err , "reading generated cpp file from sketch" )
268- }
257+ ls .sketchRoot = inoParams .RootURI .AsPath ()
258+ ls .sketchName = ls .sketchRoot .Base ()
259+ ls .buildSketchCpp = ls .buildSketchRoot .Join (ls .sketchName + ".ino.cpp" )
269260
270- // Let's start clangd!
271- dataFolder , err := extractDataFolderFromArduinoCLI (logger )
272- if err != nil {
273- logger .Logf ("error: %s" , err )
274- }
261+ if err := ls .generateBuildEnvironment (logger ); err != nil {
262+ logger .Logf ("error starting clang: %s" , err )
263+ return
264+ }
275265
276- // Start clangd
277- ls .Clangd = NewClangdLSPClient (logger , ls .buildPath , ls .buildSketchCpp , dataFolder , ls )
278- go func () {
279- defer streams .CatchAndLogPanic ()
280- ls .Clangd .Run ()
281- logger .Logf ("Lost connection with clangd!" )
282- ls .Close ()
283- }()
266+ if cppContent , err := ls .buildSketchCpp .ReadFile (); err == nil {
267+ ls .sketchMapper = sourcemapper .CreateInoMapper (cppContent )
268+ ls .sketchMapper .CppText .Version = 1
269+ } else {
270+ logger .Logf ("error starting clang: reading generated cpp file from sketch: %s" , err )
271+ return
272+ }
284273
285- // Send initialization command to clangd (1 sec. timeout)
286- ctx , cancel := context .WithTimeout (context .Background (), time .Second )
287- defer cancel ()
288- cppInitializeParams := * inoParams
289- cppInitializeParams .RootPath = ls .buildSketchRoot .String ()
290- cppInitializeParams .RootURI = lsp .NewDocumentURIFromPath (ls .buildSketchRoot )
291- if initRes , clangErr , err := ls .Clangd .conn .Initialize (ctx , & cppInitializeParams ); err != nil {
292- logger .Logf ("error initilizing clangd: %v" , err )
293- return err
294- } else if clangErr != nil {
295- logger .Logf ("error initilizing clangd: %v" , clangErr .AsError ())
296- return clangErr .AsError ()
297- } else {
298- logger .Logf ("clangd successfully started: %s" , string (lsp .EncodeMessage (initRes )))
299- }
274+ // Retrieve data folder
275+ dataFolder , err := extractDataFolderFromArduinoCLI (logger )
276+ if err != nil {
277+ logger .Logf ("error retrieving data folder from arduino-cli: %s" , err )
278+ return
279+ }
300280
301- if err := ls .Clangd .conn .Initialized (& lsp.InitializedParams {}); err != nil {
302- logger .Logf ("error sending initialized notification to clangd: %v" , err )
303- return err
304- }
281+ // Start clangd
282+ ls .Clangd = NewClangdLSPClient (logger , ls .buildPath , ls .buildSketchCpp , dataFolder , ls )
283+ go func () {
284+ defer streams .CatchAndLogPanic ()
285+ ls .Clangd .Run ()
286+ logger .Logf ("Lost connection with clangd!" )
287+ ls .Close ()
288+ }()
289+
290+ // Send initialization command to clangd (1 sec. timeout)
291+ ctx , cancel := context .WithTimeout (context .Background (), time .Second )
292+ defer cancel ()
293+ cppInitializeParams := * inoParams
294+ cppInitializeParams .RootPath = ls .buildSketchRoot .String ()
295+ cppInitializeParams .RootURI = lsp .NewDocumentURIFromPath (ls .buildSketchRoot )
296+ if initRes , clangErr , err := ls .Clangd .conn .Initialize (ctx , & cppInitializeParams ); err != nil {
297+ logger .Logf ("error initilizing clangd: %v" , err )
298+ return
299+ } else if clangErr != nil {
300+ logger .Logf ("error initilizing clangd: %v" , clangErr .AsError ())
301+ return
302+ } else {
303+ logger .Logf ("clangd successfully started: %s" , string (lsp .EncodeMessage (initRes )))
304+ }
305305
306- // signal that clangd is running now...
307- ls .clangdStarted .Broadcast ()
306+ if err := ls .Clangd .conn .Initialized (& lsp.InitializedParams {}); err != nil {
307+ logger .Logf ("error sending initialized notification to clangd: %v" , err )
308+ return
309+ }
308310
309- logger .Logf ("Done initializing workbench" )
310- return nil
311- }
311+ // signal that clangd is running now...
312+ ls .clangdStarted .Broadcast ()
312313
313- func (handler * INOLanguageServer ) InitializeReqFromIDE (ctx context.Context , logger jsonrpc.FunctionLogger , inoParams * lsp.InitializeParams ) (* lsp.InitializeResult , * jsonrpc.ResponseError ) {
314- go func () {
315- defer streams .CatchAndLogPanic ()
316- handler .startClangd (inoParams )
314+ logger .Logf ("Done initializing workbench" )
317315 }()
318316
319317 resp := & lsp.InitializeResult {
0 commit comments