summaryrefslogtreecommitdiff
path: root/gocomplete
diff options
context:
space:
mode:
authorEyal Posener <[email protected]>2017-05-06 00:25:27 +0300
committerEyal Posener <[email protected]>2017-05-06 00:25:27 +0300
commit1af7c0b3b7bc0e4bf5605be7e02154a8876cba84 (patch)
treebb3220c9de676f16970ffb7c204aa3377194661f /gocomplete
parentc8263230e11aa755d3b0b964d4bf7ff296661f5e (diff)
Roughly add all go commands
Diffstat (limited to 'gocomplete')
-rw-r--r--gocomplete/complete.go178
-rw-r--r--gocomplete/tests.go57
2 files changed, 223 insertions, 12 deletions
diff --git a/gocomplete/complete.go b/gocomplete/complete.go
index 9233b4e..57fbaa1 100644
--- a/gocomplete/complete.go
+++ b/gocomplete/complete.go
@@ -4,33 +4,187 @@ import (
"github.com/posener/complete"
)
-var (
- build = complete.Command{
+var predictEllipsis = complete.Predicate{
+ Predictor: func() []complete.Option { return []complete.Option{complete.Arg("./...")} },
+}
+
+var goFilesOrPackages = complete.PredictFiles("**.go").
+ Or(complete.PredictDirs("./")).
+ Or(predictEllipsis)
+
+func main() {
+ build := complete.Command{
Flags: complete.Flags{
- "-o": complete.PredictFiles("*"),
+ "-o": complete.PredictFiles("**"),
"-i": complete.PredictNothing,
+
+ "-a": complete.PredictNothing,
+ "-n": complete.PredictNothing,
+ "-p": complete.PredictAnything,
+ "-race": complete.PredictNothing,
+ "-msan": complete.PredictNothing,
+ "-v": complete.PredictNothing,
+ "-work": complete.PredictNothing,
+ "-x": complete.PredictNothing,
+ "-asmflags": complete.PredictAnything,
+ "-buildmode": complete.PredictAnything,
+ "-compiler": complete.PredictAnything,
+ "-gccgoflags": complete.PredictAnything,
+ "-gcflags": complete.PredictAnything,
+ "-installsuffix": complete.PredictAnything,
+ "-ldflags": complete.PredictAnything,
+ "-linkshared": complete.PredictNothing,
+ "-pkgdir": complete.PredictDirs("./"),
+ "-tags": complete.PredictAnything,
+ "-toolexec": complete.PredictAnything,
},
- Args: complete.PredictFiles("**.go").Or(complete.PredictDirs("./")),
+ Args: goFilesOrPackages,
}
- test = complete.Command{
+ run := complete.Command{
Flags: complete.Flags{
- "-run": complete.PredictAnything,
- "-count": complete.PredictAnything,
+ "-exec": complete.PredictAnything,
},
+ Args: complete.PredictFiles("**.go"),
}
- gogo = complete.Command{
+ test := complete.Command{
+ Flags: complete.Flags{
+ "-args": complete.PredictAnything,
+ "-c": complete.PredictNothing,
+ "-exec": complete.PredictAnything,
+
+ "-bench": predictTest("Benchmark"),
+ "-benchtime": complete.PredictAnything,
+ "-count": complete.PredictAnything,
+ "-cover": complete.PredictNothing,
+ "-covermode": complete.PredictSet([]string{"set", "count", "atomic"}),
+ "-coverpkg": complete.PredictDirs("./"),
+ "-cpu": complete.PredictAnything,
+ "-run": predictTest("test"),
+ "-short": complete.PredictNothing,
+ "-timeout": complete.PredictAnything,
+
+ "-benchmem": complete.PredictNothing,
+ "-blockprofile": complete.PredictFiles("**.out"),
+ "-blockprofilerate": complete.PredictAnything,
+ "-coverprofile": complete.PredictFiles("**.out"),
+ "-cpuprofile": complete.PredictFiles("**.out"),
+ "-memprofile": complete.PredictFiles("**.out"),
+ "-memprofilerate": complete.PredictAnything,
+ "-mutexprofile": complete.PredictFiles("**.out"),
+ "-mutexprofilefraction": complete.PredictAnything,
+ "-outputdir": complete.PredictDirs("./"),
+ "-trace": complete.PredictFiles("**.out"),
+ },
+ Args: goFilesOrPackages,
+ }
+
+ fmt := complete.Command{
+ Flags: complete.Flags{
+ "-n": complete.PredictNothing,
+ "-x": complete.PredictNothing,
+ },
+ Args: goFilesOrPackages,
+ }
+
+ get := complete.Command{
+ Flags: complete.Flags{
+ "-d": complete.PredictNothing,
+ "-f": complete.PredictNothing,
+ "-fix": complete.PredictNothing,
+ "-insecure": complete.PredictNothing,
+ "-t": complete.PredictNothing,
+ "-u": complete.PredictNothing,
+ },
+ Args: goFilesOrPackages,
+ }
+
+ generate := complete.Command{
+ Flags: complete.Flags{
+ "-n": complete.PredictNothing,
+ "-x": complete.PredictNothing,
+ "-v": complete.PredictNothing,
+ "-run": complete.PredictAnything,
+ },
+ Args: goFilesOrPackages,
+ }
+
+ vet := complete.Command{
+ Flags: complete.Flags{
+ "-n": complete.PredictNothing,
+ "-x": complete.PredictNothing,
+ },
+ Args: complete.PredictDirs("./"),
+ }
+
+ list := complete.Command{
+ Flags: complete.Flags{
+ "-e": complete.PredictNothing,
+ "-f": complete.PredictAnything,
+ "-json": complete.PredictNothing,
+ },
+ Args: complete.PredictDirs("./"),
+ }
+
+ tool := complete.Command{
+ Flags: complete.Flags{
+ "-n": complete.PredictNothing,
+ },
+ Args: complete.PredictAnything,
+ }
+
+ clean := complete.Command{
+ Flags: complete.Flags{
+ "-i": complete.PredictNothing,
+ "-r": complete.PredictNothing,
+ "-n": complete.PredictNothing,
+ "-x": complete.PredictNothing,
+ },
+ Args: complete.PredictDirs("./"),
+ }
+
+ env := complete.Command{
+ Args: complete.PredictAnything,
+ }
+
+ bug := complete.Command{}
+ version := complete.Command{}
+
+ fix := complete.Command{
+ Args: complete.PredictDirs("./"),
+ }
+
+ // commands that also accepts the build flags
+ for name, options := range build.Flags {
+ test.Flags[name] = options
+ run.Flags[name] = options
+ list.Flags[name] = options
+ vet.Flags[name] = options
+ }
+
+ gogo := complete.Command{
Sub: complete.Commands{
- "build": build,
- "test": test,
+ "build": build,
+ "install": build, // install and build have the same flags
+ "run": run,
+ "test": test,
+ "fmt": fmt,
+ "get": get,
+ "generate": generate,
+ "vet": vet,
+ "list": list,
+ "tool": tool,
+ "clean": clean,
+ "env": env,
+ "bug": bug,
+ "fix": fix,
+ "version": version,
},
Flags: complete.Flags{
"-h": complete.PredictNothing,
},
}
-)
-func main() {
complete.New(gogo).Complete()
}
diff --git a/gocomplete/tests.go b/gocomplete/tests.go
new file mode 100644
index 0000000..388b7b7
--- /dev/null
+++ b/gocomplete/tests.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/posener/complete"
+)
+
+func predictTest(testType string) complete.Predicate {
+ return complete.Predicate{
+ Predictor: func() []complete.Option {
+ tests := testNames(testType)
+ options := make([]complete.Option, len(tests))
+ for i := range tests {
+ options[i] = complete.Arg(tests[i])
+ }
+ return options
+ },
+ }
+}
+
+// get all test names in current directory
+func testNames(testType string) (tests []string) {
+ filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
+ // if not a test file, skip
+ if !strings.HasSuffix(path, "_test.go") {
+ return nil
+ }
+ // inspect test file and append all the test names
+ tests = append(tests, testsInFile(testType, path)...)
+ return nil
+ })
+ return
+}
+
+func testsInFile(testType, path string) (tests []string) {
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, path, nil, 0)
+ if err != nil {
+ complete.Log("Failed parsing %s: %s", path, err)
+ return nil
+ }
+ for _, d := range f.Decls {
+ if f, ok := d.(*ast.FuncDecl); ok {
+ name := f.Name.String()
+ if strings.HasPrefix(name, testType) {
+ tests = append(tests, name)
+ }
+ }
+ }
+ return
+}