diff options
| author | Eyal Posener <[email protected]> | 2017-05-06 00:25:27 +0300 |
|---|---|---|
| committer | Eyal Posener <[email protected]> | 2017-05-06 00:25:27 +0300 |
| commit | 1af7c0b3b7bc0e4bf5605be7e02154a8876cba84 (patch) | |
| tree | bb3220c9de676f16970ffb7c204aa3377194661f /gocomplete | |
| parent | c8263230e11aa755d3b0b964d4bf7ff296661f5e (diff) | |
Roughly add all go commands
Diffstat (limited to 'gocomplete')
| -rw-r--r-- | gocomplete/complete.go | 178 | ||||
| -rw-r--r-- | gocomplete/tests.go | 57 |
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 +} |
