Skip to content

Commit c93ed33

Browse files
committed
Retry hover requests
1 parent c3aa9a3 commit c93ed33

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

internal/lsp/transport.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,25 @@ import (
44
"bufio"
55
"context"
66
"encoding/json"
7+
"errors"
78
"fmt"
89
"io"
910
"strings"
1011

1112
"github.com/isaacphi/mcp-language-server/internal/logging"
13+
"github.com/isaacphi/mcp-language-server/internal/protocol"
1214
)
1315

1416
// Create component-specific loggers
1517
var lspLogger = logging.NewLogger(logging.LSP)
1618
var wireLogger = logging.NewLogger(logging.LSPWire)
1719
var processLogger = logging.NewLogger(logging.LSPProcess)
1820

21+
var (
22+
ErrContentModified = errors.New("content modified")
23+
ErrServerCancelled = errors.New("server cancelled")
24+
)
25+
1926
// WriteMessage writes an LSP message to the given writer
2027
func WriteMessage(w io.Writer, msg *Message) error {
2128
data, err := json.Marshal(msg)
@@ -230,7 +237,14 @@ func (c *Client) Call(ctx context.Context, method string, params any, result any
230237

231238
if resp.Error != nil {
232239
lspLogger.Error("Request failed: %s (code: %d)", resp.Error.Message, resp.Error.Code)
233-
return fmt.Errorf("request failed: %s (code: %d)", resp.Error.Message, resp.Error.Code)
240+
switch protocol.LSPErrorCodes(resp.Error.Code) {
241+
case protocol.ContentModified:
242+
return ErrContentModified
243+
case protocol.ServerCancelled:
244+
return ErrServerCancelled
245+
default:
246+
return fmt.Errorf("request failed: %s (code: %d)", resp.Error.Message, resp.Error.Code)
247+
}
234248
}
235249

236250
if result != nil {

internal/tools/hover.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package tools
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"strings"
78

@@ -31,9 +32,17 @@ func GetHoverInfo(ctx context.Context, client *lsp.Client, filePath string, line
3132
params.Position = position
3233

3334
// Execute the hover request
34-
hoverResult, err := client.Hover(ctx, params)
35-
if err != nil {
36-
return "", fmt.Errorf("failed to get hover information: %v", err)
35+
// - some LSP (rust) will return "content modified", so retry it
36+
var hoverResult protocol.Hover
37+
for i := range 3 {
38+
hoverResult, err = client.Hover(ctx, params)
39+
if err == nil {
40+
break
41+
} else if errors.Is(err, lsp.ErrContentModified) {
42+
continue
43+
} else if i == 2 {
44+
return "", fmt.Errorf("failed to get hover information: %v", err)
45+
}
3746
}
3847

3948
var result strings.Builder

0 commit comments

Comments
 (0)