| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package cmd |
| |
| import ( |
| "context" |
| "flag" |
| "fmt" |
| |
| "golang.org/x/tools/internal/tool" |
| ) |
| |
| const ( |
| // The set of possible options that can be passed through the -emulate flag, |
| // which causes query to adjust its output to match that of the binary being |
| // emulated. |
| |
| // emulateGuru tells query to emulate the output format of the guru tool. |
| emulateGuru = "guru" |
| ) |
| |
| // query implements the query command. |
| type query struct { |
| JSON bool `flag:"json" help:"emit output in JSON format"` |
| MarkdownSupported bool `flag:"markdown" help:"support markdown in responses"` |
| Emulate string `flag:"emulate" help:"compatibility mode, causes gopls to emulate another tool.\nvalues depend on the operation being performed"` |
| |
| app *Application |
| } |
| |
| func (q *query) Name() string { return "query" } |
| func (q *query) Usage() string { return "<mode> <mode args>" } |
| func (q *query) ShortHelp() string { |
| return "answer queries about go source code" |
| } |
| func (q *query) DetailedHelp(f *flag.FlagSet) { |
| fmt.Fprint(f.Output(), ` |
| The mode argument determines the query to perform: |
| `) |
| for _, m := range q.modes() { |
| fmt.Fprintf(f.Output(), " %s : %v\n", m.Name(), m.ShortHelp()) |
| } |
| fmt.Fprint(f.Output(), ` |
| query flags are: |
| `) |
| f.PrintDefaults() |
| } |
| |
| // Run takes the args after command flag processing, and invokes the correct |
| // query mode as specified by the first argument. |
| func (q *query) Run(ctx context.Context, args ...string) error { |
| if len(args) == 0 { |
| return tool.CommandLineErrorf("query must be supplied a mode") |
| } |
| mode, args := args[0], args[1:] |
| for _, m := range q.modes() { |
| if m.Name() == mode { |
| return tool.Run(ctx, m, args) // pass errors up the chain |
| } |
| } |
| return tool.CommandLineErrorf("unknown command %v", mode) |
| } |
| |
| // modes returns the set of modes supported by the query command. |
| func (q *query) modes() []tool.Application { |
| return []tool.Application{ |
| &definition{query: q}, |
| } |
| } |