Skip to content

Commit 162db7f

Browse files
committed
Factored out clang starter
1 parent b30c074 commit 162db7f

File tree

1 file changed

+59
-61
lines changed

1 file changed

+59
-61
lines changed

Diff for: ls/ls.go

+59-61
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)