summaryrefslogtreecommitdiffhomepage
path: root/internal/lsp
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lsp')
-rw-r--r--internal/lsp/client.go13
-rw-r--r--internal/lsp/handlers.go2
-rw-r--r--internal/lsp/transport.go28
-rw-r--r--internal/lsp/watcher/watcher.go18
4 files changed, 33 insertions, 28 deletions
diff --git a/internal/lsp/client.go b/internal/lsp/client.go
index e2eedc4fc..0f03e7fcb 100644
--- a/internal/lsp/client.go
+++ b/internal/lsp/client.go
@@ -97,7 +97,12 @@ func NewClient(ctx context.Context, command string, args ...string) (*Client, er
}()
// Start message handling loop
- go client.handleMessages()
+ go func() {
+ defer logging.RecoverPanic("LSP-message-handler", func() {
+ logging.ErrorPersist("LSP message handler crashed, LSP functionality may be impaired")
+ })
+ client.handleMessages()
+ }()
return client, nil
}
@@ -374,7 +379,7 @@ func (c *Client) CloseFile(ctx context.Context, filepath string) error {
},
}
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Closing file", "file", filepath)
}
if err := c.Notify(ctx, "textDocument/didClose", params); err != nil {
@@ -413,12 +418,12 @@ func (c *Client) CloseAllFiles(ctx context.Context) {
// Then close them all
for _, filePath := range filesToClose {
err := c.CloseFile(ctx, filePath)
- if err != nil && cnf.Debug {
+ if err != nil && cnf.DebugLSP {
logging.Warn("Error closing file", "file", filePath, "error", err)
}
}
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Closed all files", "files", filesToClose)
}
}
diff --git a/internal/lsp/handlers.go b/internal/lsp/handlers.go
index 4913c743d..c3088d685 100644
--- a/internal/lsp/handlers.go
+++ b/internal/lsp/handlers.go
@@ -88,7 +88,7 @@ func HandleServerMessage(params json.RawMessage) {
Message string `json:"message"`
}
if err := json.Unmarshal(params, &msg); err == nil {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Server message", "type", msg.Type, "message", msg.Message)
}
}
diff --git a/internal/lsp/transport.go b/internal/lsp/transport.go
index 4185966f3..89255fd78 100644
--- a/internal/lsp/transport.go
+++ b/internal/lsp/transport.go
@@ -20,7 +20,7 @@ func WriteMessage(w io.Writer, msg *Message) error {
}
cnf := config.Get()
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Sending message to server", "method", msg.Method, "id", msg.ID)
}
@@ -49,7 +49,7 @@ func ReadMessage(r *bufio.Reader) (*Message, error) {
}
line = strings.TrimSpace(line)
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Received header", "line", line)
}
@@ -65,7 +65,7 @@ func ReadMessage(r *bufio.Reader) (*Message, error) {
}
}
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Content-Length", "length", contentLength)
}
@@ -76,7 +76,7 @@ func ReadMessage(r *bufio.Reader) (*Message, error) {
return nil, fmt.Errorf("failed to read content: %w", err)
}
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Received content", "content", string(content))
}
@@ -95,7 +95,7 @@ func (c *Client) handleMessages() {
for {
msg, err := ReadMessage(c.stdout)
if err != nil {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Error("Error reading message", "error", err)
}
return
@@ -103,7 +103,7 @@ func (c *Client) handleMessages() {
// Handle server->client request (has both Method and ID)
if msg.Method != "" && msg.ID != 0 {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Received request from server", "method", msg.Method, "id", msg.ID)
}
@@ -157,11 +157,11 @@ func (c *Client) handleMessages() {
c.notificationMu.RUnlock()
if ok {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Handling notification", "method", msg.Method)
}
go handler(msg.Params)
- } else if cnf.Debug {
+ } else if cnf.DebugLSP {
logging.Debug("No handler for notification", "method", msg.Method)
}
continue
@@ -174,12 +174,12 @@ func (c *Client) handleMessages() {
c.handlersMu.RUnlock()
if ok {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Received response for request", "id", msg.ID)
}
ch <- msg
close(ch)
- } else if cnf.Debug {
+ } else if cnf.DebugLSP {
logging.Debug("No handler for response", "id", msg.ID)
}
}
@@ -191,7 +191,7 @@ func (c *Client) Call(ctx context.Context, method string, params any, result any
cnf := config.Get()
id := c.nextID.Add(1)
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Making call", "method", method, "id", id)
}
@@ -217,14 +217,14 @@ func (c *Client) Call(ctx context.Context, method string, params any, result any
return fmt.Errorf("failed to send request: %w", err)
}
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Request sent", "method", method, "id", id)
}
// Wait for response
resp := <-ch
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Received response", "id", id)
}
@@ -250,7 +250,7 @@ func (c *Client) Call(ctx context.Context, method string, params any, result any
// Notify sends a notification (a request without an ID that doesn't expect a response)
func (c *Client) Notify(ctx context.Context, method string, params any) error {
cnf := config.Get()
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Sending notification", "method", method)
}
diff --git a/internal/lsp/watcher/watcher.go b/internal/lsp/watcher/watcher.go
index b5ef15710..156f38e1a 100644
--- a/internal/lsp/watcher/watcher.go
+++ b/internal/lsp/watcher/watcher.go
@@ -50,7 +50,7 @@ func (w *WorkspaceWatcher) AddRegistrations(ctx context.Context, id string, watc
w.registrations = append(w.registrations, watchers...)
// Print detailed registration information for debugging
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Adding file watcher registrations",
"id", id,
"watchers", len(watchers),
@@ -116,7 +116,7 @@ func (w *WorkspaceWatcher) AddRegistrations(ctx context.Context, id string, watc
// Skip directories that should be excluded
if d.IsDir() {
if path != w.workspacePath && shouldExcludeDir(path) {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Skipping excluded directory", "path", path)
}
return filepath.SkipDir
@@ -136,7 +136,7 @@ func (w *WorkspaceWatcher) AddRegistrations(ctx context.Context, id string, watc
})
elapsedTime := time.Since(startTime)
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Workspace scan complete",
"filesOpened", filesOpened,
"elapsedTime", elapsedTime.Seconds(),
@@ -144,7 +144,7 @@ func (w *WorkspaceWatcher) AddRegistrations(ctx context.Context, id string, watc
)
}
- if err != nil && cnf.Debug {
+ if err != nil && cnf.DebugLSP {
logging.Debug("Error scanning workspace for files to open", "error", err)
}
}()
@@ -175,7 +175,7 @@ func (w *WorkspaceWatcher) WatchWorkspace(ctx context.Context, workspacePath str
// Skip excluded directories (except workspace root)
if d.IsDir() && path != workspacePath {
if shouldExcludeDir(path) {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Skipping excluded directory", "path", path)
}
return filepath.SkipDir
@@ -228,7 +228,7 @@ func (w *WorkspaceWatcher) WatchWorkspace(ctx context.Context, workspacePath str
}
// Debug logging
- if cnf.Debug {
+ if cnf.DebugLSP {
matched, kind := w.isPathWatched(event.Name)
logging.Debug("File event",
"path", event.Name,
@@ -491,7 +491,7 @@ func (w *WorkspaceWatcher) handleFileEvent(ctx context.Context, uri string, chan
// notifyFileEvent sends a didChangeWatchedFiles notification for a file event
func (w *WorkspaceWatcher) notifyFileEvent(ctx context.Context, uri string, changeType protocol.FileChangeType) error {
cnf := config.Get()
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Notifying file event",
"uri", uri,
"changeType", changeType,
@@ -615,7 +615,7 @@ func shouldExcludeFile(filePath string) bool {
// Skip large files
if info.Size() > maxFileSize {
- if cnf.Debug {
+ if cnf.DebugLSP {
logging.Debug("Skipping large file",
"path", filePath,
"size", info.Size(),
@@ -648,7 +648,7 @@ func (w *WorkspaceWatcher) openMatchingFile(ctx context.Context, path string) {
// Check if this path should be watched according to server registrations
if watched, _ := w.isPathWatched(path); watched {
// Don't need to check if it's already open - the client.OpenFile handles that
- if err := w.client.OpenFile(ctx, path); err != nil && cnf.Debug {
+ if err := w.client.OpenFile(ctx, path); err != nil && cnf.DebugLSP {
logging.Error("Error opening file", "path", path, "error", err)
}
}