summaryrefslogtreecommitdiff
path: root/internal/lsp/handlers_completion.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-23 09:04:17 +0200
committerPaul Buetow <paul@buetow.org>2026-03-23 09:04:17 +0200
commit462184dff3eef32f01f06634305da1355ac1bec2 (patch)
tree026ffaaeacfe152957298c985e1df77ff661b723 /internal/lsp/handlers_completion.go
parent667f2d3384643aa877de2eefcbad3923965bad09 (diff)
chore: bump version to v0.25.9v0.25.9
Code quality fixes from audit: - Log silently discarded errors in status sinks and stats.Update call sites - Fix json.Marshal errors silently ignored in LSP handlers - Replace time.Sleep in tests with channel signaling (mcp) and fake clock (stats) - Make context cancellation work in production time.Sleep sites (handlers_document, cmdentry) - Remove init()-based provider registration from llm package; use explicit RegisterAllProviders() - Add WaitGroup goroutine tracking to MCP server Run() Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/lsp/handlers_completion.go')
-rw-r--r--internal/lsp/handlers_completion.go22
1 files changed, 16 insertions, 6 deletions
diff --git a/internal/lsp/handlers_completion.go b/internal/lsp/handlers_completion.go
index d6529de..e6d8951 100644
--- a/internal/lsp/handlers_completion.go
+++ b/internal/lsp/handlers_completion.go
@@ -93,8 +93,10 @@ func extractTriggerInfo(p CompletionParams) (kind int, ch string) {
logging.Logf("lsp ", "extractTriggerInfo: unmarshal raw context: %v", err)
}
} else {
- b, _ := json.Marshal(p.Context)
- if err := json.Unmarshal(b, &ctx); err != nil {
+ b, err := json.Marshal(p.Context)
+ if err != nil {
+ logging.Logf("lsp ", "extractTriggerInfo: marshal context: %v", err)
+ } else if err := json.Unmarshal(b, &ctx); err != nil {
logging.Logf("lsp ", "extractTriggerInfo: unmarshal context: %v", err)
}
}
@@ -325,7 +327,10 @@ func (s *Server) executeChatCompletion(ctx context.Context, plan completionPlan,
}
s.incRecvCounters(len(text))
modelUsed := spec.effectiveModel(client.DefaultModel())
- _ = stats.Update(ctx, client.Name(), modelUsed, sentSize, len(text))
+ // Update global stats cache; log but don't fail on stats errors
+ if err := stats.Update(ctx, client.Name(), modelUsed, sentSize, len(text)); err != nil {
+ logging.Logf("lsp ", "stats update error: %v", err)
+ }
s.logLLMStats(modelUsed)
trimmed := strings.TrimSpace(text)
cursorByte := utf16OffsetToByteOffset(plan.current, plan.params.Position.Character)
@@ -357,8 +362,10 @@ func parseManualInvoke(ctx any) bool {
logging.Logf("lsp ", "parseManualInvoke: unmarshal raw context: %v", err)
}
} else {
- b, _ := json.Marshal(ctx)
- if err := json.Unmarshal(b, &c); err != nil {
+ b, err := json.Marshal(ctx)
+ if err != nil {
+ logging.Logf("lsp ", "parseManualInvoke: marshal context: %v", err)
+ } else if err := json.Unmarshal(b, &c); err != nil {
logging.Logf("lsp ", "parseManualInvoke: unmarshal context: %v", err)
}
}
@@ -501,7 +508,10 @@ func (s *Server) tryProviderNativeCompletion(ctx context.Context, plan completio
}
s.incSentCounters(sentBytes)
s.incRecvCounters(len(suggestions[0]))
- _ = stats.Update(ctx2, client.Name(), modelUsed, sentBytes, len(suggestions[0]))
+ // Update global stats cache; log but don't fail on stats errors
+ if err := stats.Update(ctx2, client.Name(), modelUsed, sentBytes, len(suggestions[0])); err != nil {
+ logging.Logf("lsp ", "stats update error: %v", err)
+ }
s.logLLMStats(modelUsed)
cleaned := s.postProcessNativeCompletion(suggestions[0], current, p.Position.Character)
if cleaned == "" {