Skip to content

Commit 555530b

Browse files
committed
gopls/internal/lsp/source: signature help show overload func list
1 parent b88035b commit 555530b

File tree

8 files changed

+110
-33
lines changed

8 files changed

+110
-33
lines changed

Diff for: go.mod

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ module golang.org/x/tools
33
go 1.18 // tagx:compat 1.16
44

55
require (
6-
github.com/goplus/gop v1.2.5
7-
github.com/goplus/mod v0.13.9
6+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da
7+
github.com/goplus/mod v0.13.10
88
github.com/yuin/goldmark v1.4.13
9-
golang.org/x/mod v0.16.0
9+
golang.org/x/mod v0.17.0
1010
golang.org/x/net v0.22.0
1111
golang.org/x/sync v0.6.0
1212
golang.org/x/sys v0.18.0
1313
)
1414

1515
require (
16-
github.com/goplus/gogen v1.15.1 // indirect
17-
github.com/qiniu/x v1.13.9 // indirect
16+
github.com/goplus/gogen v1.15.2 // indirect
17+
github.com/qiniu/x v1.13.10 // indirect
1818
)

Diff for: go.sum

+10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
github.com/goplus/gogen v1.15.1 h1:iz/fFpOeldjwmnjLzEdNsZF2mCf+sOHJavbAvV3o7sY=
22
github.com/goplus/gogen v1.15.1/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
3+
github.com/goplus/gogen v1.15.2 h1:Q6XaSx/Zi5tWnjfAziYsQI6Jv6MgODRpFtOYqNkiiqM=
4+
github.com/goplus/gogen v1.15.2/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
5+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da h1:CFAUqjOIYVdGm7J5IPo1AZWIu7iyEpvcux7KIscoWrY=
6+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da/go.mod h1:uREWbR1MrFaviZ4Mbx4ZCcAYDoqzO0iv1Qo6Np0Xx4E=
37
github.com/goplus/gop v1.2.5 h1:kBCcvJ7ONt3IqTUTNGb+n9JO1nwTp5STg1UUSEfvz/k=
48
github.com/goplus/gop v1.2.5/go.mod h1:5rLlryvlZhWLIBw1Rok8s0uvyO54vcYw/7sFLhqtNTc=
59
github.com/goplus/mod v0.13.9 h1:B9zZoHi2AzMltTSOFqZNVjqGlSMlhhNTWwEzVqhTQzg=
610
github.com/goplus/mod v0.13.9/go.mod h1:MibsLSftGmxaQq78YzUzNviyFwB9RtpMaoscufvEKH4=
11+
github.com/goplus/mod v0.13.10 h1:5Om6KOvo31daN7N30kWU1vC5zhsJPM+uPbcEN/FnlzE=
12+
github.com/goplus/mod v0.13.10/go.mod h1:HDuPZgpWiaTp3PUolFgsiX+Q77cbUWB/mikVHfYND3c=
713
github.com/qiniu/x v1.13.9 h1:OUcQZSze1oTO5pzrhsepTUvEb9K9WtOiqZomWffFGWE=
814
github.com/qiniu/x v1.13.9/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
15+
github.com/qiniu/x v1.13.10 h1:J4Z3XugYzAq85SlyAfqlKVrbf05glMbAOh+QncsDQpE=
16+
github.com/qiniu/x v1.13.10/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
917
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
1018
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
1119
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -16,6 +24,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
1624
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
1725
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
1826
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
27+
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
28+
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
1929
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
2030
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
2131
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=

Diff for: gopls/go.mod

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ go 1.18
44

55
require (
66
github.com/google/go-cmp v0.6.0
7-
github.com/goplus/gogen v1.15.1
8-
github.com/goplus/gop v1.2.5
9-
github.com/goplus/mod v0.13.9
7+
github.com/goplus/gogen v1.15.2
8+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da
9+
github.com/goplus/mod v0.13.10
1010
github.com/jba/printsrc v0.2.2
1111
github.com/jba/templatecheck v0.7.0
12-
github.com/qiniu/x v1.13.9
12+
github.com/qiniu/x v1.13.10
1313
github.com/sergi/go-diff v1.1.0
14-
golang.org/x/mod v0.16.0
14+
golang.org/x/mod v0.17.0
1515
golang.org/x/sync v0.6.0
1616
golang.org/x/sys v0.18.0
1717
golang.org/x/text v0.14.0

Diff for: gopls/go.sum

+11
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,20 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
1212
github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8=
1313
github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=
1414
github.com/goplus/c2go v0.7.25/go.mod h1:e9oe4jDVhGFMJLEGmPSrVkLuXbLZAEmAu0/uD6fSz5E=
15+
github.com/goplus/c2go v0.7.26/go.mod h1:ePAStubV/ls8mmdPGQo6VfADTVd46rKuBemE4zzBDnA=
1516
github.com/goplus/gogen v1.15.0/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
1617
github.com/goplus/gogen v1.15.1 h1:iz/fFpOeldjwmnjLzEdNsZF2mCf+sOHJavbAvV3o7sY=
1718
github.com/goplus/gogen v1.15.1/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
19+
github.com/goplus/gogen v1.15.2 h1:Q6XaSx/Zi5tWnjfAziYsQI6Jv6MgODRpFtOYqNkiiqM=
20+
github.com/goplus/gogen v1.15.2/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
21+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da h1:CFAUqjOIYVdGm7J5IPo1AZWIu7iyEpvcux7KIscoWrY=
22+
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da/go.mod h1:uREWbR1MrFaviZ4Mbx4ZCcAYDoqzO0iv1Qo6Np0Xx4E=
1823
github.com/goplus/gop v1.2.5 h1:kBCcvJ7ONt3IqTUTNGb+n9JO1nwTp5STg1UUSEfvz/k=
1924
github.com/goplus/gop v1.2.5/go.mod h1:5rLlryvlZhWLIBw1Rok8s0uvyO54vcYw/7sFLhqtNTc=
2025
github.com/goplus/mod v0.13.9 h1:B9zZoHi2AzMltTSOFqZNVjqGlSMlhhNTWwEzVqhTQzg=
2126
github.com/goplus/mod v0.13.9/go.mod h1:MibsLSftGmxaQq78YzUzNviyFwB9RtpMaoscufvEKH4=
27+
github.com/goplus/mod v0.13.10 h1:5Om6KOvo31daN7N30kWU1vC5zhsJPM+uPbcEN/FnlzE=
28+
github.com/goplus/mod v0.13.10/go.mod h1:HDuPZgpWiaTp3PUolFgsiX+Q77cbUWB/mikVHfYND3c=
2229
github.com/jba/printsrc v0.2.2 h1:9OHK51UT+/iMAEBlQIIXW04qvKyF3/vvLuwW/hL8tDU=
2330
github.com/jba/printsrc v0.2.2/go.mod h1:1xULjw59sL0dPdWpDoVU06TIEO/Wnfv6AHRpiElTwYM=
2431
github.com/jba/templatecheck v0.7.0 h1:wjTb/VhGgSFeim5zjWVePBdaMo28X74bGLSABZV+zIA=
@@ -35,6 +42,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
3542
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3643
github.com/qiniu/x v1.13.9 h1:OUcQZSze1oTO5pzrhsepTUvEb9K9WtOiqZomWffFGWE=
3744
github.com/qiniu/x v1.13.9/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
45+
github.com/qiniu/x v1.13.10 h1:J4Z3XugYzAq85SlyAfqlKVrbf05glMbAOh+QncsDQpE=
46+
github.com/qiniu/x v1.13.10/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
3847
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
3948
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
4049
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
@@ -52,6 +61,8 @@ golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338/go.mod h1:AbB0pIl
5261
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
5362
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
5463
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
64+
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
65+
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
5566
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
5667
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
5768
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=

Diff for: gopls/internal/goxls/testdata/overload/signature.gop

+18-18
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
func _() {
2-
Demo(100) //@signature_overload("100", "Demo__1(n int) int", 1, 0)
3-
Demo(100, 200) //@signature_overload("100", "Demo__2(n1 int, n2 int)", 2, 0)
4-
Demo(100, 200) //@signature_overload("200", "Demo__2(n1 int, n2 int)", 2, 1)
2+
Demo(100) //@signature_overload("100", "Demo(n int) int", 1, 0)
3+
Demo(100, 200) //@signature_overload("100", "Demo(n1 int, n2 int)", 2, 0)
4+
Demo(100, 200) //@signature_overload("200", "Demo(n1 int, n2 int)", 2, 1)
55
}
66

77
func _() {
8-
Demo 100 //@signature_overload("100", "Demo__1(n int) int", 1, 0)
9-
Demo 100, 200 //@signature_overload("100", "Demo__2(n1 int, n2 int)", 2, 0)
10-
Demo 100, 200 //@signature_overload("200", "Demo__2(n1 int, n2 int)", 2, 1)
8+
Demo 100 //@signature_overload("100", "Demo(n int) int", 1, 0)
9+
Demo 100, 200 //@signature_overload("100", "Demo(n1 int, n2 int)", 2, 0)
10+
Demo 100, 200 //@signature_overload("200", "Demo(n1 int, n2 int)", 2, 1)
1111
}
1212

1313
func _() {
14-
add(100, 200) //@signature_overload("100", "addInt(n1 int, n2 int) int", 0, 0)
15-
add(100, 200) //@signature_overload("200", "addInt(n1 int, n2 int) int", 0, 1)
16-
add(100, 200, 300) //@signature_overload("100", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 0)
17-
add(100, 200, 300) //@signature_overload(", 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 1)
18-
add(100, 200, 300) //@signature_overload(" 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
19-
add(100, 200, 300) //@signature_overload(")", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
14+
add(100, 200) //@signature_overload("100", "add(n1 int, n2 int) int", 0, 0)
15+
add(100, 200) //@signature_overload("200", "add(n1 int, n2 int) int", 0, 1)
16+
add(100, 200, 300) //@signature_overload("100", "add(n1 float64, n2 float64, n3 float64) float64", 1, 0)
17+
add(100, 200, 300) //@signature_overload(", 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 1)
18+
add(100, 200, 300) //@signature_overload(" 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
19+
add(100, 200, 300) //@signature_overload(")", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
2020
}
2121

2222
func _() {
23-
add 100, 200 //@signature_overload("100", "addInt(n1 int, n2 int) int", 0, 0)
24-
add 100, 200 //@signature_overload("200", "addInt(n1 int, n2 int) int", 0, 1)
25-
add 100, 200, 300 //@signature_overload("100", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 0)
26-
add 100, 200, 300 //@signature_overload(", 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 1)
27-
add 100, 200, 300 //@signature_overload(" 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
28-
add 100, 200, 300 //@signature_overload(" //", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
23+
add 100, 200 //@signature_overload("100", "add(n1 int, n2 int) int", 0, 0)
24+
add 100, 200 //@signature_overload("200", "add(n1 int, n2 int) int", 0, 1)
25+
add 100, 200, 300 //@signature_overload("100", "add(n1 float64, n2 float64, n3 float64) float64", 1, 0)
26+
add 100, 200, 300 //@signature_overload(", 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 1)
27+
add 100, 200, 300 //@signature_overload(" 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
28+
add 100, 200, 300 //@signature_overload(" //", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
2929
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
func _() {
2-
Demo //@signature_overload(" //", "Demo__1(n int) int", 1, 0)
2+
Demo //@signature_overload(" //", "Demo()", 0, 0)
33
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
func _() {
2-
Demo 100,//@signature_overload("//", "Demo__2(n1 int, n2 int)", 2, 1)
2+
Demo 100,//@signature_overload("//", "Demo(n1 int, n2 int)", 2, 1)
33
}

Diff for: gopls/internal/lsp/source/signature_help_gox.go

+59-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"fmt"
1010
"go/types"
11+
"strings"
1112

1213
"github.com/goplus/gop/ast"
1314
"github.com/goplus/gop/token"
@@ -37,7 +38,7 @@ func GopSignatureHelp(ctx context.Context, snapshot Snapshot, fh FileHandle, pos
3738
}
3839
var offset = int(pos - start)
3940
npos := pos
40-
if len(pgf.File.Code) >= offset {
41+
if len(pgf.File.Code) > offset {
4142
if pgf.File.Code[offset] == '\n' {
4243
offset--
4344
npos--
@@ -174,24 +175,60 @@ FindCall:
174175
Parameters: paramInfo,
175176
}, nil
176177
}
178+
makeInfoEx := func(name string, obj types.Object, sig *types.Signature) (*protocol.SignatureInformation, string, error) {
179+
d, err := HoverDocForObject(ctx, snapshot, pkg.FileSet(), obj)
180+
if err != nil {
181+
return nil, "", err
182+
}
183+
s, err := NewSignature(ctx, snapshot, pkg, sig, d, qf, mq)
184+
if err != nil {
185+
return nil, "", err
186+
}
187+
paramInfo := make([]protocol.ParameterInformation, 0, len(s.params))
188+
for _, p := range s.params {
189+
paramInfo = append(paramInfo, protocol.ParameterInformation{Label: p})
190+
}
191+
return &protocol.SignatureInformation{
192+
Label: name + s.Format(),
193+
Documentation: stringToSigInfoDocumentation(s.doc, snapshot.View().Options()),
194+
Parameters: paramInfo,
195+
}, s.doc, nil
196+
}
177197

178198
if overloads {
179199
var activeSignature int
180200
var matchSignature []int
181201
infos := make([]protocol.SignatureInformation, len(objs))
202+
docs := make([]string, len(objs))
182203
for i, o := range objs {
183204
sig := o.Type().(*types.Signature)
184-
info, err := makeInfo(o.Name(), sig)
205+
info, doc, err := makeInfoEx(ident.Name, o, sig)
185206
if err != nil {
186207
return nil, 0, 0, nil
187208
}
188209
if o.Name() == obj.Name() {
189210
activeSignature = i
190211
}
191-
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) {
212+
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) || (sig.Params() == nil && activeParam == 0) {
192213
matchSignature = append(matchSignature, i)
193214
}
194215
infos[i] = *info
216+
docs[i] = doc
217+
}
218+
for i := 0; i < len(infos); i++ {
219+
var doc string
220+
for j, v := range infos {
221+
if i == j {
222+
doc += "```doc\n* " + v.Label + "\n```\n"
223+
} else {
224+
doc += "```doc\n " + v.Label + "\n```\n"
225+
}
226+
}
227+
if s := docs[i]; s != "" {
228+
doc += "---\n"
229+
doc += stringToDocumentation(s, snapshot.View().Options())
230+
}
231+
infos[i].Documentation = stringToMarkDown(doc)
195232
}
196233
return infos, checkBestSignature(activeSignature, matchSignature), activeParam, nil
197234
}
@@ -259,3 +296,22 @@ func checkBestSignature(active int, matches []int) int {
259296
}
260297
return matches[0]
261298
}
299+
300+
func stringToMarkDown(s string) *protocol.Or_SignatureInformation_documentation {
301+
k := protocol.Markdown
302+
return &protocol.Or_SignatureInformation_documentation{
303+
Value: protocol.MarkupContent{
304+
Kind: k,
305+
Value: s,
306+
},
307+
}
308+
}
309+
310+
func stringToDocumentation(v string, options *Options) string {
311+
if options.PreferredContentFormat == protocol.Markdown {
312+
v = CommentToMarkdown(v, options)
313+
v = strings.TrimSuffix(v, "\n") // TODO(pjw): change the golden files
314+
return v
315+
}
316+
return v
317+
}

0 commit comments

Comments
 (0)