Skip to content

Commit fea5dce

Browse files
authored
Merge pull request isaacphi#6 from virtuald/clangd-struct
Add a hack to remove 'struct ' prefix from symbols
2 parents 62f7bb7 + ca1d5b9 commit fea5dce

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

internal/tools/definition.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,9 @@ import (
1010
)
1111

1212
func ReadDefinition(ctx context.Context, client *lsp.Client, symbolName string) (string, error) {
13-
symbolResult, err := client.Symbol(ctx, protocol.WorkspaceSymbolParams{
14-
Query: symbolName,
15-
})
13+
symbolName, results, err := QuerySymbol(ctx, client, symbolName)
1614
if err != nil {
17-
return "", fmt.Errorf("failed to fetch symbol: %v", err)
18-
}
19-
20-
results, err := symbolResult.Results()
21-
if err != nil {
22-
return "", fmt.Errorf("failed to parse results: %v", err)
15+
return "", err
2316
}
2417

2518
var definitions []string

internal/tools/references.go

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,9 @@ func FindReferences(ctx context.Context, client *lsp.Client, symbolName string)
2222
}
2323

2424
// First get the symbol location like ReadDefinition does
25-
symbolResult, err := client.Symbol(ctx, protocol.WorkspaceSymbolParams{
26-
Query: symbolName,
27-
})
25+
symbolName, results, err := QuerySymbol(ctx, client, symbolName)
2826
if err != nil {
29-
return "", fmt.Errorf("failed to fetch symbol: %v", err)
30-
}
31-
32-
results, err := symbolResult.Results()
33-
if err != nil {
34-
return "", fmt.Errorf("failed to parse results: %v", err)
27+
return "", err
3528
}
3629

3730
var allReferences []string

internal/tools/utilities.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package tools
22

33
import (
4+
"context"
45
"fmt"
56
"os"
67
"sort"
78
"strconv"
89
"strings"
910

11+
"github.com/isaacphi/mcp-language-server/internal/lsp"
1012
"github.com/isaacphi/mcp-language-server/internal/protocol"
1113
)
1214

@@ -167,3 +169,33 @@ func FormatLinesWithRanges(lines []string, ranges []LineRange) string {
167169

168170
return result.String()
169171
}
172+
173+
func doQuerySymbol(ctx context.Context, client *lsp.Client, symbolName string) ([]protocol.WorkspaceSymbolResult, error) {
174+
175+
symbolResult, err := client.Symbol(ctx, protocol.WorkspaceSymbolParams{
176+
Query: symbolName,
177+
})
178+
if err != nil {
179+
return nil, fmt.Errorf("failed to fetch symbol: %v", err)
180+
}
181+
182+
results, err := symbolResult.Results()
183+
if err != nil {
184+
return nil, fmt.Errorf("failed to parse results: %v", err)
185+
}
186+
return results, nil
187+
}
188+
189+
func QuerySymbol(ctx context.Context, client *lsp.Client, symbolName string) (string, []protocol.WorkspaceSymbolResult, error) {
190+
results, err := doQuerySymbol(ctx, client, symbolName)
191+
192+
// clangd doesn't resolve "struct foo", only "foo"
193+
if len(results) == 0 && strings.HasPrefix(symbolName, "struct ") {
194+
results, err = doQuerySymbol(ctx, client, symbolName[7:])
195+
if len(results) > 0 {
196+
symbolName = symbolName[7:]
197+
}
198+
}
199+
200+
return symbolName, results, err
201+
}

0 commit comments

Comments
 (0)