@@ -51,6 +51,7 @@ type InoHandler struct {
51
51
clangdNotificationCount int64
52
52
progressHandler * ProgressProxyHandler
53
53
54
+ closing chan bool
54
55
clangdStarted * sync.Cond
55
56
dataMux sync.RWMutex
56
57
lspInitializeParams * lsp.InitializeParams
@@ -119,6 +120,7 @@ func NewInoHandler(stdio io.ReadWriteCloser, board lsp.Board) *InoHandler {
119
120
handler := & InoHandler {
120
121
docs : map [string ]* lsp.TextDocumentItem {},
121
122
inoDocsWithDiagnostics : map [lsp.DocumentURI ]bool {},
123
+ closing : make (chan bool ),
122
124
config : lsp.BoardConfig {
123
125
SelectedBoard : board ,
124
126
},
@@ -158,15 +160,27 @@ type FileData struct {
158
160
version int
159
161
}
160
162
161
- // StopClangd closes the connection to the clangd process.
162
- func (handler * InoHandler ) StopClangd () {
163
- handler .ClangdConn .Close ()
164
- handler .ClangdConn = nil
163
+ // Close closes all the json-rpc connections.
164
+ func (handler * InoHandler ) Close () {
165
+ if handler .ClangdConn != nil {
166
+ handler .ClangdConn .Close ()
167
+ handler .ClangdConn = nil
168
+ }
169
+ if handler .closing != nil {
170
+ close (handler .closing )
171
+ handler .closing = nil
172
+ }
173
+ }
174
+
175
+ // CloseNotify returns a channel that is closed when the InoHandler is closed
176
+ func (handler * InoHandler ) CloseNotify () <- chan bool {
177
+ return handler .closing
165
178
}
166
179
167
180
// CleanUp performs cleanup of the workspace and temp files create by the language server
168
181
func (handler * InoHandler ) CleanUp () {
169
182
if handler .buildPath != nil {
183
+ log .Printf ("removing buildpath" )
170
184
handler .buildPath .RemoveAll ()
171
185
handler .buildPath = nil
172
186
}
@@ -489,12 +503,14 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
489
503
// Exit the process and trigger a restart by the client in case of a severe error
490
504
if err .Error () == "context deadline exceeded" {
491
505
log .Println (prefix + "Timeout exceeded while waiting for a reply from clangd." )
492
- handler .exit ()
506
+ log .Println (prefix + "Please restart the language server." )
507
+ handler .Close ()
493
508
}
494
509
if strings .Contains (err .Error (), "non-added document" ) || strings .Contains (err .Error (), "non-added file" ) {
495
510
log .Printf (prefix + "The clangd process has lost track of the open document." )
496
511
log .Printf (prefix + " %s" , err )
497
- handler .exit ()
512
+ log .Println (prefix + "Please restart the language server." )
513
+ handler .Close ()
498
514
}
499
515
}
500
516
@@ -505,12 +521,6 @@ func (handler *InoHandler) HandleMessageFromIDE(ctx context.Context, conn *jsonr
505
521
return result , err
506
522
}
507
523
508
- func (handler * InoHandler ) exit () {
509
- log .Println ("Please restart the language server." )
510
- handler .StopClangd ()
511
- os .Exit (1 )
512
- }
513
-
514
524
func (handler * InoHandler ) initializeWorkbench (ctx context.Context , params * lsp.InitializeParams ) error {
515
525
currCppTextVersion := 0
516
526
if params != nil {
@@ -579,6 +589,11 @@ func (handler *InoHandler) initializeWorkbench(ctx context.Context, params *lsp.
579
589
handler .ClangdConn = jsonrpc2 .NewConn (context .Background (), clangdStream , clangdHandler ,
580
590
jsonrpc2 .OnRecv (streams .JSONRPCConnLogOnRecv ("IDE LS <-- CL:" )),
581
591
jsonrpc2 .OnSend (streams .JSONRPCConnLogOnSend ("IDE LS --> CL:" )))
592
+ go func () {
593
+ <- handler .ClangdConn .DisconnectNotify ()
594
+ log .Printf ("Lost connection with clangd!" )
595
+ handler .Close ()
596
+ }()
582
597
583
598
// Send initialization command to clangd
584
599
ctx , cancel := context .WithTimeout (context .Background (), time .Second )
0 commit comments