// doQuery poses query q to the oracle 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" res, err := oracle.Query([]string{q.filename}, q.verb, q.queryPos, nil, // ptalog, &buildContext, true) // reflection if err != nil { fmt.Fprintf(out, "\nError: %s\n", err) return } if useJson { // JSON output b, err := json.MarshalIndent(res.Serial(), "", "\t") if err != nil { fmt.Fprintf(out, "JSON error: %s\n", err.Error()) return } out.Write(b) } else { // "plain" (compiler diagnostic format) output WriteResult(out, res) } }
func main() { // Don't print full help unless -help was requested. // Just gently remind users that it's there. flag.Usage = func() { fmt.Fprint(os.Stderr, useHelp) } flag.CommandLine.Init(os.Args[0], flag.ContinueOnError) // hack if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { // (err has already been printed) if err == flag.ErrHelp { printHelp() } os.Exit(2) } args := flag.Args() if len(args) == 0 || args[0] == "" { fmt.Fprint(os.Stderr, "oracle: a mode argument is required.\n"+useHelp) os.Exit(2) } mode := args[0] args = args[1:] if mode == "help" { printHelp() os.Exit(2) } if len(args) == 0 && mode != "what" { fmt.Fprint(os.Stderr, "oracle: no package arguments.\n"+useHelp) os.Exit(2) } // Set up points-to analysis log file. var ptalog io.Writer if *ptalogFlag != "" { if f, err := os.Create(*ptalogFlag); err != nil { log.Fatalf("Failed to create PTA log file: %s", err) } else { buf := bufio.NewWriter(f) ptalog = buf defer func() { if err := buf.Flush(); err != nil { log.Printf("flush: %s", err) } if err := f.Close(); err != nil { log.Printf("close: %s", err) } }() } } // Profiling support. if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } // -format flag switch *formatFlag { case "json", "plain", "xml": // ok default: fmt.Fprintf(os.Stderr, "oracle: illegal -format value: %q.\n"+useHelp, *formatFlag) os.Exit(2) } // Ask the oracle. res, err := oracle.Query(args, mode, *posFlag, ptalog, &build.Default, *reflectFlag) if err != nil { fmt.Fprintf(os.Stderr, "oracle: %s.\n", err) os.Exit(1) } // Print the result. switch *formatFlag { case "json": b, err := json.MarshalIndent(res.Serial(), "", "\t") if err != nil { fmt.Fprintf(os.Stderr, "oracle: JSON error: %s.\n", err) os.Exit(1) } os.Stdout.Write(b) case "xml": b, err := xml.MarshalIndent(res.Serial(), "", "\t") if err != nil { fmt.Fprintf(os.Stderr, "oracle: XML error: %s.\n", err) os.Exit(1) } os.Stdout.Write(b) case "plain": res.WriteTo(os.Stdout) } }