func ExampleFprint() { // Parse source file and extract the AST without comments for // this function, with position information referring to the // file set fset. funcAST, fset := parseFunc("example_test.go", "ExampleFprint") // Print the function body into buffer buf. // The file set is provided to the printer so that it knows // about the original source formatting and can add additional // line breaks where they were present in the source. var buf bytes.Buffer printer.Fprint(&buf, fset, funcAST.Body) // Remove braces {} enclosing the function body, unindent, // and trim leading and trailing white space. s := buf.String() s = s[1 : len(s)-1] s = strings.TrimSpace(strings.Replace(s, "\n\t", "\n", -1)) // Print the cleaned-up body text to stdout. fmt.Println(s) // output: // funcAST, fset := parseFunc("example_test.go", "ExampleFprint") // // var buf bytes.Buffer // printer.Fprint(&buf, fset, funcAST.Body) // // s := buf.String() // s = s[1 : len(s)-1] // s = strings.TrimSpace(strings.Replace(s, "\n\t", "\n", -1)) // // fmt.Println(s) }
func RewriteTypesWithProtobufStructTags(name string, structTags map[string]map[string]string) error { fset := token.NewFileSet() src, err := ioutil.ReadFile(name) if err != nil { return err } file, err := parser.ParseFile(fset, name, src, parser.DeclarationErrors|parser.ParseComments) if err != nil { return err } allErrs := []error{} // set any new struct tags for _, d := range file.Decls { if errs := updateStructTags(d, structTags, []string{"protobuf"}); len(errs) > 0 { allErrs = append(allErrs, errs...) } } if len(allErrs) > 0 { var s string for _, err := range allErrs { s += err.Error() + "\n" } return errors.New(s) } b := &bytes.Buffer{} if err := printer.Fprint(b, fset, file); err != nil { return err } body, err := format.Source(b.Bytes()) if err != nil { return fmt.Errorf("%s\n---\nunable to format %q: %v", b, name, err) } f, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return err } defer f.Close() if _, err := f.Write(body); err != nil { return err } return f.Close() }
func RewriteGeneratedGogoProtobufFile(name string, packageName string, typeExistsFn func(string) bool, header []byte) error { fset := token.NewFileSet() src, err := ioutil.ReadFile(name) if err != nil { return err } file, err := parser.ParseFile(fset, name, src, parser.DeclarationErrors|parser.ParseComments) if err != nil { return err } cmap := ast.NewCommentMap(fset, file, file.Comments) // remove types that are already declared decls := []ast.Decl{} for _, d := range file.Decls { if !dropExistingTypeDeclarations(d, typeExistsFn) { decls = append(decls, d) } } file.Decls = decls // remove unmapped comments file.Comments = cmap.Filter(file).Comments() b := &bytes.Buffer{} b.Write(header) if err := printer.Fprint(b, fset, file); err != nil { return err } body, err := format.Source(b.Bytes()) if err != nil { return err } f, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return err } defer f.Close() if _, err := f.Write(body); err != nil { return err } return f.Close() }
func rewriteFile(name string, header []byte, rewriteFn func(*token.FileSet, *ast.File) error) error { fset := token.NewFileSet() src, err := ioutil.ReadFile(name) if err != nil { return err } file, err := parser.ParseFile(fset, name, src, parser.DeclarationErrors|parser.ParseComments) if err != nil { return err } if err := rewriteFn(fset, file); err != nil { return err } b := &bytes.Buffer{} b.Write(header) if err := printer.Fprint(b, fset, file); err != nil { return err } body, err := format.Source(b.Bytes()) if err != nil { return err } f, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return err } defer f.Close() if _, err := f.Write(body); err != nil { return err } return f.Close() }
func nodeFmt(node interface{}, fset *token.FileSet) string { var buf bytes.Buffer printer.Fprint(&buf, fset, node) return strings.Replace(strings.TrimSpace(buf.String()), "\n", "\n\t", -1) }