github.com/jduhamel/gcli@v0.2.4-0.20151019142748-0d5307cd7e21/helper/gofmt.go (about) 1 package helper 2 3 import ( 4 "bytes" 5 "go/ast" 6 "go/parser" 7 "go/printer" 8 "go/token" 9 "io" 10 "io/ioutil" 11 "os" 12 ) 13 14 // GoFmt runs `gofmt` to io.Reader and save it as file 15 // If something wrong it returns error. 16 func GoFmt(filename string, in io.Reader) error { 17 18 if in == nil { 19 f, err := os.Open(filename) 20 if err != nil { 21 return err 22 } 23 defer f.Close() 24 in = f 25 } 26 27 src, err := ioutil.ReadAll(in) 28 if err != nil { 29 return err 30 } 31 fileSet := token.NewFileSet() 32 file, err := parser.ParseFile(fileSet, filename, src, parser.ParseComments) 33 if err != nil { 34 return err 35 } 36 37 ast.SortImports(fileSet, file) 38 39 var buf bytes.Buffer 40 tabWidth := 8 41 printerMode := printer.UseSpaces | printer.TabIndent 42 err = (&printer.Config{Mode: printerMode, Tabwidth: tabWidth}).Fprint(&buf, fileSet, file) 43 if err != nil { 44 return err 45 } 46 47 res := buf.Bytes() 48 if !bytes.Equal(src, res) { 49 err = ioutil.WriteFile(filename, res, 0) 50 if err != nil { 51 return err 52 } 53 } 54 return nil 55 }