summaryrefslogtreecommitdiffhomepage
path: root/internal/llm/tools/diagnostics.go
diff options
context:
space:
mode:
authorKujtim Hoxha <[email protected]>2025-04-04 15:03:50 +0200
committerKujtim Hoxha <[email protected]>2025-04-04 15:03:50 +0200
commit3aef4dedcfd1ad408c6cb6c06e5e731feb528a1e (patch)
tree20e018a73754880e78c0e7f569828b415c66b6a2 /internal/llm/tools/diagnostics.go
parenta1f6147506af1f98e5dfa670fc83fa45c2249842 (diff)
downloadopencode-3aef4dedcfd1ad408c6cb6c06e5e731feb528a1e.tar.gz
opencode-3aef4dedcfd1ad408c6cb6c06e5e731feb528a1e.zip
Improve LSP diagnostics handling for file operations
- Split LSP file notification into separate functions - Add waitForLspDiagnostics function to wait for diagnostics after file changes - Move LSP diagnostics to after file operations in edit and write tools - Fix string splitting in diff generation - Reduce diagnostics timeout from 10 to 5 seconds 🤖 Generated with termai Co-Authored-By: termai <[email protected]>
Diffstat (limited to 'internal/llm/tools/diagnostics.go')
-rw-r--r--internal/llm/tools/diagnostics.go36
1 files changed, 30 insertions, 6 deletions
diff --git a/internal/llm/tools/diagnostics.go b/internal/llm/tools/diagnostics.go
index 3eb72eafc..ce76ae12f 100644
--- a/internal/llm/tools/diagnostics.go
+++ b/internal/llm/tools/diagnostics.go
@@ -53,6 +53,7 @@ func (b *diagnosticsTool) Run(ctx context.Context, call ToolCall) (ToolResponse,
if params.FilePath != "" {
notifyLspOpenFile(ctx, params.FilePath, lsps)
+ waitForLspDiagnostics(ctx, params.FilePath, lsps)
}
output := appendDiagnostics(params.FilePath, lsps)
@@ -61,6 +62,22 @@ func (b *diagnosticsTool) Run(ctx context.Context, call ToolCall) (ToolResponse,
}
func notifyLspOpenFile(ctx context.Context, filePath string, lsps map[string]*lsp.Client) {
+ for _, client := range lsps {
+ // Open the file
+ err := client.OpenFile(ctx, filePath)
+ if err != nil {
+ // If there's an error opening the file, continue to the next client
+ continue
+ }
+ }
+}
+
+// waitForLspDiagnostics opens a file in LSP clients and waits for diagnostics to be published
+func waitForLspDiagnostics(ctx context.Context, filePath string, lsps map[string]*lsp.Client) {
+ if len(lsps) == 0 {
+ return
+ }
+
// Create a channel to receive diagnostic notifications
diagChan := make(chan struct{}, 1)
@@ -92,11 +109,18 @@ func notifyLspOpenFile(ctx context.Context, filePath string, lsps map[string]*ls
// Register our temporary handler
client.RegisterNotificationHandler("textDocument/publishDiagnostics", handler)
- // Open the file
- err := client.OpenFile(ctx, filePath)
- if err != nil {
- // If there's an error opening the file, continue to the next client
- continue
+ // Notify change if the file is already open
+ if client.IsFileOpen(filePath) {
+ err := client.NotifyChange(ctx, filePath)
+ if err != nil {
+ continue
+ }
+ } else {
+ // Open the file if it's not already open
+ err := client.OpenFile(ctx, filePath)
+ if err != nil {
+ continue
+ }
}
}
@@ -104,7 +128,7 @@ func notifyLspOpenFile(ctx context.Context, filePath string, lsps map[string]*ls
select {
case <-diagChan:
// Diagnostics received
- case <-time.After(10 * time.Second):
+ case <-time.After(5 * time.Second):
// Timeout after 5 seconds - this is a fallback in case no diagnostics are published
case <-ctx.Done():
// Context cancelled