1 // Package buildifier provides a Buildifier which doesn't call os.exec. 2 // 3 // There are some programming frameworks which consider os.exec dangerous. 4 // 5 // The package is imported just for its side-effects. For example: 6 // 7 // import _ "github.com/bazelbuild/buildtools/edit/safe/buildifier" 8 package buildifier 9 10 import ( 11 "github.com/bazelbuild/buildtools/build" 12 "github.com/bazelbuild/buildtools/edit" 13 ) 14 15 func init() { 16 edit.RegisterBuildifier(&buildifier{}) 17 } 18 19 type buildifier struct{} 20 21 // runBuildifier formats the build file f using the built-in formatter. 22 func (b *buildifier) Buildify(_ *edit.Options, f *build.File) ([]byte, error) { 23 // Current AST may be not entirely correct, e.g. it may contain Ident which 24 // value is a chunk of code, like "f(x)". The AST should be printed and 25 // re-read to parse such expressions correctly. 26 contents := build.Format(f) 27 newF, err := build.Parse(f.Path, contents) 28 if err != nil { 29 return nil, err 30 } 31 return build.Format(newF), nil 32 } 33