-
Notifications
You must be signed in to change notification settings - Fork 17
/
api.go
76 lines (69 loc) · 1.4 KB
/
api.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
72
73
74
75
76
package goconst
import (
"go/ast"
"go/token"
"strings"
)
type Issue struct {
Pos token.Position
OccurrencesCount int
Str string
MatchingConst string
}
type Config struct {
IgnoreStrings string
IgnoreTests bool
MatchWithConstants bool
MinStringLength int
MinOccurrences int
ParseNumbers bool
NumberMin int
NumberMax int
ExcludeTypes map[Type]bool
}
func Run(files []*ast.File, fset *token.FileSet, cfg *Config) ([]Issue, error) {
p := New(
"",
"",
cfg.IgnoreStrings,
cfg.IgnoreTests,
cfg.MatchWithConstants,
cfg.ParseNumbers,
cfg.NumberMin,
cfg.NumberMax,
cfg.MinStringLength,
cfg.MinOccurrences,
cfg.ExcludeTypes,
)
var issues []Issue
for _, f := range files {
if p.ignoreTests {
if filename := fset.Position(f.Pos()).Filename; strings.HasSuffix(filename, testSuffix) {
continue
}
}
ast.Walk(&treeVisitor{
fileSet: fset,
packageName: "",
fileName: "",
p: p,
}, f)
}
p.ProcessResults()
for str, item := range p.strs {
fi := item[0]
i := Issue{
Pos: fi.Position,
OccurrencesCount: len(item),
Str: str,
}
if len(p.consts) != 0 {
if cst, ok := p.consts[str]; ok {
// const should be in the same package and exported
i.MatchingConst = cst.Name
}
}
issues = append(issues, i)
}
return issues, nil
}