@@ -301,9 +301,14 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
301
301
}
302
302
if err == nil && handler .buildSketchSymbolsLoad {
303
303
handler .buildSketchSymbolsLoad = false
304
- log .Println ("Resfreshing document symbols" )
304
+ log .Println ("--! Resfreshing document symbols" )
305
305
err = handler .refreshCppDocumentSymbols ()
306
306
}
307
+ if err == nil && handler .buildSketchSymbolsCheck {
308
+ handler .buildSketchSymbolsCheck = false
309
+ log .Println ("--! Resfreshing document symbols" )
310
+ err = handler .checkCppDocumentSymbols ()
311
+ }
307
312
if err != nil {
308
313
// Exit the process and trigger a restart by the client in case of a severe error
309
314
if err .Error () == "context deadline exceeded" {
@@ -414,8 +419,40 @@ func (handler *InoHandler) refreshCppDocumentSymbols() error {
414
419
if symbols , ok := result .([]lsp.DocumentSymbol ); ! ok {
415
420
return errors .WithMessage (err , "quering source code symbols (2)" )
416
421
} else {
422
+ // Filter non-functions symbols
423
+ i := 0
424
+ for _ , symbol := range symbols {
425
+ if symbol .Kind != lsp .SKFunction {
426
+ continue
427
+ }
428
+ symbols [i ] = symbol
429
+ i ++
430
+ }
431
+ symbols = symbols [:i ]
432
+ for _ , symbol := range symbols {
433
+ log .Printf (" symbol: %s %s" , symbol .Kind , symbol .Name )
434
+ }
417
435
handler .buildSketchSymbols = symbols
418
- log .Printf ("%+v\n " , symbols )
436
+ }
437
+ return nil
438
+ }
439
+
440
+ func (handler * InoHandler ) checkCppDocumentSymbols () error {
441
+ oldSymbols := handler .buildSketchSymbols
442
+ if err := handler .refreshCppDocumentSymbols (); err != nil {
443
+ return err
444
+ }
445
+ if len (oldSymbols ) != len (handler .buildSketchSymbols ) {
446
+ log .Println ("--! new symbols detected, triggering sketch rebuild!" )
447
+ handler .scheduleRebuildEnvironment ()
448
+ return nil
449
+ }
450
+ for i , old := range oldSymbols {
451
+ if newName := handler .buildSketchSymbols [i ].Name ; old .Name != newName {
452
+ log .Printf ("--! symbols changed, triggering sketch rebuild: '%s' -> '%s'" , old .Name , newName )
453
+ handler .scheduleRebuildEnvironment ()
454
+ return nil
455
+ }
419
456
}
420
457
return nil
421
458
}
@@ -519,7 +556,7 @@ func (handler *InoHandler) didChange(ctx context.Context, req *lsp.DidChangeText
519
556
// TODO: Detect changes in critical lines (for example function definitions)
520
557
// and trigger arduino-preprocessing + clangd restart.
521
558
522
- log .Println (" uh oh DIRTY CHANGE !" )
559
+ log .Println ("--! DIRTY CHANGE, force sketch rebuild !" )
523
560
handler .scheduleRebuildEnvironment ()
524
561
}
525
562
@@ -1044,6 +1081,17 @@ func (handler *InoHandler) FromClangd(ctx context.Context, connection *jsonrpc2.
1044
1081
log .Printf (" > %d:%d - %v: %s" , diag .Range .Start .Line , diag .Range .Start .Character , diag .Severity , diag .Code )
1045
1082
}
1046
1083
}
1084
+
1085
+ // If we have an "undefined reference" in the .ino code trigger a
1086
+ // check for newly created symbols (that in turn may trigger a
1087
+ // new arduino-preprocessing of the sketch).
1088
+ if msg .URI .AsPath ().Ext () == ".ino" {
1089
+ for _ , diag := range msg .Diagnostics {
1090
+ if diag .Code == "undeclared_var_use_suggest" {
1091
+ handler .buildSketchSymbolsCheck = true
1092
+ }
1093
+ }
1094
+ }
1047
1095
if err := handler .StdioConn .Notify (ctx , "textDocument/publishDiagnostics" , msg ); err != nil {
1048
1096
return nil , err
1049
1097
}
0 commit comments