@@ -16,6 +16,7 @@ package utils
1616
1717import (
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
5573func 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
92123finally:
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