mirror of https://github.com/golang/go.git
108 lines
2.0 KiB
Go
108 lines
2.0 KiB
Go
// 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();
|
|
}
|
|
}
|