diff options
Diffstat (limited to 'gocomplete/pkgs.go')
| -rw-r--r-- | gocomplete/pkgs.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gocomplete/pkgs.go b/gocomplete/pkgs.go new file mode 100644 index 0000000..b223ea9 --- /dev/null +++ b/gocomplete/pkgs.go @@ -0,0 +1,50 @@ +package main + +import ( + "bytes" + "encoding/json" + "os/exec" + "strings" + + "github.com/posener/complete" +) + +const goListFormat = `'{"name": "{{.Name}}", "dir": "{{.Dir}}"}'` + +func predictPackages(packageName string) complete.Predictor { + return complete.PredictFunc(func(a complete.Args) (prediction []string) { + dir := a.Directory() + dir = strings.TrimRight(dir, "/.") + "/..." + + pkgs := listPackages(dir) + + files := make([]string, 0, len(pkgs)) + for _, p := range pkgs { + if packageName != "" && p.Name != packageName { + continue + } + files = append(files, p.Path) + } + return complete.PredictFilesSet(files).Predict(a) + }) +} + +type pack struct { + Name string + Path string +} + +func listPackages(dir string) (pkgs []pack) { + out, err := exec.Command("go", "list", "-f", goListFormat, dir).Output() + if err != nil { + return + } + lines := bytes.Split(out, []byte("\n")) + for _, line := range lines { + var p pack + if err := json.Unmarshal(line, &p); err == nil { + pkgs = append(pkgs, p) + } + } + return +} |
