Skip to content

Commit 44fc0ce

Browse files
committed
test:overload anonymous reference
1 parent 57a6464 commit 44fc0ce

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

gopls/internal/lsp/source/references_gox.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package source
66

77
import (
8+
"bytes"
89
"context"
910
"fmt"
1011
"go/token"
@@ -586,7 +587,13 @@ func gopObjectsAt(info *typesutil.Info, file *ast.File, pos token.Pos) (map[type
586587
}
587588
targets[obj] = leaf
588589
case *ast.FuncLit:
590+
// Look up the implicit *types.Func (overload member)
589591
obj := info.Implicits[leaf]
592+
if obj == nil {
593+
var buf bytes.Buffer
594+
typesutil.WriteExpr(&buf, leaf)
595+
return nil, nil, fmt.Errorf("%w for %q", errNoObjectFound, buf.String())
596+
}
590597
targets[obj] = leaf
591598
}
592599

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package misc
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"testing"
7+
8+
"github.com/google/go-cmp/cmp"
9+
. "golang.org/x/tools/gopls/internal/lsp/regtest"
10+
)
11+
12+
func TestReferencesOnOverloadMember(t *testing.T) {
13+
const files = `
14+
-- go.mod --
15+
module mod.com
16+
17+
go 1.19
18+
-- def.gop --
19+
func add = (
20+
func(a, b int) int {
21+
return a + b
22+
}
23+
func(a, b string) string {
24+
return a + b
25+
}
26+
)
27+
-- test.gop --
28+
println add(1,2)
29+
println add("Hello", "World")
30+
println add("Bye", "World")
31+
-- gop_autogen.go --
32+
package main
33+
34+
import "fmt"
35+
36+
const _ = true
37+
func add__0(a int, b int) int {
38+
return a + b
39+
}
40+
func add__1(a string, b string) string {
41+
return a + b
42+
}
43+
func main() {
44+
fmt.Println(add__0(1, 2))
45+
fmt.Println(add__1("Hello", "World"))
46+
fmt.Println(add__1("Bye", "World"))
47+
}
48+
`
49+
Run(t, files, func(t *testing.T, env *Env) {
50+
env.OpenFile("test.gop")
51+
loc := env.GoToDefinition(env.RegexpSearch("test.gop", `println (add)\("Hello", "World"\)`))
52+
refs, err := env.Editor.References(env.Ctx, loc)
53+
if err != nil {
54+
t.Fatalf("references on (*s).Error failed: %v", err)
55+
}
56+
var buf strings.Builder
57+
for _, ref := range refs {
58+
fmt.Fprintf(&buf, "%s %s\n", env.Sandbox.Workdir.URIToPath(ref.URI), ref.Range)
59+
}
60+
got := buf.String()
61+
want := "def.gop 4:1-4:25\n" + // anonymous overload func
62+
"test.gop 1:8-1:11\n" +
63+
"test.gop 2:8-2:11\n"
64+
if diff := cmp.Diff(want, got); diff != "" {
65+
t.Errorf("unexpected references on (*s).Error (-want +got):\n%s", diff)
66+
}
67+
})
68+
}

0 commit comments

Comments
 (0)