@@ -11,7 +11,7 @@ import (
11
11
log "github.com/sirupsen/logrus"
12
12
)
13
13
14
- func FindRangesFromIndexList (stack * nodestack.NodeStack , indexList []string , vm * jsonnet.VM ) ([]ObjectRange , error ) {
14
+ func FindRangesFromIndexList (stack * nodestack.NodeStack , indexList []string , vm * jsonnet.VM , partialMatchFields bool ) ([]ObjectRange , error ) {
15
15
var foundDesugaredObjects []* ast.DesugaredObject
16
16
// First element will be super, self, or var name
17
17
start , indexList := indexList [0 ], indexList [1 :]
@@ -45,7 +45,7 @@ func FindRangesFromIndexList(stack *nodestack.NodeStack, indexList []string, vm
45
45
// Get ast.DesugaredObject at variable definition by getting bind then setting ast.DesugaredObject
46
46
bind := FindBindByIDViaStack (stack , ast .Identifier (start ))
47
47
if bind == nil {
48
- param := FindParameterByIDViaStack (stack , ast .Identifier (start ))
48
+ param := FindParameterByIDViaStack (stack , ast .Identifier (start ), partialMatchFields )
49
49
if param != nil {
50
50
return []ObjectRange {
51
51
{
@@ -69,7 +69,7 @@ func FindRangesFromIndexList(stack *nodestack.NodeStack, indexList []string, vm
69
69
case * ast.Index , * ast.Apply :
70
70
tempStack := nodestack .NewNodeStack (bodyNode )
71
71
indexList = append (tempStack .BuildIndexList (), indexList ... )
72
- return FindRangesFromIndexList (stack , indexList , vm )
72
+ return FindRangesFromIndexList (stack , indexList , vm , partialMatchFields )
73
73
case * ast.Function :
74
74
// If the function's body is an object, it means we can look for indexes within the function
75
75
if funcBody := findChildDesugaredObject (bodyNode .Body ); funcBody != nil {
@@ -80,15 +80,15 @@ func FindRangesFromIndexList(stack *nodestack.NodeStack, indexList []string, vm
80
80
}
81
81
}
82
82
83
- return extractObjectRangesFromDesugaredObjs (stack , vm , foundDesugaredObjects , sameFileOnly , indexList )
83
+ return extractObjectRangesFromDesugaredObjs (stack , vm , foundDesugaredObjects , sameFileOnly , indexList , partialMatchFields )
84
84
}
85
85
86
- func extractObjectRangesFromDesugaredObjs (stack * nodestack.NodeStack , vm * jsonnet.VM , desugaredObjs []* ast.DesugaredObject , sameFileOnly bool , indexList []string ) ([]ObjectRange , error ) {
86
+ func extractObjectRangesFromDesugaredObjs (stack * nodestack.NodeStack , vm * jsonnet.VM , desugaredObjs []* ast.DesugaredObject , sameFileOnly bool , indexList []string , partialMatchFields bool ) ([]ObjectRange , error ) {
87
87
var ranges []ObjectRange
88
88
for len (indexList ) > 0 {
89
89
index := indexList [0 ]
90
90
indexList = indexList [1 :]
91
- foundFields := findObjectFieldsInObjects (desugaredObjs , index )
91
+ foundFields := findObjectFieldsInObjects (desugaredObjs , index , partialMatchFields )
92
92
desugaredObjs = nil
93
93
if len (foundFields ) == 0 {
94
94
return nil , fmt .Errorf ("field %s was not found in ast.DesugaredObject" , index )
@@ -98,7 +98,8 @@ func extractObjectRangesFromDesugaredObjs(stack *nodestack.NodeStack, vm *jsonne
98
98
ranges = append (ranges , FieldToRange (* found ))
99
99
100
100
// If the field is not PlusSuper (field+: value), we stop there. Other previous values are not relevant
101
- if ! found .PlusSuper {
101
+ // If partialMatchFields is true, we can continue to look for other fields
102
+ if ! found .PlusSuper && ! partialMatchFields {
102
103
break
103
104
}
104
105
}
@@ -134,7 +135,7 @@ func extractObjectRangesFromDesugaredObjs(stack *nodestack.NodeStack, vm *jsonne
134
135
desugaredObjs = append (desugaredObjs , fieldNode )
135
136
case * ast.Index :
136
137
additionalIndexList := append (nodestack .NewNodeStack (fieldNode ).BuildIndexList (), indexList ... )
137
- result , err := FindRangesFromIndexList (stack , additionalIndexList , vm )
138
+ result , err := FindRangesFromIndexList (stack , additionalIndexList , vm , partialMatchFields )
138
139
if len (result ) > 0 {
139
140
if ! sameFileOnly || result [0 ].Filename == stack .From .Loc ().FileName {
140
141
return result , err
@@ -186,32 +187,36 @@ func unpackFieldNodes(vm *jsonnet.VM, fields []*ast.DesugaredObjectField) ([]ast
186
187
return fieldNodes , nil
187
188
}
188
189
189
- func findObjectFieldsInObjects (objectNodes []* ast.DesugaredObject , index string ) []* ast.DesugaredObjectField {
190
+ func findObjectFieldsInObjects (objectNodes []* ast.DesugaredObject , index string , partialMatchFields bool ) []* ast.DesugaredObjectField {
190
191
var matchingFields []* ast.DesugaredObjectField
191
192
for _ , object := range objectNodes {
192
- field := findObjectFieldInObject (object , index )
193
- if field != nil {
194
- matchingFields = append (matchingFields , field )
195
- }
193
+ fields := findObjectFieldsInObject (object , index , partialMatchFields )
194
+ matchingFields = append (matchingFields , fields ... )
196
195
}
197
196
return matchingFields
198
197
}
199
198
200
- func findObjectFieldInObject (objectNode * ast.DesugaredObject , index string ) * ast.DesugaredObjectField {
199
+ func findObjectFieldsInObject (objectNode * ast.DesugaredObject , index string , partialMatchFields bool ) [] * ast.DesugaredObjectField {
201
200
if objectNode == nil {
202
201
return nil
203
202
}
203
+
204
+ var matchingFields []* ast.DesugaredObjectField
204
205
for _ , field := range objectNode .Fields {
206
+ field := field
205
207
literalString , isString := field .Name .(* ast.LiteralString )
206
208
if ! isString {
207
209
continue
208
210
}
209
211
log .Debugf ("Checking index name %s against field name %s" , index , literalString .Value )
210
- if index == literalString .Value {
211
- return & field
212
+ if index == literalString .Value || (partialMatchFields && strings .HasPrefix (literalString .Value , index )) {
213
+ matchingFields = append (matchingFields , & field )
214
+ if ! partialMatchFields {
215
+ break
216
+ }
212
217
}
213
218
}
214
- return nil
219
+ return matchingFields
215
220
}
216
221
217
222
func findChildDesugaredObject (node ast.Node ) * ast.DesugaredObject {
0 commit comments