@@ -67,10 +67,14 @@ func NewInoHandler(stdio io.ReadWriteCloser, board lsp.Board) *InoHandler {
67
67
type InoHandler struct {
68
68
StdioConn * jsonrpc2.Conn
69
69
ClangdConn * jsonrpc2.Conn
70
+ lspInitializeParams * lsp.InitializeParams
70
71
buildPath * paths.Path
71
72
buildSketchRoot * paths.Path
72
73
buildSketchCpp * paths.Path
73
74
buildSketchCppVersion int
75
+ buildSketchSymbols []lsp.DocumentSymbol
76
+ buildSketchSymbolsLoad bool
77
+ buildSketchSymbolsCheck bool
74
78
sketchRoot * paths.Path
75
79
sketchName string
76
80
sketchMapper * sourcemapper.InoMapper
@@ -125,7 +129,7 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
125
129
switch p := params .(type ) {
126
130
case * lsp.InitializeParams :
127
131
// method "initialize"
128
- err = handler .initializeWorkbench (ctx , p )
132
+ err = handler .initializeWorkbench (p )
129
133
130
134
case * lsp.InitializedParams :
131
135
// method "initialized"
@@ -290,6 +294,11 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
290
294
log .Println (" sent" , req .Method , "request id" , req .ID , " to clangd" )
291
295
}
292
296
}
297
+ if err == nil && handler .buildSketchSymbolsLoad {
298
+ handler .buildSketchSymbolsLoad = false
299
+ log .Println ("Resfreshing document symbols" )
300
+ err = handler .refreshCppDocumentSymbols ()
301
+ }
293
302
if err != nil {
294
303
// Exit the process and trigger a restart by the client in case of a severe error
295
304
if err .Error () == "context deadline exceeded" {
@@ -315,10 +324,11 @@ func (handler *InoHandler) exit() {
315
324
os .Exit (1 )
316
325
}
317
326
318
- func (handler * InoHandler ) initializeWorkbench (ctx context. Context , params * lsp.InitializeParams ) error {
327
+ func (handler * InoHandler ) initializeWorkbench (params * lsp.InitializeParams ) error {
319
328
rootURI := params .RootURI
320
329
log .Printf ("--> initializeWorkbench(%s)\n " , rootURI )
321
330
331
+ handler .lspInitializeParams = params
322
332
handler .sketchRoot = rootURI .AsPath ()
323
333
handler .sketchName = handler .sketchRoot .Base ()
324
334
if buildPath , err := generateBuildEnvironment (handler .sketchRoot , handler .config .SelectedBoard .Fqbn ); err == nil {
@@ -329,6 +339,8 @@ func (handler *InoHandler) initializeWorkbench(ctx context.Context, params *lsp.
329
339
}
330
340
handler .buildSketchCpp = handler .buildSketchRoot .Join (handler .sketchName + ".ino.cpp" )
331
341
handler .buildSketchCppVersion = 1
342
+ handler .lspInitializeParams .RootPath = handler .buildSketchRoot .String ()
343
+ handler .lspInitializeParams .RootURI = lsp .NewDocumenteURIFromPath (handler .buildSketchRoot )
332
344
333
345
if cppContent , err := handler .buildSketchCpp .ReadFile (); err == nil {
334
346
handler .sketchMapper = sourcemapper .CreateInoMapper (cppContent )
@@ -349,8 +361,26 @@ func (handler *InoHandler) initializeWorkbench(ctx context.Context, params *lsp.
349
361
clangdHandler := jsonrpc2 .AsyncHandler (jsonrpc2 .HandlerWithError (handler .FromClangd ))
350
362
handler .ClangdConn = jsonrpc2 .NewConn (context .Background (), clangdStream , clangdHandler )
351
363
352
- params .RootPath = handler .buildSketchRoot .String ()
353
- params .RootURI = lsp .NewDocumenteURIFromPath (handler .buildSketchRoot )
364
+ return nil
365
+ }
366
+
367
+ func (handler * InoHandler ) refreshCppDocumentSymbols () error {
368
+ // Query source code symbols
369
+ cppURI := lsp .NewDocumenteURIFromPath (handler .buildSketchCpp )
370
+ log .Printf (" --> documentSymbol(%s)" , cppURI )
371
+ result , err := lsp .SendRequest (context .Background (), handler .ClangdConn , "textDocument/documentSymbol" , & lsp.DocumentSymbolParams {
372
+ TextDocument : lsp.TextDocumentIdentifier {URI : cppURI },
373
+ })
374
+ if err != nil {
375
+ return errors .WithMessage (err , "quering source code symbols" )
376
+ }
377
+ result = handler .transformClangdResult ("textDocument/documentSymbol" , cppURI , result )
378
+ if symbols , ok := result .([]lsp.DocumentSymbol ); ! ok {
379
+ return errors .WithMessage (err , "quering source code symbols (2)" )
380
+ } else {
381
+ handler .buildSketchSymbols = symbols
382
+ log .Printf ("%+v\n " , symbols )
383
+ }
354
384
return nil
355
385
}
356
386
@@ -419,6 +449,9 @@ func (handler *InoHandler) didOpen(ctx context.Context, params *lsp.DidOpenTextD
419
449
Version : handler .buildSketchCppVersion ,
420
450
},
421
451
}
452
+
453
+ // Trigger a documentSymbol load
454
+ handler .buildSketchSymbolsLoad = true
422
455
return newParam , err
423
456
}
424
457
}
0 commit comments