From b3ee312584174723d8916c10d85e137772647054 Mon Sep 17 00:00:00 2001 From: Duologic Date: Mon, 1 Jul 2024 11:05:48 +0200 Subject: [PATCH 1/3] test: add test case --- pkg/server/completion_test.go | 40 ++++++++++++++++++++++ pkg/server/testdata/local_reassign.jsonnet | 9 +++++ 2 files changed, 49 insertions(+) create mode 100644 pkg/server/testdata/local_reassign.jsonnet diff --git a/pkg/server/completion_test.go b/pkg/server/completion_test.go index fa85eb9..723e7bb 100644 --- a/pkg/server/completion_test.go +++ b/pkg/server/completion_test.go @@ -663,6 +663,46 @@ 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", + }, + }, + }, + }, + }, } 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..85bdaf2 --- /dev/null +++ b/pkg/server/testdata/local_reassign.jsonnet @@ -0,0 +1,9 @@ +local job = { + steps: { name: 'a', value: 'b' }, +}; + +local newjob = job; + +{ + a: newjob, +} From 1d117f1b4b37673ceaa514850594a124250277b4 Mon Sep 17 00:00:00 2001 From: Duologic Date: Mon, 1 Jul 2024 11:20:23 +0200 Subject: [PATCH 2/3] fix?: copied case from function below --- pkg/ast/processing/find_field.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pkg/ast/processing/find_field.go b/pkg/ast/processing/find_field.go index edf26f1..3cfb681 100644 --- a/pkg/ast/processing/find_field.go +++ b/pkg/ast/processing/find_field.go @@ -74,6 +74,19 @@ func FindRangesFromIndexList(stack *nodestack.NodeStack, indexList []string, vm if funcBody := findChildDesugaredObject(bodyNode.Body); funcBody != nil { foundDesugaredObjects = append(foundDesugaredObjects, funcBody) } + 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)) } From dd41756b84bba04b36c2ef40938c252a4e7faab4 Mon Sep 17 00:00:00 2001 From: Duologic Date: Mon, 1 Jul 2024 11:55:55 +0200 Subject: [PATCH 3/3] iterating on the underlying problem... --- pkg/ast/processing/find_field.go | 3 +++ pkg/server/completion_test.go | 9 +++++++++ pkg/server/testdata/local_reassign.jsonnet | 5 ++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/ast/processing/find_field.go b/pkg/ast/processing/find_field.go index 3cfb681..05b9678 100644 --- a/pkg/ast/processing/find_field.go +++ b/pkg/ast/processing/find_field.go @@ -74,6 +74,9 @@ 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 { diff --git a/pkg/server/completion_test.go b/pkg/server/completion_test.go index 723e7bb..515c24b 100644 --- a/pkg/server/completion_test.go +++ b/pkg/server/completion_test.go @@ -700,6 +700,15 @@ func TestCompletion(t *testing.T) { Description: "object", }, }, + { + Label: "step", + Kind: protocol.FieldCompletion, + Detail: "newjob.step", + InsertText: "step", + LabelDetails: protocol.CompletionItemLabelDetails{ + Description: "object", + }, + }, }, }, }, diff --git a/pkg/server/testdata/local_reassign.jsonnet b/pkg/server/testdata/local_reassign.jsonnet index 85bdaf2..76d7342 100644 --- a/pkg/server/testdata/local_reassign.jsonnet +++ b/pkg/server/testdata/local_reassign.jsonnet @@ -2,7 +2,10 @@ local job = { steps: { name: 'a', value: 'b' }, }; -local newjob = job; +local newjob = job + { + steps: {}, + step: super.steps, +}; { a: newjob,