1// Package main is complete tool for the go command line
2package main
3
4import "github.com/posener/complete"
5
6var (
7	ellipsis   = complete.PredictSet("./...")
8	anyPackage = complete.PredictFunc(predictPackages)
9	goFiles    = complete.PredictFiles("*.go")
10	anyFile    = complete.PredictFiles("*")
11	anyGo      = complete.PredictOr(goFiles, anyPackage, ellipsis)
12)
13
14func main() {
15	build := complete.Command{
16		Flags: complete.Flags{
17			"-o": anyFile,
18			"-i": complete.PredictNothing,
19
20			"-a":             complete.PredictNothing,
21			"-n":             complete.PredictNothing,
22			"-p":             complete.PredictAnything,
23			"-race":          complete.PredictNothing,
24			"-msan":          complete.PredictNothing,
25			"-v":             complete.PredictNothing,
26			"-work":          complete.PredictNothing,
27			"-x":             complete.PredictNothing,
28			"-asmflags":      complete.PredictAnything,
29			"-buildmode":     complete.PredictAnything,
30			"-compiler":      complete.PredictAnything,
31			"-gccgoflags":    complete.PredictSet("gccgo", "gc"),
32			"-gcflags":       complete.PredictAnything,
33			"-installsuffix": complete.PredictAnything,
34			"-ldflags":       complete.PredictAnything,
35			"-linkshared":    complete.PredictNothing,
36			"-pkgdir":        anyPackage,
37			"-tags":          complete.PredictAnything,
38			"-toolexec":      complete.PredictAnything,
39		},
40		Args: anyGo,
41	}
42
43	run := complete.Command{
44		Flags: complete.Flags{
45			"-exec": complete.PredictAnything,
46		},
47		Args: goFiles,
48	}
49
50	test := complete.Command{
51		Flags: complete.Flags{
52			"-args": complete.PredictAnything,
53			"-c":    complete.PredictNothing,
54			"-exec": complete.PredictAnything,
55
56			"-bench":     predictBenchmark,
57			"-benchtime": complete.PredictAnything,
58			"-count":     complete.PredictAnything,
59			"-cover":     complete.PredictNothing,
60			"-covermode": complete.PredictSet("set", "count", "atomic"),
61			"-coverpkg":  complete.PredictDirs("*"),
62			"-cpu":       complete.PredictAnything,
63			"-run":       predictTest,
64			"-short":     complete.PredictNothing,
65			"-timeout":   complete.PredictAnything,
66
67			"-benchmem":             complete.PredictNothing,
68			"-blockprofile":         complete.PredictFiles("*.out"),
69			"-blockprofilerate":     complete.PredictAnything,
70			"-coverprofile":         complete.PredictFiles("*.out"),
71			"-cpuprofile":           complete.PredictFiles("*.out"),
72			"-memprofile":           complete.PredictFiles("*.out"),
73			"-memprofilerate":       complete.PredictAnything,
74			"-mutexprofile":         complete.PredictFiles("*.out"),
75			"-mutexprofilefraction": complete.PredictAnything,
76			"-outputdir":            complete.PredictDirs("*"),
77			"-trace":                complete.PredictFiles("*.out"),
78		},
79		Args: anyGo,
80	}
81
82	fmt := complete.Command{
83		Flags: complete.Flags{
84			"-n": complete.PredictNothing,
85			"-x": complete.PredictNothing,
86		},
87		Args: anyGo,
88	}
89
90	get := complete.Command{
91		Flags: complete.Flags{
92			"-d":        complete.PredictNothing,
93			"-f":        complete.PredictNothing,
94			"-fix":      complete.PredictNothing,
95			"-insecure": complete.PredictNothing,
96			"-t":        complete.PredictNothing,
97			"-u":        complete.PredictNothing,
98		},
99		Args: anyGo,
100	}
101
102	generate := complete.Command{
103		Flags: complete.Flags{
104			"-n":   complete.PredictNothing,
105			"-x":   complete.PredictNothing,
106			"-v":   complete.PredictNothing,
107			"-run": complete.PredictAnything,
108		},
109		Args: anyGo,
110	}
111
112	vet := complete.Command{
113		Flags: complete.Flags{
114			"-n": complete.PredictNothing,
115			"-x": complete.PredictNothing,
116		},
117		Args: anyGo,
118	}
119
120	list := complete.Command{
121		Flags: complete.Flags{
122			"-e":    complete.PredictNothing,
123			"-f":    complete.PredictAnything,
124			"-json": complete.PredictNothing,
125		},
126		Args: complete.PredictOr(anyPackage, ellipsis),
127	}
128
129	doc := complete.Command{
130		Flags: complete.Flags{
131			"-c":   complete.PredictNothing,
132			"-cmd": complete.PredictNothing,
133			"-u":   complete.PredictNothing,
134		},
135		Args: anyPackage,
136	}
137
138	tool := complete.Command{
139		Flags: complete.Flags{
140			"-n": complete.PredictNothing,
141		},
142		Sub: complete.Commands{
143			"addr2line": {
144				Args: anyFile,
145			},
146			"asm": {
147				Flags: complete.Flags{
148					"-D":        complete.PredictAnything,
149					"-I":        complete.PredictDirs("*"),
150					"-S":        complete.PredictNothing,
151					"-debug":    complete.PredictNothing,
152					"-dynlink":  complete.PredictNothing,
153					"-e":        complete.PredictNothing,
154					"-o":        anyFile,
155					"-shared":   complete.PredictNothing,
156					"-trimpath": complete.PredictNothing,
157				},
158				Args: complete.PredictFiles("*.s"),
159			},
160			"cgo": {
161				Flags: complete.Flags{
162					"-debug-define":      complete.PredictNothing,
163					"debug-gcc":          complete.PredictNothing,
164					"dynimport":          anyFile,
165					"dynlinker":          complete.PredictNothing,
166					"dynout":             anyFile,
167					"dynpackage":         anyPackage,
168					"exportheader":       complete.PredictDirs("*"),
169					"gccgo":              complete.PredictNothing,
170					"gccgopkgpath":       complete.PredictDirs("*"),
171					"gccgoprefix":        complete.PredictAnything,
172					"godefs":             complete.PredictNothing,
173					"import_runtime_cgo": complete.PredictNothing,
174					"import_syscall":     complete.PredictNothing,
175					"importpath":         complete.PredictDirs("*"),
176					"objdir":             complete.PredictDirs("*"),
177					"srcdir":             complete.PredictDirs("*"),
178				},
179				Args: goFiles,
180			},
181			"compile": {
182				Flags: complete.Flags{
183					"-%":              complete.PredictNothing,
184					"-+":              complete.PredictNothing,
185					"-B":              complete.PredictNothing,
186					"-D":              complete.PredictDirs("*"),
187					"-E":              complete.PredictNothing,
188					"-I":              complete.PredictDirs("*"),
189					"-K":              complete.PredictNothing,
190					"-N":              complete.PredictNothing,
191					"-S":              complete.PredictNothing,
192					"-V":              complete.PredictNothing,
193					"-W":              complete.PredictNothing,
194					"-asmhdr":         anyFile,
195					"-bench":          anyFile,
196					"-buildid":        complete.PredictNothing,
197					"-complete":       complete.PredictNothing,
198					"-cpuprofile":     anyFile,
199					"-d":              complete.PredictNothing,
200					"-dynlink":        complete.PredictNothing,
201					"-e":              complete.PredictNothing,
202					"-f":              complete.PredictNothing,
203					"-h":              complete.PredictNothing,
204					"-i":              complete.PredictNothing,
205					"-importmap":      complete.PredictAnything,
206					"-installsuffix":  complete.PredictAnything,
207					"-j":              complete.PredictNothing,
208					"-l":              complete.PredictNothing,
209					"-largemodel":     complete.PredictNothing,
210					"-linkobj":        anyFile,
211					"-live":           complete.PredictNothing,
212					"-m":              complete.PredictNothing,
213					"-memprofile":     complete.PredictNothing,
214					"-memprofilerate": complete.PredictAnything,
215					"-msan":           complete.PredictNothing,
216					"-nolocalimports": complete.PredictNothing,
217					"-o":              anyFile,
218					"-p":              complete.PredictDirs("*"),
219					"-pack":           complete.PredictNothing,
220					"-r":              complete.PredictNothing,
221					"-race":           complete.PredictNothing,
222					"-s":              complete.PredictNothing,
223					"-shared":         complete.PredictNothing,
224					"-traceprofile":   anyFile,
225					"-trimpath":       complete.PredictAnything,
226					"-u":              complete.PredictNothing,
227					"-v":              complete.PredictNothing,
228					"-w":              complete.PredictNothing,
229					"-wb":             complete.PredictNothing,
230				},
231				Args: goFiles,
232			},
233			"cover": {
234				Flags: complete.Flags{
235					"-func": complete.PredictAnything,
236					"-html": complete.PredictAnything,
237					"-mode": complete.PredictSet("set", "count", "atomic"),
238					"-o":    anyFile,
239					"-var":  complete.PredictAnything,
240				},
241				Args: anyFile,
242			},
243			"dist": {
244				Sub: complete.Commands{
245					"banner":    {Flags: complete.Flags{"-v": complete.PredictNothing}},
246					"bootstrap": {Flags: complete.Flags{"-v": complete.PredictNothing}},
247					"clean":     {Flags: complete.Flags{"-v": complete.PredictNothing}},
248					"env":       {Flags: complete.Flags{"-v": complete.PredictNothing, "-p": complete.PredictNothing}},
249					"install":   {Flags: complete.Flags{"-v": complete.PredictNothing}, Args: complete.PredictDirs("*")},
250					"list":      {Flags: complete.Flags{"-v": complete.PredictNothing, "-json": complete.PredictNothing}},
251					"test":      {Flags: complete.Flags{"-v": complete.PredictNothing, "-h": complete.PredictNothing}},
252					"version":   {Flags: complete.Flags{"-v": complete.PredictNothing}},
253				},
254			},
255			"doc": doc,
256			"fix": {
257				Flags: complete.Flags{
258					"-diff":  complete.PredictNothing,
259					"-force": complete.PredictAnything,
260					"-r":     complete.PredictSet("context", "gotypes", "netipv6zone", "printerconfig"),
261				},
262				Args: anyGo,
263			},
264			"link": {},
265			"nm": {
266				Flags: complete.Flags{
267					"-n":    complete.PredictNothing,
268					"-size": complete.PredictNothing,
269					"-sort": complete.PredictAnything,
270					"-type": complete.PredictNothing,
271				},
272				Args: anyGo,
273			},
274			"objdump": {
275				Flags: complete.Flags{
276					"-s": complete.PredictAnything,
277				},
278				Args: anyFile,
279			},
280			"pack": {},
281			"pprof": {
282				Flags: complete.Flags{
283					"-callgrind":     complete.PredictNothing,
284					"-disasm":        complete.PredictAnything,
285					"-dot":           complete.PredictNothing,
286					"-eog":           complete.PredictNothing,
287					"-evince":        complete.PredictNothing,
288					"-gif":           complete.PredictNothing,
289					"-gv":            complete.PredictNothing,
290					"-list":          complete.PredictAnything,
291					"-pdf":           complete.PredictNothing,
292					"-peek":          complete.PredictAnything,
293					"-png":           complete.PredictNothing,
294					"-proto":         complete.PredictNothing,
295					"-ps":            complete.PredictNothing,
296					"-raw":           complete.PredictNothing,
297					"-svg":           complete.PredictNothing,
298					"-tags":          complete.PredictNothing,
299					"-text":          complete.PredictNothing,
300					"-top":           complete.PredictNothing,
301					"-tree":          complete.PredictNothing,
302					"-web":           complete.PredictNothing,
303					"-weblist":       complete.PredictAnything,
304					"-output":        anyFile,
305					"-functions":     complete.PredictNothing,
306					"-files":         complete.PredictNothing,
307					"-lines":         complete.PredictNothing,
308					"-addresses":     complete.PredictNothing,
309					"-base":          complete.PredictAnything,
310					"-drop_negative": complete.PredictNothing,
311					"-cum":           complete.PredictNothing,
312					"-seconds":       complete.PredictAnything,
313					"-nodecount":     complete.PredictAnything,
314					"-nodefraction":  complete.PredictAnything,
315					"-edgefraction":  complete.PredictAnything,
316					"-sample_index":  complete.PredictNothing,
317					"-mean":          complete.PredictNothing,
318					"-inuse_space":   complete.PredictNothing,
319					"-inuse_objects": complete.PredictNothing,
320					"-alloc_space":   complete.PredictNothing,
321					"-alloc_objects": complete.PredictNothing,
322					"-total_delay":   complete.PredictNothing,
323					"-contentions":   complete.PredictNothing,
324					"-mean_delay":    complete.PredictNothing,
325					"-runtime":       complete.PredictNothing,
326					"-focus":         complete.PredictAnything,
327					"-ignore":        complete.PredictAnything,
328					"-tagfocus":      complete.PredictAnything,
329					"-tagignore":     complete.PredictAnything,
330					"-call_tree":     complete.PredictNothing,
331					"-unit":          complete.PredictAnything,
332					"-divide_by":     complete.PredictAnything,
333					"-buildid":       complete.PredictAnything,
334					"-tools":         complete.PredictDirs("*"),
335					"-help":          complete.PredictNothing,
336				},
337				Args: anyFile,
338			},
339			"tour": {
340				Flags: complete.Flags{
341					"-http":        complete.PredictAnything,
342					"-openbrowser": complete.PredictNothing,
343				},
344			},
345			"trace": {
346				Flags: complete.Flags{
347					"-http":  complete.PredictAnything,
348					"-pprof": complete.PredictSet("net", "sync", "syscall", "sched"),
349				},
350				Args: anyFile,
351			},
352			"vet": {
353				Flags: complete.Flags{
354					"-all":                 complete.PredictNothing,
355					"-asmdecl":             complete.PredictNothing,
356					"-assign":              complete.PredictNothing,
357					"-atomic":              complete.PredictNothing,
358					"-bool":                complete.PredictNothing,
359					"-buildtags":           complete.PredictNothing,
360					"-cgocall":             complete.PredictNothing,
361					"-composites":          complete.PredictNothing,
362					"-compositewhitelist":  complete.PredictNothing,
363					"-copylocks":           complete.PredictNothing,
364					"-httpresponse":        complete.PredictNothing,
365					"-lostcancel":          complete.PredictNothing,
366					"-methods":             complete.PredictNothing,
367					"-nilfunc":             complete.PredictNothing,
368					"-printf":              complete.PredictNothing,
369					"-printfuncs":          complete.PredictAnything,
370					"-rangeloops":          complete.PredictNothing,
371					"-shadow":              complete.PredictNothing,
372					"-shadowstrict":        complete.PredictNothing,
373					"-shift":               complete.PredictNothing,
374					"-structtags":          complete.PredictNothing,
375					"-tags":                complete.PredictAnything,
376					"-tests":               complete.PredictNothing,
377					"-unreachable":         complete.PredictNothing,
378					"-unsafeptr":           complete.PredictNothing,
379					"-unusedfuncs":         complete.PredictAnything,
380					"-unusedresult":        complete.PredictNothing,
381					"-unusedstringmethods": complete.PredictAnything,
382					"-v": complete.PredictNothing,
383				},
384				Args: anyGo,
385			},
386		},
387	}
388
389	clean := complete.Command{
390		Flags: complete.Flags{
391			"-i": complete.PredictNothing,
392			"-r": complete.PredictNothing,
393			"-n": complete.PredictNothing,
394			"-x": complete.PredictNothing,
395		},
396		Args: complete.PredictOr(anyPackage, ellipsis),
397	}
398
399	env := complete.Command{
400		Args: complete.PredictAnything,
401	}
402
403	bug := complete.Command{}
404	version := complete.Command{}
405
406	fix := complete.Command{
407		Args: anyGo,
408	}
409
410	// commands that also accepts the build flags
411	for name, options := range build.Flags {
412		test.Flags[name] = options
413		run.Flags[name] = options
414		list.Flags[name] = options
415		vet.Flags[name] = options
416		get.Flags[name] = options
417	}
418
419	gogo := complete.Command{
420		Sub: complete.Commands{
421			"build":    build,
422			"install":  build, // install and build have the same flags
423			"run":      run,
424			"test":     test,
425			"fmt":      fmt,
426			"get":      get,
427			"generate": generate,
428			"vet":      vet,
429			"list":     list,
430			"doc":      doc,
431			"tool":     tool,
432			"clean":    clean,
433			"env":      env,
434			"bug":      bug,
435			"fix":      fix,
436			"version":  version,
437		},
438		GlobalFlags: complete.Flags{
439			"-h": complete.PredictNothing,
440		},
441	}
442
443	complete.New("go", gogo).Run()
444}
445