Skip to content

Commit b9a361a

Browse files
committed
gopls/internal/golang: provide version info for stdlib methods
For golang/go#67159 Change-Id: If3d09a39e8bf0a5ab61dc0953d7250ad75525372 Reviewed-on: https://go-review.googlesource.com/c/tools/+/595135 Reviewed-by: Robert Findley <[email protected]> Reviewed-by: Alan Donovan <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent dd9d554 commit b9a361a

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

gopls/internal/golang/hover.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -1213,19 +1213,43 @@ func StdSymbolOf(obj types.Object) *stdlib.Symbol {
12131213
return nil
12141214
}
12151215

1216+
// Handle Function, Type, Const & Var.
12161217
if isPackageLevel(obj) {
1218+
// Symbols defined not in std lib package should return early.
1219+
symbols := stdlib.PackageSymbols[obj.Pkg().Path()]
1220+
if symbols == nil {
1221+
return nil
1222+
}
12171223
// TODO(hxjiang): This is binary searchable.
1218-
for _, s := range stdlib.PackageSymbols[obj.Pkg().Path()] {
1224+
for _, s := range symbols {
12191225
if s.Kind == stdlib.Method || s.Kind == stdlib.Field {
12201226
continue
12211227
}
12221228
if s.Name == obj.Name() {
12231229
return &s
12241230
}
12251231
}
1232+
return nil
1233+
}
1234+
1235+
// Handle Method.
1236+
if fn, _ := obj.(*types.Func); fn != nil {
1237+
isPtr, named := typesinternal.ReceiverNamed(fn.Type().(*types.Signature).Recv())
1238+
if isPackageLevel(named.Obj()) {
1239+
for _, s := range stdlib.PackageSymbols[obj.Pkg().Path()] {
1240+
if s.Kind != stdlib.Method {
1241+
continue
1242+
}
1243+
ptr, recv, name := s.SplitMethod()
1244+
if ptr == isPtr && recv == named.Obj().Name() && name == fn.Name() {
1245+
return &s
1246+
}
1247+
}
1248+
return nil
1249+
}
12261250
}
12271251

1228-
// TODO(hxjiang): handle exported fields and methods of package level types.
1252+
// TODO(hxjiang): handle exported fields of package level types.
12291253
return nil
12301254
}
12311255

gopls/internal/test/integration/misc/hover_test.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,9 @@ package stdlib
669669
import "fmt"
670670
import "context"
671671
import "crypto"
672+
import "regexp"
673+
674+
type testRegexp = *regexp.Regexp
672675
673676
func _() {
674677
var ctx context.Context
@@ -678,6 +681,11 @@ func _() {
678681
fmt.Printf("%v", crypto.SHA512_224)
679682
}
680683
_ := fmt.Appendf(make([]byte, 100), "world, %d", 23)
684+
685+
var re = regexp.MustCompile("\n{2,}")
686+
copy := re.Copy()
687+
var testRE testRegexp
688+
testRE.Longest()
681689
}
682690
`
683691

@@ -692,7 +700,8 @@ func _() {
692700
{"Canceled", true, "go1.7"}, // package-level var
693701
{"Context", true, "go1.7"}, // package-level type
694702
{"SHA512_224", true, "go1.5"}, // package-level const
695-
// TODO(hxjiang): add test for symbol type Method.
703+
{"Copy", true, "go1.6"}, // method
704+
{"Longest", true, "go1.1"}, // method with alias receiver
696705
// TODO(hxjiang): add test for symbol type Field.
697706
}
698707

0 commit comments

Comments
 (0)