diff options
Diffstat (limited to 'usr/gri/pretty/gofmt.go')
| -rw-r--r-- | usr/gri/pretty/gofmt.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/usr/gri/pretty/gofmt.go b/usr/gri/pretty/gofmt.go new file mode 100644 index 000000000..73f9d8e23 --- /dev/null +++ b/usr/gri/pretty/gofmt.go @@ -0,0 +1,107 @@ +// Copyright 2009 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 main + +import ( + "flag"; + "fmt"; + "go/parser"; + "go/printer"; + "io"; + "os"; + "sort"; + "tabwriter"; +) + + +var ( + // operation modes + silent = flag.Bool("s", false, "silent mode: parsing only"); + verbose = flag.Bool("v", false, "verbose mode: trace parsing"); + exports = flag.Bool("x", false, "show exports only"); + + // layout control + tabwidth = flag.Int("tabwidth", 4, "tab width"); + usetabs = flag.Bool("tabs", false, "align with tabs instead of blanks"); + optcommas = flag.Bool("optcommas", false, "print optional commas"); + optsemis = flag.Bool("optsemis", false, "print optional semicolons"); +) + + +func usage() { + fmt.Fprintf(os.Stderr, "usage: gofmt [flags] [file.go]\n"); + flag.PrintDefaults(); + os.Exit(1); +} + + +func parserMode() uint { + mode := parser.ParseComments; + if *verbose { + mode |= parser.Trace; + } + return mode; +} + + +func printerMode() uint { + mode := uint(0); + if *exports { + mode |= printer.ExportsOnly; + } + if *optcommas { + mode |= printer.OptCommas; + } + if *optsemis { + mode |= printer.OptSemis; + } + return mode; +} + + +func makeTabwriter(writer io.Writer) *tabwriter.Writer { + padchar := byte(' '); + if *usetabs { + padchar = '\t'; + } + return tabwriter.NewWriter(writer, *tabwidth, 1, padchar, 0); +} + + +func main() { + flag.Parse(); + + var filename string; + switch flag.NArg() { + case 0: filename = "/dev/stdin"; + case 1: filename = flag.Arg(0); + default: usage(); + } + + src, err := io.ReadFile(filename); + if err != nil { + fmt.Fprintf(os.Stderr, "%s: %v\n", filename, err); + os.Exit(1); + } + + prog, err := parser.Parse(src, parserMode()); + if err != nil { + if errors, ok := err.(parser.ErrorList); ok { + sort.Sort(errors); + for _, e := range errors { + fmt.Fprintf(os.Stderr, "%s:%v\n", filename, e); + } + } else { + fmt.Fprintf(os.Stderr, "%s: %v\n", filename, err); + } + os.Exit(1); + } + + if !*silent { + w := makeTabwriter(os.Stdout); + printer.Fprint(w, prog, printerMode()); + w.Flush(); + } +} |
