@@ -9,13 +9,16 @@ import (
99 "fmt"
1010 "go/types"
1111 "log"
12+ "strings"
1213
1314 "github.com/goplus/gop/ast"
1415 "github.com/goplus/gop/token"
1516 "golang.org/x/tools/gopls/internal/bug"
1617 "golang.org/x/tools/gopls/internal/goxls"
1718 "golang.org/x/tools/gopls/internal/goxls/parserutil"
1819 "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"
1922 "golang.org/x/tools/internal/event"
2023)
2124
@@ -84,16 +87,11 @@ func GopDefinition(ctx context.Context, snapshot Snapshot, fh FileHandle, positi
8487 return nil , nil
8588 }
8689
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
9795 }
9896
9997 if goxls .DbgDefinition {
@@ -299,3 +297,50 @@ func gopImportDefinition(ctx context.Context, s Snapshot, pkg Package, pgf *Pars
299297
300298 return locs , nil
301299}
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+
307+ declPosn := safetoken .StartPosition (pkg .FileSet (), obj .Pos ())
308+ declURI := span .URIFromPath (declPosn .Filename )
309+
310+ inPkg := func (searchPkg Package ) (* ast.FuncLit , types.Object , bool ) {
311+ fset := searchPkg .FileSet ()
312+ for ov , om := range searchPkg .GopTypesInfo ().Implicits {
313+ if anonyOvFunc , ok := ov .(* ast.FuncLit ); ok {
314+ funPos := safetoken .StartPosition (fset , anonyOvFunc .Pos ())
315+ if declPosn .Offset == funPos .Offset {
316+ return anonyOvFunc , om , true
317+ }
318+ }
319+ }
320+ return nil , nil , false
321+ }
322+
323+ // goxls:match in current package
324+ if funcLit , ovObj , ok := inPkg (pkg ); ok {
325+ return pkg , funcLit , ovObj , true
326+ }
327+
328+ // goxls:match in variants package
329+ if strings .HasSuffix (string (declURI ), ".gop" ) {
330+ variants , err := snapshot .MetadataForFile (ctx , declURI )
331+ if err != nil {
332+ return nil , nil , nil , false
333+ }
334+ for _ , m := range variants {
335+ varPkgs , err := snapshot .TypeCheck (ctx , m .ID )
336+ if err != nil {
337+ return nil , nil , nil , false
338+ }
339+ varPkg := varPkgs [0 ]
340+ if funcLit , ovObj , ok := inPkg (varPkg ); ok {
341+ return varPkg , funcLit , ovObj , true
342+ }
343+ }
344+ }
345+ return nil , nil , nil , false
346+ }
0 commit comments