mirror of
https://github.com/golang/go
synced 2024-11-19 00:24:41 -07:00
0c330b00b1
Previously we were erroneously suggesting a "func() {}" literal in cases like: http.Handle("/", <>) This was happening because saw that the http.HandlerFunc type satisfied the http.Handler interface, and that http.HandlerFunc is a function type. However, of course, you can't pass a function literal to http.Handle(). Make a few tweaks to address the problem: 1. Don't suggest literal "func () {}" candidates if the expected type is an interface type. 2. Suggest named function types that implement an interface. This causes us to suggest "http.HandlerFunc()" in the above example. 3. Suggest a func literal candidate inside named function type conversions. This will suggest "func() {}" when completing "http.HandlerFunc(<>)". This way the false positive func literal is gone, and you still get literal candidates that help you use an http.HandlerFunc as an http.Handler. Note that this particular example is not very compelling in light of http.HandleFunc() which can take a func literal directly, but such a convenience function may not exist in other analogous situations. Change-Id: Ia68097b9a5b8351921349340d18acd8876554691 Reviewed-on: https://go-review.googlesource.com/c/tools/+/205137 Reviewed-by: Rebecca Stambler <rstambler@golang.org> Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
153 lines
4.7 KiB
Go
153 lines
4.7 KiB
Go
package snippets
|
|
|
|
import (
|
|
"net/http"
|
|
"sort"
|
|
|
|
"golang.org/x/tools/internal/lsp/foo"
|
|
)
|
|
|
|
func _() {
|
|
[]int{} //@item(litIntSlice, "[]int{}", "", "var")
|
|
make([]int, 0) //@item(makeIntSlice, "make([]int, 0)", "", "func")
|
|
|
|
var slice []int
|
|
slice = i //@snippet(" //", litIntSlice, "[]int{$0\\}", "[]int{$0\\}")
|
|
slice = m //@snippet(" //", makeIntSlice, "make([]int, ${1:})", "make([]int, ${1:0})")
|
|
}
|
|
|
|
func _() {
|
|
type namedInt []int
|
|
|
|
namedInt{} //@item(litNamedSlice, "namedInt{}", "", "var")
|
|
make(namedInt, 0) //@item(makeNamedSlice, "make(namedInt, 0)", "", "func")
|
|
|
|
var namedSlice namedInt
|
|
namedSlice = n //@snippet(" //", litNamedSlice, "namedInt{$0\\}", "namedInt{$0\\}")
|
|
namedSlice = m //@snippet(" //", makeNamedSlice, "make(namedInt, ${1:})", "make(namedInt, ${1:0})")
|
|
}
|
|
|
|
func _() {
|
|
make(chan int) //@item(makeChan, "make(chan int)", "", "func")
|
|
|
|
var ch chan int
|
|
ch = m //@snippet(" //", makeChan, "make(chan int)", "make(chan int)")
|
|
}
|
|
|
|
func _() {
|
|
map[string]struct{}{} //@item(litMap, "map[string]struct{}{}", "", "var")
|
|
make(map[string]struct{}) //@item(makeMap, "make(map[string]struct{})", "", "func")
|
|
|
|
var m map[string]struct{}
|
|
m = m //@snippet(" //", litMap, "map[string]struct{\\}{$0\\}", "map[string]struct{\\}{$0\\}")
|
|
m = m //@snippet(" //", makeMap, "make(map[string]struct{\\})", "make(map[string]struct{\\})")
|
|
|
|
struct{}{} //@item(litEmptyStruct, "struct{}{}", "", "var")
|
|
|
|
m["hi"] = s //@snippet(" //", litEmptyStruct, "struct{\\}{\\}", "struct{\\}{\\}")
|
|
}
|
|
|
|
func _() {
|
|
type myStruct struct{ i int }
|
|
|
|
myStruct{} //@item(litStruct, "myStruct{}", "", "var")
|
|
&myStruct{} //@item(litStructPtr, "&myStruct{}", "", "var")
|
|
|
|
var ms myStruct
|
|
ms = m //@snippet(" //", litStruct, "myStruct{$0\\}", "myStruct{$0\\}")
|
|
|
|
var msPtr *myStruct
|
|
msPtr = m //@snippet(" //", litStructPtr, "&myStruct{$0\\}", "&myStruct{$0\\}")
|
|
|
|
msPtr = &m //@snippet(" //", litStruct, "myStruct{$0\\}", "myStruct{$0\\}")
|
|
}
|
|
|
|
type myImpl struct{}
|
|
|
|
func (myImpl) foo() {}
|
|
|
|
func (*myImpl) bar() {}
|
|
|
|
type myBasicImpl string
|
|
|
|
func (myBasicImpl) foo() {}
|
|
|
|
func _() {
|
|
type myIntf interface {
|
|
foo()
|
|
}
|
|
|
|
myImpl{} //@item(litImpl, "myImpl{}", "", "var")
|
|
|
|
var mi myIntf
|
|
mi = m //@snippet(" //", litImpl, "myImpl{\\}", "myImpl{\\}")
|
|
|
|
myBasicImpl() //@item(litBasicImpl, "myBasicImpl()", "string", "var")
|
|
|
|
mi = m //@snippet(" //", litBasicImpl, "myBasicImpl($0)", "myBasicImpl($0)")
|
|
|
|
// only satisfied by pointer to myImpl
|
|
type myPtrIntf interface {
|
|
bar()
|
|
}
|
|
|
|
&myImpl{} //@item(litImplPtr, "&myImpl{}", "", "var")
|
|
|
|
var mpi myPtrIntf
|
|
mpi = m //@snippet(" //", litImplPtr, "&myImpl{\\}", "&myImpl{\\}")
|
|
}
|
|
|
|
func _() {
|
|
var s struct{ i []int } //@item(litSliceField, "i", "[]int", "field")
|
|
var foo []int
|
|
// no literal completions after selector
|
|
foo = s.i //@complete(" //", litSliceField)
|
|
}
|
|
|
|
func _() {
|
|
type myStruct struct{ i int } //@item(litStructType, "myStruct", "struct{...}", "struct")
|
|
|
|
foo := func(s string, args ...myStruct) {}
|
|
// Don't give literal slice candidate for variadic arg.
|
|
foo("", myStruct) //@complete(")", litStructType)
|
|
}
|
|
|
|
func _() {
|
|
_ = "func(...) {}" //@item(litFunc, "func(...) {}", "", "var")
|
|
|
|
sort.Slice(nil, f) //@snippet(")", litFunc, "func(i, j int) bool {$0\\}", "func(i, j int) bool {$0\\}")
|
|
|
|
http.HandleFunc("", f) //@snippet(")", litFunc, "", "func(${1:rw} http.ResponseWriter, ${2:r} *http.Request) {$0\\}")
|
|
|
|
// no literal "func" completions
|
|
http.Handle("", fun) //@complete(")")
|
|
|
|
http.HandlerFunc() //@item(handlerFunc, "http.HandlerFunc()", "", "var")
|
|
http.Handle("", h) //@snippet(")", handlerFunc, "http.HandlerFunc($0)", "http.HandlerFunc($0)")
|
|
http.Handle("", http.HandlerFunc()) //@snippet("))", litFunc, "", "func(${1:rw} http.ResponseWriter, ${2:r} *http.Request) {$0\\}")
|
|
|
|
var namedReturn func(s string) (b bool)
|
|
namedReturn = f //@snippet(" //", litFunc, "func(s string) (b bool) {$0\\}", "func(s string) (b bool) {$0\\}")
|
|
|
|
var multiReturn func() (bool, int)
|
|
multiReturn = f //@snippet(" //", litFunc, "func() (bool, int) {$0\\}", "func() (bool, int) {$0\\}")
|
|
|
|
var multiNamedReturn func() (b bool, i int)
|
|
multiNamedReturn = f //@snippet(" //", litFunc, "func() (b bool, i int) {$0\\}", "func() (b bool, i int) {$0\\}")
|
|
|
|
var duplicateParams func(myImpl, int, myImpl)
|
|
duplicateParams = f //@snippet(" //", litFunc, "", "func(${1:mi} myImpl, ${2:_} int, ${3:_} myImpl) {$0\\}")
|
|
}
|
|
|
|
func _() {
|
|
StructFoo{} //@item(litStructFoo, "StructFoo{}", "struct{...}", "struct")
|
|
|
|
var sfp *foo.StructFoo
|
|
// Don't insert the "&" before "StructFoo{}".
|
|
sfp = foo.Str //@snippet(" //", litStructFoo, "StructFoo{$0\\}", "StructFoo{$0\\}")
|
|
|
|
var sf foo.StructFoo
|
|
sf = foo.Str //@snippet(" //", litStructFoo, "StructFoo{$0\\}", "StructFoo{$0\\}")
|
|
sf = foo. //@snippet(" //", litStructFoo, "StructFoo{$0\\}", "StructFoo{$0\\}")
|
|
}
|