@@ -67,10 +67,14 @@ func NewInoHandler(stdio io.ReadWriteCloser, board lsp.Board) *InoHandler {
6767type InoHandler struct {
6868 StdioConn * jsonrpc2.Conn
6969 ClangdConn * jsonrpc2.Conn
70+ lspInitializeParams * lsp.InitializeParams
7071 buildPath * paths.Path
7172 buildSketchRoot * paths.Path
7273 buildSketchCpp * paths.Path
7374 buildSketchCppVersion int
75+ buildSketchSymbols []lsp.DocumentSymbol
76+ buildSketchSymbolsLoad bool
77+ buildSketchSymbolsCheck bool
7478 sketchRoot * paths.Path
7579 sketchName string
7680 sketchMapper * sourcemapper.InoMapper
@@ -125,7 +129,7 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
125129 switch p := params .(type ) {
126130 case * lsp.InitializeParams :
127131 // method "initialize"
128- err = handler .initializeWorkbench (ctx , p )
132+ err = handler .initializeWorkbench (p )
129133
130134 case * lsp.InitializedParams :
131135 // method "initialized"
@@ -290,6 +294,11 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
290294 log .Println (" sent" , req .Method , "request id" , req .ID , " to clangd" )
291295 }
292296 }
297+ if err == nil && handler .buildSketchSymbolsLoad {
298+ handler .buildSketchSymbolsLoad = false
299+ log .Println ("Resfreshing document symbols" )
300+ err = handler .refreshCppDocumentSymbols ()
301+ }
293302 if err != nil {
294303 // Exit the process and trigger a restart by the client in case of a severe error
295304 if err .Error () == "context deadline exceeded" {
@@ -315,10 +324,11 @@ func (handler *InoHandler) exit() {
315324 os .Exit (1 )
316325}
317326
318- func (handler * InoHandler ) initializeWorkbench (ctx context. Context , params * lsp.InitializeParams ) error {
327+ func (handler * InoHandler ) initializeWorkbench (params * lsp.InitializeParams ) error {
319328 rootURI := params .RootURI
320329 log .Printf ("--> initializeWorkbench(%s)\n " , rootURI )
321330
331+ handler .lspInitializeParams = params
322332 handler .sketchRoot = rootURI .AsPath ()
323333 handler .sketchName = handler .sketchRoot .Base ()
324334 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.
329339 }
330340 handler .buildSketchCpp = handler .buildSketchRoot .Join (handler .sketchName + ".ino.cpp" )
331341 handler .buildSketchCppVersion = 1
342+ handler .lspInitializeParams .RootPath = handler .buildSketchRoot .String ()
343+ handler .lspInitializeParams .RootURI = lsp .NewDocumenteURIFromPath (handler .buildSketchRoot )
332344
333345 if cppContent , err := handler .buildSketchCpp .ReadFile (); err == nil {
334346 handler .sketchMapper = sourcemapper .CreateInoMapper (cppContent )
@@ -349,8 +361,26 @@ func (handler *InoHandler) initializeWorkbench(ctx context.Context, params *lsp.
349361 clangdHandler := jsonrpc2 .AsyncHandler (jsonrpc2 .HandlerWithError (handler .FromClangd ))
350362 handler .ClangdConn = jsonrpc2 .NewConn (context .Background (), clangdStream , clangdHandler )
351363
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+ }
354384 return nil
355385}
356386
@@ -419,6 +449,9 @@ func (handler *InoHandler) didOpen(ctx context.Context, params *lsp.DidOpenTextD
419449 Version : handler .buildSketchCppVersion ,
420450 },
421451 }
452+
453+ // Trigger a documentSymbol load
454+ handler .buildSketchSymbolsLoad = true
422455 return newParam , err
423456 }
424457 }
0 commit comments