diff --git a/ls/ls.go b/ls/ls.go index 1bd273f..2dfd630 100644 --- a/ls/ls.go +++ b/ls/ls.go @@ -363,7 +363,13 @@ func (ls *INOLanguageServer) InitializeReqFromIDE(ctx context.Context, logger js } func (ls *INOLanguageServer) ShutdownReqFromIDE(ctx context.Context, logger jsonrpc.FunctionLogger) *jsonrpc.ResponseError { + done := make(chan bool) + go func() { + ls.progressHandler.Shutdown() + close(done) + }() _, _ = ls.Clangd.conn.Shutdown(context.Background()) + <-done return nil } diff --git a/ls/progress.go b/ls/progress.go index 8df523c..8f00f0d 100644 --- a/ls/progress.go +++ b/ls/progress.go @@ -109,7 +109,7 @@ func (p *ProgressProxyHandler) handleProxy(id string, proxy *progressProxy) { proxy.reportReq = nil if err != nil { - log.Printf("ProgressHandler: error sending begin req token %s: %v", id, err) + log.Printf("ProgressHandler: error sending report req token %s: %v", id, err) } else { proxy.requiredStatus = progressProxyBegin } @@ -122,7 +122,7 @@ func (p *ProgressProxyHandler) handleProxy(id string, proxy *progressProxy) { proxy.endReq = nil if err != nil { - log.Printf("ProgressHandler: error sending begin req token %s: %v", id, err) + log.Printf("ProgressHandler: error sending end req token %s: %v", id, err) } else { proxy.currentStatus = progressProxyEnd } @@ -196,3 +196,27 @@ func (p *ProgressProxyHandler) End(id string, req *lsp.WorkDoneProgressEnd) { proxy.requiredStatus = progressProxyEnd p.actionRequiredCond.Broadcast() } + +func (p *ProgressProxyHandler) Shutdown() { + p.mux.Lock() + defer p.mux.Unlock() + + for id, proxy := range p.proxies { + err := p.conn.Progress(&lsp.ProgressParams{ + Token: lsp.EncodeMessage(id), + Value: lsp.EncodeMessage(&lsp.WorkDoneProgressEnd{ + Message: "Shutdown", + }), + }) + + proxy.endReq = nil + if err != nil { + log.Printf("ProgressHandler: error sending end req token %s: %v", id, err) + } else { + proxy.currentStatus = progressProxyEnd + proxy.requiredStatus = progressProxyEnd + } + } + + p.actionRequiredCond.Broadcast() +}