Skip to content

Commit f8b79ea

Browse files
committed
implemented documentSymbol caching
1 parent fdd4a7f commit f8b79ea

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

Diff for: handler/handler.go

+37-4
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@ func NewInoHandler(stdio io.ReadWriteCloser, board lsp.Board) *InoHandler {
6767
type 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

Comments
 (0)