Skip to content

Commit ab6d6b7

Browse files
authored
feat: add more symbol get method (#116)
1 parent 366b20a commit ab6d6b7

File tree

1 file changed

+54
-3
lines changed

1 file changed

+54
-3
lines changed

lang/rust/utils/lsp.go

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package utils
1616

1717
import (
1818
"context"
19+
"fmt"
1920
"path/filepath"
2021
"regexp"
2122
"strings"
@@ -46,6 +47,23 @@ func GetLSPClient(root string) *lsp.LSPClient {
4647
return cli
4748
}
4849

50+
// 查找符号对应的代码
51+
// root: 项目根目录
52+
// file: 文件路径
53+
// mod: 命名空间,空表示本文件根
54+
// name: 符号名
55+
// receiver: method接收者,为空表示不是method
56+
func GetRawSymbol(root, file, mod, name string, receiver string, caseInsensitive bool) *lsp.DocumentSymbol {
57+
cli := GetLSPClient(root)
58+
sym, err := getSymbol(cli, root, file, mod, name, receiver, caseInsensitive)
59+
if err != nil {
60+
log.Error("get symbol for %s failed, err: %v", name, err)
61+
return nil
62+
}
63+
64+
return sym
65+
}
66+
4967
// 查找符号对应的代码
5068
// root: 项目根目录
5169
// file: 文件路径
@@ -54,10 +72,23 @@ func GetLSPClient(root string) *lsp.LSPClient {
5472
// receiver: method接收者,为空表示不是method
5573
func GetSymbol(root, file, mod, name string, receiver string, caseInsensitive bool) string {
5674
cli := GetLSPClient(root)
57-
syms, err := cli.FileStructure(context.Background(), lsp.NewURI(file))
75+
sym, err := getSymbol(cli, root, file, mod, name, receiver, caseInsensitive)
5876
if err != nil {
77+
log.Error("get symbol for %s failed, err: %v", name, err)
5978
return ""
6079
}
80+
if sym == nil {
81+
return ""
82+
}
83+
text, _ := cli.Locate(sym.Location)
84+
return text
85+
}
86+
87+
func getSymbol(cli *lsp.LSPClient, root, file, mod, name string, receiver string, caseInsensitive bool) (*lsp.DocumentSymbol, error) {
88+
syms, err := cli.FileStructure(context.Background(), lsp.NewURI(file))
89+
if err != nil {
90+
return nil, err
91+
}
6192

6293
var sym *lsp.DocumentSymbol
6394
if mod != "" {
@@ -91,10 +122,30 @@ func GetSymbol(root, file, mod, name string, receiver string, caseInsensitive bo
91122

92123
finally:
93124
if sym == nil {
94-
return ""
125+
return nil, fmt.Errorf("can not find symbol for %s", name)
126+
}
127+
128+
return sym, nil
129+
}
130+
131+
// 查找符号对应的源码以及文件行号
132+
// root: 项目根目录
133+
// file: 文件路径
134+
// mod: 命名空间,空表示本文件根
135+
// name: 符号名
136+
// receiver: method接收者,为空表示不是method
137+
func GetSymbolContentAndLocation(root, file, mod, name string, receiver string, caseInsensitive bool) (string, [2]int) {
138+
cli := GetLSPClient(root)
139+
sym, err := getSymbol(cli, root, file, mod, name, receiver, caseInsensitive)
140+
if err != nil {
141+
log.Error("get symbol for %s failed, err: %v", name, err)
142+
return "", [2]int{}
143+
}
144+
if sym == nil {
145+
return "", [2]int{}
95146
}
96147
text, _ := cli.Locate(sym.Location)
97-
return text
148+
return text, [2]int{sym.Location.Range.Start.Line, sym.Location.Range.End.Line}
98149
}
99150

100151
// NOTICE: 为了提供容错率,这里只是简单查找是否包含token,不做严格的标识符检查

0 commit comments

Comments
 (0)