@@ -22,6 +22,12 @@ type ErrorWriter struct {
22
22
Writer io.Writer
23
23
}
24
24
25
+ // Snippet represents a jsonnet file data that to be linted
26
+ type Snippet struct {
27
+ FileName string
28
+ Code string
29
+ }
30
+
25
31
func (e * ErrorWriter ) writeError (vm * jsonnet.VM , err errors.StaticError ) {
26
32
e .ErrorsFound = true
27
33
_ , writeErr := e .Writer .Write ([]byte (vm .ErrorFormatter .Format (err ) + "\n " ))
@@ -38,10 +44,14 @@ type nodeWithLocation struct {
38
44
}
39
45
40
46
// Lint analyses a node and reports any issues it encounters to an error writer.
41
- func lint (vm * jsonnet.VM , node nodeWithLocation , errWriter * ErrorWriter ) {
47
+ func lint (vm * jsonnet.VM , nodes [] nodeWithLocation , errWriter * ErrorWriter ) {
42
48
roots := make (map [string ]ast.Node )
43
- roots [node .path ] = node .node
44
- getImports (vm , node , roots , errWriter )
49
+ for _ , node := range nodes {
50
+ roots [node .path ] = node .node
51
+ }
52
+ for _ , node := range nodes {
53
+ getImports (vm , node , roots , errWriter )
54
+ }
45
55
46
56
variablesInFile := make (map [string ]common.VariableInfo )
47
57
@@ -55,35 +65,38 @@ func lint(vm *jsonnet.VM, node nodeWithLocation, errWriter *ErrorWriter) {
55
65
return variables .FindVariables (node .node , variables.Environment {"std" : & std })
56
66
}
57
67
58
- variableInfo := findVariables (node )
59
68
for importedPath , rootNode := range roots {
60
69
variablesInFile [importedPath ] = * findVariables (nodeWithLocation {rootNode , importedPath })
61
70
}
62
71
63
- for _ , v := range variableInfo .Variables {
64
- if len (v .Occurences ) == 0 && v .VariableKind == common .VarRegular && v .Name != "$" {
65
- errWriter .writeError (vm , errors .MakeStaticError ("Unused variable: " + string (v .Name ), v .LocRange ))
66
- }
67
- }
68
- ec := common.ErrCollector {}
69
-
70
72
vars := make (map [string ]map [ast.Node ]* common.Variable )
71
73
for importedPath , info := range variablesInFile {
72
74
vars [importedPath ] = info .VarAt
73
75
}
74
76
75
- types .Check (node .node , roots , vars , func (currentPath , importedPath string ) ast.Node {
76
- node , _ , err := vm .ImportAST (currentPath , importedPath )
77
- if err != nil {
78
- return nil
77
+ for _ , node := range nodes {
78
+ variableInfo := findVariables (node )
79
+
80
+ for _ , v := range variableInfo .Variables {
81
+ if len (v .Occurences ) == 0 && v .VariableKind == common .VarRegular && v .Name != "$" {
82
+ errWriter .writeError (vm , errors .MakeStaticError ("Unused variable: " + string (v .Name ), v .LocRange ))
83
+ }
79
84
}
80
- return node
81
- }, & ec )
85
+ ec := common.ErrCollector {}
86
+
87
+ types .Check (node .node , roots , vars , func (currentPath , importedPath string ) ast.Node {
88
+ node , _ , err := vm .ImportAST (currentPath , importedPath )
89
+ if err != nil {
90
+ return nil
91
+ }
92
+ return node
93
+ }, & ec )
82
94
83
- traversal .Traverse (node .node , & ec )
95
+ traversal .Traverse (node .node , & ec )
84
96
85
- for _ , err := range ec .Errs {
86
- errWriter .writeError (vm , err )
97
+ for _ , err := range ec .Errs {
98
+ errWriter .writeError (vm , err )
99
+ }
87
100
}
88
101
}
89
102
@@ -118,18 +131,24 @@ func getImports(vm *jsonnet.VM, node nodeWithLocation, roots map[string]ast.Node
118
131
}
119
132
}
120
133
121
- // LintSnippet checks for problems in a single code snippet.
122
- func LintSnippet (vm * jsonnet.VM , output io.Writer , filename , code string ) bool {
134
+ // LintSnippet checks for problems in code snippet(s) .
135
+ func LintSnippet (vm * jsonnet.VM , output io.Writer , snippets [] Snippet ) bool {
123
136
errWriter := ErrorWriter {
124
137
Writer : output ,
125
138
ErrorsFound : false ,
126
139
}
127
140
128
- node , err := jsonnet .SnippetToAST (filename , code )
129
- if err != nil {
130
- errWriter .writeError (vm , err .(errors.StaticError )) // ugly but true
131
- return true
141
+ var nodes []nodeWithLocation
142
+ for _ , snippet := range snippets {
143
+ node , err := jsonnet .SnippetToAST (snippet .FileName , snippet .Code )
144
+
145
+ if err != nil {
146
+ errWriter .writeError (vm , err .(errors.StaticError )) // ugly but true
147
+ } else {
148
+ nodes = append (nodes , nodeWithLocation {node , snippet .FileName })
149
+ }
132
150
}
133
- lint (vm , nodeWithLocation {node , filename }, & errWriter )
151
+
152
+ lint (vm , nodes , & errWriter )
134
153
return errWriter .ErrorsFound
135
154
}
0 commit comments