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 6218386
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 23 deletions.
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 6218386

Please sign in to comment.