-
Notifications
You must be signed in to change notification settings - Fork 25
/
S014.go
80 lines (64 loc) · 2.22 KB
/
S014.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
77
78
79
80
// Package S014 defines an Analyzer that checks for
// Schema that within Elem, Computed, Optional, and Required
// are not configured
package S014
import (
"go/ast"
"go/token"
"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 Elem does not contain extraneous fields
The S014 analyzer reports cases of schemas which within Elem, that
Computed, Optional, and Required are not configured, which will fail
provider schema validation.`
const analyzerName = "S014"
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 {
for _, schemaCompositeLit := range schema.GetSchemaMapSchemas(smap) {
schemaInfo := schema.NewSchemaInfo(schemaCompositeLit, pass.TypesInfo)
if ignorer.ShouldIgnore(analyzerName, schemaInfo.AstCompositeLit) {
continue
}
elemKvExpr := schemaInfo.Fields[schema.SchemaFieldElem]
if elemKvExpr == nil {
continue
}
// search within Elem
switch elemValue := elemKvExpr.Value.(type) {
default:
continue
case *ast.UnaryExpr:
if elemValue.Op != token.AND || !schema.IsTypeSchema(pass.TypesInfo.TypeOf(elemValue.X)) {
continue
}
switch tElemSchema := elemValue.X.(type) {
default:
continue
case *ast.CompositeLit:
elemSchema := schema.NewSchemaInfo(tElemSchema, pass.TypesInfo)
for _, field := range []string{schema.SchemaFieldComputed, schema.SchemaFieldOptional, schema.SchemaFieldRequired} {
if kvExpr := elemSchema.Fields[field]; kvExpr != nil {
pass.Reportf(kvExpr.Pos(), "%s: schema within Elem should not configure Computed, Optional, or Required", analyzerName)
break
}
}
}
}
}
}
return nil, nil
}