| // Copyright 2012 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 printer_test |
| |
| import ( |
| "bytes" |
| "fmt" |
| "go/ast" |
| "go/parser" |
| "go/printer" |
| "go/token" |
| "strings" |
| "testing" |
| ) |
| |
| // Dummy test function so that godoc does not use the entire file as example. |
| func Test(*testing.T) {} |
| |
| func parseFunc(filename, functionname string) (fun *ast.FuncDecl, fset *token.FileSet) { |
| fset = token.NewFileSet() |
| if file, err := parser.ParseFile(fset, filename, nil, 0); err == nil { |
| for _, d := range file.Decls { |
| if f, ok := d.(*ast.FuncDecl); ok && f.Name.Name == functionname { |
| fun = f |
| return |
| } |
| } |
| } |
| panic("function not found") |
| } |
| |
| 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.ReplaceAll(s, "\n\t", "\n")) |
| |
| // 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.ReplaceAll(s, "\n\t", "\n")) |
| // |
| // fmt.Println(s) |
| } |