-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathast_rewriter.go
71 lines (61 loc) · 1.25 KB
/
ast_rewriter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package main
import (
"fmt"
"go/ast"
"regexp"
)
var (
letters = []string{
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
}
replaceRegexp = regexp.MustCompile(`\b[A-Z]\b`)
)
type ASTModifier struct {
mapping map[string]int
parameters *Params
}
func NewASTModifier(parameters *Params) (*ASTModifier, error) {
result := &ASTModifier{
mapping: make(map[string]int),
parameters: parameters,
}
for i := 0; i < len(parameters.Types); i++ {
if i >= len(letters) {
return nil, fmt.Errorf("Too many parameters given, maximum of %d accepted", len(letters))
}
result.mapping[letters[i]] = i
}
return result, nil
}
func (a *ASTModifier) Visit(node ast.Node) ast.Visitor {
switch n := node.(type) {
case *ast.Ident:
if i, ok := a.mapping[n.Name]; ok {
n.Name = a.parameters.Types[i]
}
case *ast.ImportSpec:
n.Path.Value = replaceRegexp.ReplaceAllStringFunc(n.Path.Value, func(s string) string {
if i, ok := a.mapping[s]; ok {
return a.parameters.RawTypes[i]
} else {
return s
}
})
}
return a
}
// Note: modifies the ast in-place
func rewriteAst(tree *ast.File, parameters *Params) error {
astModifier, err := NewASTModifier(parameters)
if err != nil {
return err
}
ast.Walk(astModifier, tree)
return nil
}