Skip to content

Commit fadf134

Browse files
trim21ldez
andauthored
feat: add rewrite option (#2)
Co-authored-by: Fernandez Ludovic <[email protected]>
1 parent 244bba7 commit fadf134

File tree

1 file changed

+48
-2
lines changed

1 file changed

+48
-2
lines changed

gofmt/golangci.go

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,22 @@ import (
44
"bytes"
55
"fmt"
66
"go/ast"
7+
"go/parser"
78
"go/printer"
8-
"io/ioutil"
9+
"os"
10+
"strings"
911
)
1012

13+
// Run runs gofmt.
14+
// Deprecated: use RunRewrite instead.
1115
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)
1323
if err != nil {
1424
return nil, err
1525
}
@@ -27,6 +37,11 @@ func Run(filename string, needSimplify bool) ([]byte, error) {
2737
simplify(file)
2838
}
2939

40+
file, err = rewriteFileContent(rewriteRule, file)
41+
if err != nil {
42+
return nil, err
43+
}
44+
3045
res, err := format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth})
3146
if err != nil {
3247
return nil, err
@@ -44,3 +59,34 @@ func Run(filename string, needSimplify bool) ([]byte, error) {
4459

4560
return data, nil
4661
}
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

Comments
 (0)