-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathS015.go
59 lines (47 loc) · 1.61 KB
/
S015.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
// Package S015 defines an Analyzer that checks for
// Schema that attribute names contain only lowercase
// alphanumerics and underscores
package S015
import (
"go/ast"
"strings"
"golang.org/x/tools/go/analysis"
"github.com/bflad/tfproviderlint/helper/terraformtype/helper/schema"
"github.com/bflad/tfproviderlint/passes/commentignore"
"github.com/bflad/tfproviderlint/passes/helper/schema/schemamapcompositelit"
)
const Doc = `check for Schema that attribute names are valid
The S015 analyzer reports cases of schemas which the attribute name
includes characters outside lowercase alphanumerics and underscores,
which will fail provider schema validation.`
const analyzerName = "S015"
var Analyzer = &analysis.Analyzer{
Name: analyzerName,
Doc: Doc,
Requires: []*analysis.Analyzer{
schemamapcompositelit.Analyzer,
commentignore.Analyzer,
},
Run: run,
}
func run(pass *analysis.Pass) (interface{}, error) {
ignorer := pass.ResultOf[commentignore.Analyzer].(*commentignore.Ignorer)
schemamapcompositelits := pass.ResultOf[schemamapcompositelit.Analyzer].([]*ast.CompositeLit)
for _, smap := range schemamapcompositelits {
if ignorer.ShouldIgnore(analyzerName, smap) {
continue
}
for _, attributeName := range schema.GetSchemaMapAttributeNames(smap) {
switch t := attributeName.(type) {
default:
continue
case *ast.BasicLit:
value := strings.Trim(t.Value, `"`)
if !schema.AttributeNameRegexp.MatchString(value) {
pass.Reportf(t.Pos(), "%s: schema attribute names should only be lowercase alphanumeric characters or underscores", analyzerName)
}
}
}
}
return nil, nil
}