@@ -244,76 +244,74 @@ func (handler *INOLanguageServer) CheckCppDocumentSymbols() error {
244
244
return nil
245
245
}
246
246
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 )
254
253
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 )
258
256
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" )
269
260
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
+ }
275
265
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
+ }
284
273
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
+ }
300
280
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
+ }
305
305
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
+ }
308
310
309
- logger .Logf ("Done initializing workbench" )
310
- return nil
311
- }
311
+ // signal that clangd is running now...
312
+ ls .clangdStarted .Broadcast ()
312
313
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" )
317
315
}()
318
316
319
317
resp := & lsp.InitializeResult {
0 commit comments