Skip to content

Commit b786dda

Browse files
committed
gopls/internal/lsp/source: signature help show overload func list
1 parent 311b35b commit b786dda

File tree

4 files changed

+79
-26
lines changed

4 files changed

+79
-26
lines changed

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-6
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,26 +175,59 @@ 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 != nil {
179199
var activeSignature int
180200
var matchSignature []int
181201
infos := make([]protocol.SignatureInformation, len(overloads))
202+
docs := make([]string, len(overloads))
182203
for i, o := range overloads {
183-
if o.Name() == obj.Name() {
184-
activeSignature = i
185-
}
186-
info, err := makeInfo(o.Name(), o.Type().(*types.Signature))
204+
info, doc, err := makeInfoEx(ident.Name, o, o.Type().(*types.Signature))
187205
if err != nil {
188206
return nil, 0, 0, nil
189207
}
190208
if o.Name() == obj.Name() {
191209
activeSignature = i
192210
}
193-
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) {
211+
if sig.Variadic() || (sig.Params() != nil && sig.Params().Len() > activeParam) || (sig.Params() == nil && activeParam == 0) {
194212
matchSignature = append(matchSignature, i)
195213
}
196214
infos[i] = *info
215+
docs[i] = doc
216+
}
217+
for i := 0; i < len(infos); i++ {
218+
var doc string
219+
for j, v := range infos {
220+
if i == j {
221+
doc += "```doc\n* " + v.Label + "\n```\n"
222+
} else {
223+
doc += "```doc\n " + v.Label + "\n```\n"
224+
}
225+
}
226+
if s := docs[i]; s != "" {
227+
doc += "---\n"
228+
doc += stringToDocumentation(s, snapshot.View().Options())
229+
}
230+
infos[i].Documentation = stringToMarkDown(doc)
197231
}
198232
return infos, checkBestSignature(activeSignature, matchSignature), activeParam, nil
199233
}
@@ -261,3 +295,22 @@ func checkBestSignature(active int, matches []int) int {
261295
}
262296
return matches[0]
263297
}
298+
299+
func stringToMarkDown(s string) *protocol.Or_SignatureInformation_documentation {
300+
k := protocol.Markdown
301+
return &protocol.Or_SignatureInformation_documentation{
302+
Value: protocol.MarkupContent{
303+
Kind: k,
304+
Value: s,
305+
},
306+
}
307+
}
308+
309+
func stringToDocumentation(v string, options *Options) string {
310+
if options.PreferredContentFormat == protocol.Markdown {
311+
v = CommentToMarkdown(v, options)
312+
v = strings.TrimSuffix(v, "\n") // TODO(pjw): change the golden files
313+
return v
314+
}
315+
return v
316+
}

0 commit comments

Comments
 (0)