@@ -4,12 +4,22 @@ import (
4
4
"bytes"
5
5
"fmt"
6
6
"go/ast"
7
+ "go/parser"
7
8
"go/printer"
8
- "io/ioutil"
9
+ "os"
10
+ "strings"
9
11
)
10
12
13
+ // Run runs gofmt.
14
+ // Deprecated: use RunRewrite instead.
11
15
func Run (filename string , needSimplify bool ) ([]byte , error ) {
12
- src , err := ioutil .ReadFile (filename )
16
+ return RunRewrite (filename , needSimplify , "" )
17
+ }
18
+
19
+ // RunRewrite runs gofmt.
20
+ // empty string `rewrite` will be ignored.
21
+ func RunRewrite (filename string , needSimplify bool , rewriteRule string ) ([]byte , error ) {
22
+ src , err := os .ReadFile (filename )
13
23
if err != nil {
14
24
return nil , err
15
25
}
@@ -27,6 +37,11 @@ func Run(filename string, needSimplify bool) ([]byte, error) {
27
37
simplify (file )
28
38
}
29
39
40
+ file , err = rewriteFileContent (rewriteRule , file )
41
+ if err != nil {
42
+ return nil , err
43
+ }
44
+
30
45
res , err := format (fileSet , file , sourceAdj , indentAdj , src , printer.Config {Mode : printerMode , Tabwidth : tabWidth })
31
46
if err != nil {
32
47
return nil , err
@@ -44,3 +59,34 @@ func Run(filename string, needSimplify bool) ([]byte, error) {
44
59
45
60
return data , nil
46
61
}
62
+
63
+ func rewriteFileContent (rewriteRule string , file * ast.File ) (* ast.File , error ) {
64
+ if rewriteRule == "" {
65
+ return file , nil
66
+ }
67
+
68
+ f := strings .Split (rewriteRule , "->" )
69
+ if len (f ) != 2 {
70
+ return nil , fmt .Errorf ("rewrite rule must be of the form 'pattern -> replacement'\n " )
71
+ }
72
+
73
+ pattern , err := parseExpression (f [0 ], "pattern" )
74
+ if err != nil {
75
+ return nil , err
76
+ }
77
+
78
+ replace , err := parseExpression (f [1 ], "replacement" )
79
+ if err != nil {
80
+ return nil , err
81
+ }
82
+
83
+ return rewriteFile (pattern , replace , file ), nil
84
+ }
85
+
86
+ func parseExpression (s , what string ) (ast.Expr , error ) {
87
+ x , err := parser .ParseExpr (s )
88
+ if err != nil {
89
+ return nil , fmt .Errorf ("parsing %s %s at %s\n " , what , s , err )
90
+ }
91
+ return x , nil
92
+ }
0 commit comments