Skip to content

Commit 67ed43e

Browse files
authored
Merge pull request isaacphi#13 from virtuald/hover-retry
Retry hover requests
2 parents c3aa9a3 + 11a7591 commit 67ed43e

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

integrationtests/snapshots/rust/hover/struct-type.snap

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,4 @@ pub struct TestStruct {
66
}
77

88

9-
size = 32 (0x20), align = 0x8
10-
11-
12-
contain types with destructors (drop glue); doesn't have a destructor
9+
size = 32 (0x20), align = 0x8, needs Drop

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)