mdempsky / gocode

An autocompletion daemon for the Go programming language

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

No code completions offered

myitcv opened this issue · comments

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

I can confirm that this issue is resolved in gopls, so I will close this issue.