No code completions offered
myitcv opened this issue · comments
Paul Jolly commented
I'm unclear on what causes completions not to be offered in the case below, hence I can't really reduce it down to a smaller test case (run within a Docker container to remove any conflict with pre-existing gocode instances):
$ export GOPATH=/tmp/tmp.SyFTUbXR6k
$ cd /tmp/tmp.bTi1vLg9Uo
$ mkdir -p src/example.com/hello
$ cd src/example.com/hello
$ export GOBIN=/tmp/tmp.bTi1vLg9Uo/src/example.com/hello/.bin
$ export PATH=/tmp/tmp.bTi1vLg9Uo/src/example.com/hello/.bin:/root/bin:/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo "package main" >pkg.go
$ go get github.com/mdempsky/gocode
$ pushd /tmp/tmp.bTi1vLg9Uo/src/github.com/mdempsky/gocode
/tmp/tmp.bTi1vLg9Uo/src/github.com/mdempsky/gocode /tmp/tmp.bTi1vLg9Uo/src/example.com/hello
$ git checkout 00e7f5ac290aeb20a3d8d31e737ae560a191a1d5
HEAD is now at 00e7f5a... internal/suggest: remove unnecessary candidates field
$ go install
$ popd
/tmp/tmp.bTi1vLg9Uo/src/example.com/hello
$ echo 'cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZsYWciCgkiZm10IgoJImdvL3R5cGVzIgoJIm9zIgoK
CSJnb2xhbmcub3JnL3gvdG9vbHMvZ28vcGFja2FnZXMiCikKCnR5cGUgRnJ1aXQgc3RydWN0IHsK
CU5hbWUgc3RyaW5nIGBoZWxsbzoid29ybGQiYAoJQWdlICBpbnQKfQoKdmFyIEJhbmFuYSAqRnJ1
aXQKCmZ1bmMgbWFpbigpIHsKCWZsYWcuUGFyc2UoKQoKCS8vIE1hbnkgdG9vbHMgcGFzcyB0aGVp
ciBjb21tYW5kLWxpbmUgYXJndW1lbnRzIChhZnRlciBhbnkgZmxhZ3MpCgkvLyB1bmludGVycHJl
dGVkIHRvIHBhY2thZ2VzLkxvYWQgc28gdGhhdCBpdCBjYW4gaW50ZXJwcmV0IHRoZW0KCS8vIGFj
Y29yZGluZyB0byB0aGUgY29udmVudGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgYnVpbGQgc3lzdGVt
LgoJY2ZnIDo9ICZwYWNrYWdlcy5Db25maWd7TW9kZTogcGFja2FnZXMuTG9hZFR5cGVzfQoJcGtn
cywgZXJyIDo9IHBhY2thZ2VzLkxvYWQoY2ZnLCBmbGFnLkFyZ3MoKS4uLikKCWlmIGVyciAhPSBu
aWwgewoJCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgImxvYWQ6ICV2XG4iLCBlcnIpCgkJb3MuRXhp
dCgxKQoJfQoJaWYgcGFja2FnZXMuUHJpbnRFcnJvcnMocGtncykgPiAwIHsKCQlvcy5FeGl0KDEp
Cgl9CgoJcGtnIDo9IHBrZ3NbMF0KCgliYW5hbmEgOj0gcGtnLlR5cGVzLlNjb3BlKCkuTG9va3Vw
KCJCYW5hbmEiKQoKCWZtdC5QcmludGYoIiVUIDo6ICV2XG4iLCBiYW5hbmEuVHlwZSgpLCBiYW5h
bmEuVHlwZSgpKQoKCXggOj0gYmFuYW5hLlR5cGUoKS4oKnR5cGVzLlBvaW50ZXIpLkVsZW0oKS4o
KnR5cGVzLk5hbWVkKS5PYmooKS4KCWZtdC5QcmludGYoIiVUIDo6ICV2XG4iLCB4LCB4KQp9Cg==' | base64 --decode >main.go
$ cat main.go
package main
import (
"flag"
"fmt"
"go/types"
"os"
"golang.org/x/tools/go/packages"
)
type Fruit struct {
Name string `hello:"world"`
Age int
}
var Banana *Fruit
func main() {
flag.Parse()
// Many tools pass their command-line arguments (after any flags)
// uninterpreted to packages.Load so that it can interpret them
// according to the conventions of the underlying build system.
cfg := &packages.Config{Mode: packages.LoadTypes}
pkgs, err := packages.Load(cfg, flag.Args()...)
if err != nil {
fmt.Fprintf(os.Stderr, "load: %v\n", err)
os.Exit(1)
}
if packages.PrintErrors(pkgs) > 0 {
os.Exit(1)
}
pkg := pkgs[0]
banana := pkg.Types.Scope().Lookup("Banana")
fmt.Printf("%T :: %v\n", banana.Type(), banana.Type())
x := banana.Type().(*types.Pointer).Elem().(*types.Named).Obj().
fmt.Printf("%T :: %v\n", x, x)
}
$ offset=812
$ tail -c +812 main.go
.Obj().
fmt.Printf("%T :: %v\n", x, x)
}
$ gocode -in /tmp/tmp.bTi1vLg9Uo/src/example.com/hello/main.go autocomplete /tmp/tmp.bTi1vLg9Uo/src/example.com/hello/main.go 812
Found 7 candidates:
func AddMethod(m *types.Func)
func Method(i int) *types.Func
func NumMethods() int
func Obj() *types.TypeName
func SetUnderlying(underlying types.Type)
func String() string
func Underlying() types.Type
$ offset=818
$ tail -c +818 main.go
.
fmt.Printf("%T :: %v\n", x, x)
}
$ gocode -in /tmp/tmp.bTi1vLg9Uo/src/example.com/hello/main.go autocomplete /tmp/tmp.bTi1vLg9Uo/src/example.com/hello/main.go 818
Nothing to complete.
It doesn't appear to be anything to do with the completion being attempt at a line end because:
$ echo 'cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImZsYWciCgkiZm10IgoJImdvL3R5cGVzIgoJIm9zIgoK
CSJnb2xhbmcub3JnL3gvdG9vbHMvZ28vcGFja2FnZXMiCikKCnR5cGUgRnJ1aXQgc3RydWN0IHsK
CU5hbWUgc3RyaW5nIGBoZWxsbzoid29ybGQiYAoJQWdlICBpbnQKfQoKdmFyIEJhbmFuYSAqRnJ1
aXQKCmZ1bmMgbWFpbigpIHsKCWZsYWcuUGFyc2UoKQoKCS8vIE1hbnkgdG9vbHMgcGFzcyB0aGVp
ciBjb21tYW5kLWxpbmUgYXJndW1lbnRzIChhZnRlciBhbnkgZmxhZ3MpCgkvLyB1bmludGVycHJl
dGVkIHRvIHBhY2thZ2VzLkxvYWQgc28gdGhhdCBpdCBjYW4gaW50ZXJwcmV0IHRoZW0KCS8vIGFj
Y29yZGluZyB0byB0aGUgY29udmVudGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgYnVpbGQgc3lzdGVt
LgoJY2ZnIDo9ICZwYWNrYWdlcy5Db25maWd7TW9kZTogcGFja2FnZXMuTG9hZFR5cGVzfQoJcGtn
cywgZXJyIDo9IHBhY2thZ2VzLkxvYWQoY2ZnLCBmbGFnLkFyZ3MoKS4uLikKCWlmIGVyciAhPSBu
aWwgewoJCWZtdC5GcHJpbnRmKG9zLlN0ZGVyciwgImxvYWQ6ICV2XG4iLCBlcnIpCgkJb3MuRXhp
dCgxKQoJfQoJaWYgcGFja2FnZXMuUHJpbnRFcnJvcnMocGtncykgPiAwIHsKCQlvcy5FeGl0KDEp
Cgl9CgoJcGtnIDo9IHBrZ3NbMF0KCgliYW5hbmEgOj0gcGtnLlR5cGVzLlNjb3BlKCkuTG9va3Vw
KCJCYW5hbmEiKQoKCWZtdC5QcmludGYoIiVUIDo6ICV2XG4iLCBiYW5hbmEuVHlwZSgpLCBiYW5h
bmEuVHlwZSgpKQoKCXggOj0gYmFuYW5hLlR5cGUoKS4oKnR5cGVzLlBvaW50ZXIpLkVsZW0oKS4o
KnR5cGVzLk5hbWVkKS4KCWZtdC5QcmludGYoIiVUIDo6ICV2XG4iLCB4LCB4KQp9Cg==' | base64 --decode >main.go
$ cat main.go
package main
import (
"flag"
"fmt"
"go/types"
"os"
"golang.org/x/tools/go/packages"
)
type Fruit struct {
Name string `hello:"world"`
Age int
}
var Banana *Fruit
func main() {
flag.Parse()
// Many tools pass their command-line arguments (after any flags)
// uninterpreted to packages.Load so that it can interpret them
// according to the conventions of the underlying build system.
cfg := &packages.Config{Mode: packages.LoadTypes}
pkgs, err := packages.Load(cfg, flag.Args()...)
if err != nil {
fmt.Fprintf(os.Stderr, "load: %v\n", err)
os.Exit(1)
}
if packages.PrintErrors(pkgs) > 0 {
os.Exit(1)
}
pkg := pkgs[0]
banana := pkg.Types.Scope().Lookup("Banana")
fmt.Printf("%T :: %v\n", banana.Type(), banana.Type())
x := banana.Type().(*types.Pointer).Elem().(*types.Named).
fmt.Printf("%T :: %v\n", x, x)
}
$ offset=812
$ tail -c +812 main.go
.
fmt.Printf("%T :: %v\n", x, x)
}
$ gocode -in /tmp/tmp.jbHDztmOya/src/example.com/hello/main.go autocomplete /tmp/tmp.jbHDztmOya/src/example.com/hello/main.go 812
Found 7 candidates:
func AddMethod(m *types.Func)
func Method(i int) *types.Func
func NumMethods() int
func Obj() *types.TypeName
func SetUnderlying(underlying types.Type)
func String() string
func Underlying() types.Type
Fully repro script can be found here:
https://gist.github.com/myitcv/a8977ab43dccf7a9c425ffde372c1e11
Rebecca Stambler commented
I can confirm that this issue is resolved in gopls
, so I will close this issue.