// doQuery poses query q to the guru and writes its response and // error (if any) to out. func doQuery(out io.Writer, q *query, useJson bool) { fmt.Fprintf(out, "-------- @%s %s --------\n", q.verb, q.id) var buildContext = build.Default buildContext.GOPATH = "testdata" query := guru.Query{ Mode: q.verb, Pos: q.queryPos, Build: &buildContext, Scope: []string{q.filename}, Reflection: true, } if err := guru.Run(&query); err != nil { fmt.Fprintf(out, "\nError: %s\n", err) return } if useJson { // JSON output b, err := json.MarshalIndent(query.Serial(), "", "\t") if err != nil { fmt.Fprintf(out, "JSON error: %s\n", err.Error()) return } out.Write(b) fmt.Fprintln(out) } else { // "plain" (compiler diagnostic format) output WriteResult(out, &query) } }
// WriteResult writes res (-format=plain) to w, stripping file locations. func WriteResult(w io.Writer, q *guru.Query) { capture := new(bytes.Buffer) // capture standard output q.WriteTo(capture) for _, line := range strings.Split(capture.String(), "\n") { // Remove a "file:line: " prefix. if i := strings.Index(line, ": "); i >= 0 { line = line[i+2:] } fmt.Fprintf(w, "%s\n", line) } }