@@ -9,13 +9,16 @@ import (
9
9
"fmt"
10
10
"go/types"
11
11
"log"
12
+ "strings"
12
13
13
14
"github.com/goplus/gop/ast"
14
15
"github.com/goplus/gop/token"
15
16
"golang.org/x/tools/gopls/internal/bug"
16
17
"golang.org/x/tools/gopls/internal/goxls"
17
18
"golang.org/x/tools/gopls/internal/goxls/parserutil"
18
19
"golang.org/x/tools/gopls/internal/lsp/protocol"
20
+ "golang.org/x/tools/gopls/internal/lsp/safetoken"
21
+ "golang.org/x/tools/gopls/internal/span"
19
22
"golang.org/x/tools/internal/event"
20
23
)
21
24
@@ -84,16 +87,11 @@ func GopDefinition(ctx context.Context, snapshot Snapshot, fh FileHandle, positi
84
87
return nil , nil
85
88
}
86
89
87
- var anonyOvFunc * ast.FuncLit
88
- if fun , ok := obj .(* types.Func ); ok {
89
- for ov := range pkg .GopTypesInfo ().Implicits {
90
- if v , ok := ov .(* ast.FuncLit ); ok {
91
- if v .Pos () == fun .Pos () {
92
- anonyOvFunc = v
93
- break
94
- }
95
- }
96
- }
90
+ var anonyOvFunc * ast.FuncLit //goxls:overload anonymous member
91
+ if ovPkg , ovFuncLit , ovObj , ok := IsOverloadAnonymousMember (ctx , snapshot , pkg , obj ); ok {
92
+ pkg = ovPkg
93
+ obj = ovObj
94
+ anonyOvFunc = ovFuncLit
97
95
}
98
96
99
97
if goxls .DbgDefinition {
@@ -299,3 +297,50 @@ func gopImportDefinition(ctx context.Context, s Snapshot, pkg Package, pgf *Pars
299
297
300
298
return locs , nil
301
299
}
300
+
301
+ // goxls:match in current package & variants
302
+ func IsOverloadAnonymousMember (ctx context.Context , snapshot Snapshot , pkg Package , obj types.Object ) (Package , * ast.FuncLit , types.Object , bool ) {
303
+ if _ , ok := obj .(* types.Func ); ! ok {
304
+ return nil , nil , nil , false
305
+ }
306
+ declPosn := safetoken .StartPosition (pkg .FileSet (), obj .Pos ())
307
+ declURI := span .URIFromPath (declPosn .Filename )
308
+
309
+ // goxls:match in current package
310
+ if funcLit , ovObj , ok := isOverloadAnonyMemberInPkg (pkg , declPosn ); ok {
311
+ return pkg , funcLit , ovObj , true
312
+ }
313
+
314
+ // goxls:match in variants package
315
+ if strings .HasSuffix (string (declURI ), ".gop" ) {
316
+ variants , err := snapshot .MetadataForFile (ctx , declURI )
317
+ if err != nil {
318
+ return nil , nil , nil , false
319
+ }
320
+ for _ , m := range variants {
321
+ varPkgs , err := snapshot .TypeCheck (ctx , m .ID )
322
+ if err != nil {
323
+ return nil , nil , nil , false
324
+ }
325
+ varPkg := varPkgs [0 ]
326
+ if funcLit , ovObj , ok := isOverloadAnonyMemberInPkg (varPkg , declPosn ); ok {
327
+ return varPkg , funcLit , ovObj , true
328
+ }
329
+ }
330
+ }
331
+ return nil , nil , nil , false
332
+ }
333
+
334
+ // returns the overload anonymous member function
335
+ func isOverloadAnonyMemberInPkg (pkg Package , matchFuncPos token.Position ) (* ast.FuncLit , types.Object , bool ) {
336
+ fset := pkg .FileSet ()
337
+ for ov , om := range pkg .GopTypesInfo ().Implicits {
338
+ if anonyOvFunc , ok := ov .(* ast.FuncLit ); ok {
339
+ funPos := safetoken .StartPosition (fset , anonyOvFunc .Pos ())
340
+ if matchFuncPos .Offset == funPos .Offset {
341
+ return anonyOvFunc , om , true
342
+ }
343
+ }
344
+ }
345
+ return nil , nil , false
346
+ }
0 commit comments