Skip to content

Commit

Permalink
gopls/internal/lsp/source: signature help show overload func list
Browse files Browse the repository at this point in the history
  • Loading branch information
visualfc committed Apr 22, 2024
1 parent b88035b commit 555530b
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 33 deletions.
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ module golang.org/x/tools
go 1.18 // tagx:compat 1.16

require (
github.com/goplus/gop v1.2.5
github.com/goplus/mod v0.13.9
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da
github.com/goplus/mod v0.13.10
github.com/yuin/goldmark v1.4.13
golang.org/x/mod v0.16.0
golang.org/x/mod v0.17.0
golang.org/x/net v0.22.0
golang.org/x/sync v0.6.0
golang.org/x/sys v0.18.0
)

require (
github.com/goplus/gogen v1.15.1 // indirect
github.com/qiniu/x v1.13.9 // indirect
github.com/goplus/gogen v1.15.2 // indirect
github.com/qiniu/x v1.13.10 // indirect
)
10 changes: 10 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
github.com/goplus/gogen v1.15.1 h1:iz/fFpOeldjwmnjLzEdNsZF2mCf+sOHJavbAvV3o7sY=
github.com/goplus/gogen v1.15.1/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
github.com/goplus/gogen v1.15.2 h1:Q6XaSx/Zi5tWnjfAziYsQI6Jv6MgODRpFtOYqNkiiqM=
github.com/goplus/gogen v1.15.2/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da h1:CFAUqjOIYVdGm7J5IPo1AZWIu7iyEpvcux7KIscoWrY=
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da/go.mod h1:uREWbR1MrFaviZ4Mbx4ZCcAYDoqzO0iv1Qo6Np0Xx4E=
github.com/goplus/gop v1.2.5 h1:kBCcvJ7ONt3IqTUTNGb+n9JO1nwTp5STg1UUSEfvz/k=
github.com/goplus/gop v1.2.5/go.mod h1:5rLlryvlZhWLIBw1Rok8s0uvyO54vcYw/7sFLhqtNTc=
github.com/goplus/mod v0.13.9 h1:B9zZoHi2AzMltTSOFqZNVjqGlSMlhhNTWwEzVqhTQzg=
github.com/goplus/mod v0.13.9/go.mod h1:MibsLSftGmxaQq78YzUzNviyFwB9RtpMaoscufvEKH4=
github.com/goplus/mod v0.13.10 h1:5Om6KOvo31daN7N30kWU1vC5zhsJPM+uPbcEN/FnlzE=
github.com/goplus/mod v0.13.10/go.mod h1:HDuPZgpWiaTp3PUolFgsiX+Q77cbUWB/mikVHfYND3c=
github.com/qiniu/x v1.13.9 h1:OUcQZSze1oTO5pzrhsepTUvEb9K9WtOiqZomWffFGWE=
github.com/qiniu/x v1.13.9/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
github.com/qiniu/x v1.13.10 h1:J4Z3XugYzAq85SlyAfqlKVrbf05glMbAOh+QncsDQpE=
github.com/qiniu/x v1.13.10/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand All @@ -16,6 +24,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
Expand Down
10 changes: 5 additions & 5 deletions gopls/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ go 1.18

require (
github.com/google/go-cmp v0.6.0
github.com/goplus/gogen v1.15.1
github.com/goplus/gop v1.2.5
github.com/goplus/mod v0.13.9
github.com/goplus/gogen v1.15.2
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da
github.com/goplus/mod v0.13.10
github.com/jba/printsrc v0.2.2
github.com/jba/templatecheck v0.7.0
github.com/qiniu/x v1.13.9
github.com/qiniu/x v1.13.10
github.com/sergi/go-diff v1.1.0
golang.org/x/mod v0.16.0
golang.org/x/mod v0.17.0
golang.org/x/sync v0.6.0
golang.org/x/sys v0.18.0
golang.org/x/text v0.14.0
Expand Down
11 changes: 11 additions & 0 deletions gopls/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,20 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
github.com/google/safehtml v0.1.0 h1:EwLKo8qawTKfsi0orxcQAZzu07cICaBeFMegAU9eaT8=
github.com/google/safehtml v0.1.0/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=
github.com/goplus/c2go v0.7.25/go.mod h1:e9oe4jDVhGFMJLEGmPSrVkLuXbLZAEmAu0/uD6fSz5E=
github.com/goplus/c2go v0.7.26/go.mod h1:ePAStubV/ls8mmdPGQo6VfADTVd46rKuBemE4zzBDnA=
github.com/goplus/gogen v1.15.0/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
github.com/goplus/gogen v1.15.1 h1:iz/fFpOeldjwmnjLzEdNsZF2mCf+sOHJavbAvV3o7sY=
github.com/goplus/gogen v1.15.1/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
github.com/goplus/gogen v1.15.2 h1:Q6XaSx/Zi5tWnjfAziYsQI6Jv6MgODRpFtOYqNkiiqM=
github.com/goplus/gogen v1.15.2/go.mod h1:92qEzVgv7y8JEFICWG9GvYI5IzfEkxYdsA1DbmnTkqk=
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da h1:CFAUqjOIYVdGm7J5IPo1AZWIu7iyEpvcux7KIscoWrY=
github.com/goplus/gop v1.2.0-pre.1.0.20240422032454-64a3001223da/go.mod h1:uREWbR1MrFaviZ4Mbx4ZCcAYDoqzO0iv1Qo6Np0Xx4E=
github.com/goplus/gop v1.2.5 h1:kBCcvJ7ONt3IqTUTNGb+n9JO1nwTp5STg1UUSEfvz/k=
github.com/goplus/gop v1.2.5/go.mod h1:5rLlryvlZhWLIBw1Rok8s0uvyO54vcYw/7sFLhqtNTc=
github.com/goplus/mod v0.13.9 h1:B9zZoHi2AzMltTSOFqZNVjqGlSMlhhNTWwEzVqhTQzg=
github.com/goplus/mod v0.13.9/go.mod h1:MibsLSftGmxaQq78YzUzNviyFwB9RtpMaoscufvEKH4=
github.com/goplus/mod v0.13.10 h1:5Om6KOvo31daN7N30kWU1vC5zhsJPM+uPbcEN/FnlzE=
github.com/goplus/mod v0.13.10/go.mod h1:HDuPZgpWiaTp3PUolFgsiX+Q77cbUWB/mikVHfYND3c=
github.com/jba/printsrc v0.2.2 h1:9OHK51UT+/iMAEBlQIIXW04qvKyF3/vvLuwW/hL8tDU=
github.com/jba/printsrc v0.2.2/go.mod h1:1xULjw59sL0dPdWpDoVU06TIEO/Wnfv6AHRpiElTwYM=
github.com/jba/templatecheck v0.7.0 h1:wjTb/VhGgSFeim5zjWVePBdaMo28X74bGLSABZV+zIA=
Expand All @@ -35,6 +42,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/qiniu/x v1.13.9 h1:OUcQZSze1oTO5pzrhsepTUvEb9K9WtOiqZomWffFGWE=
github.com/qiniu/x v1.13.9/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
github.com/qiniu/x v1.13.10 h1:J4Z3XugYzAq85SlyAfqlKVrbf05glMbAOh+QncsDQpE=
github.com/qiniu/x v1.13.10/go.mod h1:INZ2TSWSJVWO/RuELQROERcslBwVgFG7MkTfEdaQz9E=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
Expand All @@ -52,6 +61,8 @@ golang.org/x/exp/typeparams v0.0.0-20221212164502-fae10dda9338/go.mod h1:AbB0pIl
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
Expand Down
36 changes: 18 additions & 18 deletions gopls/internal/goxls/testdata/overload/signature.gop
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
func _() {
Demo(100) //@signature_overload("100", "Demo__1(n int) int", 1, 0)
Demo(100, 200) //@signature_overload("100", "Demo__2(n1 int, n2 int)", 2, 0)
Demo(100, 200) //@signature_overload("200", "Demo__2(n1 int, n2 int)", 2, 1)
Demo(100) //@signature_overload("100", "Demo(n int) int", 1, 0)
Demo(100, 200) //@signature_overload("100", "Demo(n1 int, n2 int)", 2, 0)
Demo(100, 200) //@signature_overload("200", "Demo(n1 int, n2 int)", 2, 1)
}

func _() {
Demo 100 //@signature_overload("100", "Demo__1(n int) int", 1, 0)
Demo 100, 200 //@signature_overload("100", "Demo__2(n1 int, n2 int)", 2, 0)
Demo 100, 200 //@signature_overload("200", "Demo__2(n1 int, n2 int)", 2, 1)
Demo 100 //@signature_overload("100", "Demo(n int) int", 1, 0)
Demo 100, 200 //@signature_overload("100", "Demo(n1 int, n2 int)", 2, 0)
Demo 100, 200 //@signature_overload("200", "Demo(n1 int, n2 int)", 2, 1)
}

func _() {
add(100, 200) //@signature_overload("100", "addInt(n1 int, n2 int) int", 0, 0)
add(100, 200) //@signature_overload("200", "addInt(n1 int, n2 int) int", 0, 1)
add(100, 200, 300) //@signature_overload("100", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 0)
add(100, 200, 300) //@signature_overload(", 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 1)
add(100, 200, 300) //@signature_overload(" 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add(100, 200, 300) //@signature_overload(")", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add(100, 200) //@signature_overload("100", "add(n1 int, n2 int) int", 0, 0)
add(100, 200) //@signature_overload("200", "add(n1 int, n2 int) int", 0, 1)
add(100, 200, 300) //@signature_overload("100", "add(n1 float64, n2 float64, n3 float64) float64", 1, 0)
add(100, 200, 300) //@signature_overload(", 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 1)
add(100, 200, 300) //@signature_overload(" 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add(100, 200, 300) //@signature_overload(")", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
}

func _() {
add 100, 200 //@signature_overload("100", "addInt(n1 int, n2 int) int", 0, 0)
add 100, 200 //@signature_overload("200", "addInt(n1 int, n2 int) int", 0, 1)
add 100, 200, 300 //@signature_overload("100", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 0)
add 100, 200, 300 //@signature_overload(", 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 1)
add 100, 200, 300 //@signature_overload(" 3", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add 100, 200, 300 //@signature_overload(" //", "addFloat(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add 100, 200 //@signature_overload("100", "add(n1 int, n2 int) int", 0, 0)
add 100, 200 //@signature_overload("200", "add(n1 int, n2 int) int", 0, 1)
add 100, 200, 300 //@signature_overload("100", "add(n1 float64, n2 float64, n3 float64) float64", 1, 0)
add 100, 200, 300 //@signature_overload(", 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 1)
add 100, 200, 300 //@signature_overload(" 3", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
add 100, 200, 300 //@signature_overload(" //", "add(n1 float64, n2 float64, n3 float64) float64", 1, 2)
}
2 changes: 1 addition & 1 deletion gopls/internal/goxls/testdata/overload/signature2.gop.in
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
func _() {
Demo //@signature_overload(" //", "Demo__1(n int) int", 1, 0)
Demo //@signature_overload(" //", "Demo()", 0, 0)
}
2 changes: 1 addition & 1 deletion gopls/internal/goxls/testdata/overload/signature3.gop.in
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
func _() {
Demo 100,//@signature_overload("//", "Demo__2(n1 int, n2 int)", 2, 1)
Demo 100,//@signature_overload("//", "Demo(n1 int, n2 int)", 2, 1)
}
62 changes: 59 additions & 3 deletions gopls/internal/lsp/source/signature_help_gox.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"context"
"fmt"
"go/types"
"strings"

"github.com/goplus/gop/ast"
"github.com/goplus/gop/token"
Expand Down Expand Up @@ -37,7 +38,7 @@ func GopSignatureHelp(ctx context.Context, snapshot Snapshot, fh FileHandle, pos
}
var offset = int(pos - start)
npos := pos
if len(pgf.File.Code) >= offset {
if len(pgf.File.Code) > offset {
if pgf.File.Code[offset] == '\n' {
offset--
npos--
Expand Down Expand Up @@ -174,24 +175,60 @@ FindCall:
Parameters: paramInfo,
}, nil
}
makeInfoEx := func(name string, obj types.Object, sig *types.Signature) (*protocol.SignatureInformation, string, error) {
d, err := HoverDocForObject(ctx, snapshot, pkg.FileSet(), obj)
if err != nil {
return nil, "", err
}
s, err := NewSignature(ctx, snapshot, pkg, sig, d, qf, mq)
if err != nil {
return nil, "", err
}
paramInfo := make([]protocol.ParameterInformation, 0, len(s.params))
for _, p := range s.params {
paramInfo = append(paramInfo, protocol.ParameterInformation{Label: p})
}
return &protocol.SignatureInformation{
Label: name + s.Format(),
Documentation: stringToSigInfoDocumentation(s.doc, snapshot.View().Options()),
Parameters: paramInfo,
}, s.doc, nil
}

if overloads {
var activeSignature int
var matchSignature []int
infos := make([]protocol.SignatureInformation, len(objs))
docs := make([]string, len(objs))
for i, o := range objs {
sig := o.Type().(*types.Signature)
info, err := makeInfo(o.Name(), sig)
info, doc, err := makeInfoEx(ident.Name, o, sig)
if err != nil {
return nil, 0, 0, nil
}
if o.Name() == obj.Name() {
activeSignature = i
}
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) {
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) || (sig.Params() == nil && activeParam == 0) {
matchSignature = append(matchSignature, i)
}
infos[i] = *info
docs[i] = doc
}
for i := 0; i < len(infos); i++ {
var doc string
for j, v := range infos {
if i == j {
doc += "```doc\n* " + v.Label + "\n```\n"
} else {
doc += "```doc\n " + v.Label + "\n```\n"
}
}
if s := docs[i]; s != "" {
doc += "---\n"
doc += stringToDocumentation(s, snapshot.View().Options())
}
infos[i].Documentation = stringToMarkDown(doc)
}
return infos, checkBestSignature(activeSignature, matchSignature), activeParam, nil
}
Expand Down Expand Up @@ -259,3 +296,22 @@ func checkBestSignature(active int, matches []int) int {
}
return matches[0]
}

func stringToMarkDown(s string) *protocol.Or_SignatureInformation_documentation {
k := protocol.Markdown
return &protocol.Or_SignatureInformation_documentation{
Value: protocol.MarkupContent{
Kind: k,
Value: s,
},
}
}

func stringToDocumentation(v string, options *Options) string {
if options.PreferredContentFormat == protocol.Markdown {
v = CommentToMarkdown(v, options)
v = strings.TrimSuffix(v, "\n") // TODO(pjw): change the golden files
return v
}
return v
}

0 comments on commit 555530b

Please sign in to comment.