diff --git a/pkg/ast/processing/find_field.go b/pkg/ast/processing/find_field.go index edf26f1..05b9678 100644 --- a/pkg/ast/processing/find_field.go +++ b/pkg/ast/processing/find_field.go @@ -74,6 +74,22 @@ func FindRangesFromIndexList(stack *nodestack.NodeStack, indexList []string, vm if funcBody := findChildDesugaredObject(bodyNode.Body); funcBody != nil { foundDesugaredObjects = append(foundDesugaredObjects, funcBody) } + case *ast.Binary: + tmpStack := nodestack.NewNodeStack(bodyNode) + foundDesugaredObjects = FindTopLevelObjects(tmpStack, vm) + case *ast.Var: + varReference, err := FindVarReference(bodyNode, vm) + if err != nil { + return nil, err + } + // If the reference is an object, add it directly to the list of objects to look in + // Otherwise, add it back to the list for further processing + if varReferenceObj := findChildDesugaredObject(varReference); varReferenceObj != nil { + foundDesugaredObjects = append(foundDesugaredObjects, varReferenceObj) + } + //else { + // fieldNodes = append(fieldNodes, varReference) + //} default: return nil, fmt.Errorf("unexpected node type when finding bind for '%s': %s", start, reflect.TypeOf(bind.Body)) } diff --git a/pkg/server/completion_test.go b/pkg/server/completion_test.go index fa85eb9..515c24b 100644 --- a/pkg/server/completion_test.go +++ b/pkg/server/completion_test.go @@ -663,6 +663,55 @@ func TestCompletion(t *testing.T) { }, }, }, + { + name: "local assigned", + filename: "testdata/local_reassign.jsonnet", + replaceString: "a: newjob", + replaceByString: "a: job.", + expected: protocol.CompletionList{ + IsIncomplete: false, + Items: []protocol.CompletionItem{ + { + Label: "steps", + Kind: protocol.FieldCompletion, + Detail: "job.steps", + InsertText: "steps", + LabelDetails: protocol.CompletionItemLabelDetails{ + Description: "object", + }, + }, + }, + }, + }, + { + name: "local reassigned", + filename: "testdata/local_reassign.jsonnet", + replaceString: "a: newjob", + replaceByString: "a: newjob.", + expected: protocol.CompletionList{ + IsIncomplete: false, + Items: []protocol.CompletionItem{ + { + Label: "steps", + Kind: protocol.FieldCompletion, + Detail: "newjob.steps", + InsertText: "steps", + LabelDetails: protocol.CompletionItemLabelDetails{ + Description: "object", + }, + }, + { + Label: "step", + Kind: protocol.FieldCompletion, + Detail: "newjob.step", + InsertText: "step", + LabelDetails: protocol.CompletionItemLabelDetails{ + Description: "object", + }, + }, + }, + }, + }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { diff --git a/pkg/server/testdata/local_reassign.jsonnet b/pkg/server/testdata/local_reassign.jsonnet new file mode 100644 index 0000000..76d7342 --- /dev/null +++ b/pkg/server/testdata/local_reassign.jsonnet @@ -0,0 +1,12 @@ +local job = { + steps: { name: 'a', value: 'b' }, +}; + +local newjob = job + { + steps: {}, + step: super.steps, +}; + +{ + a: newjob, +}