From 51908ec789a4ecaeb6bddeb51f2d7d6c6ad908ba Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Thu, 12 Jan 2023 15:17:46 -0800 Subject: [PATCH 1/5] Set completion range for invalid token --- actions-languageservice/src/complete.test.ts | 31 ++++++++++++++++++++ actions-languageservice/src/complete.ts | 7 +++++ 2 files changed, 38 insertions(+) diff --git a/actions-languageservice/src/complete.test.ts b/actions-languageservice/src/complete.test.ts index 2ba5a6f..2bb413a 100644 --- a/actions-languageservice/src/complete.test.ts +++ b/actions-languageservice/src/complete.test.ts @@ -374,6 +374,37 @@ jobs: }); }); + + it("sets a range for invalid tokens", async () => { + const input = "on: push\njobs:\n build:\n runs-o|"; + const result = await complete(...getPositionFromCursor(input)); + + expect(result).not.toBeUndefined(); + expect(result.map(e => e.label)).toContain("runs-on"); + + let textEdit = result.filter(e => e.label === "runs-on")[0].textEdit as TextEdit; + expect(textEdit.newText).toEqual("runs-on"); + expect(textEdit.range).toEqual({ + start: {line: 3, character: 4}, + end: {line: 3, character: 10} + }); + }); + + it("sets a 0-length range while no initial token", async () => { + const input = "on: push\njobs:\n build:\n |"; + const result = await complete(...getPositionFromCursor(input)); + + expect(result).not.toBeUndefined(); + expect(result.map(e => e.label)).toContain("runs-on"); + + let textEdit = result.filter(e => e.label === "runs-on")[0].textEdit as TextEdit; + expect(textEdit.newText).toEqual("runs-on"); + expect(textEdit.range).toEqual({ + start: {line: 3, character: 4}, + end: {line: 3, character: 4} + }); + }); + describe("completes with indentation", () => { it("default indentation", async () => { const input = `on: push diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 44c3c3f..a38a53e 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -103,6 +103,13 @@ export async function complete( if (token?.range) { replaceRange = mapRange(token.range); } + else if (!token) { + // Not a valid token, create a range from the current position + const line = newDoc.getText({start: {line: position.line, character: 0}, end: position}); + // Get the length of the current word + const val = line.match(/[\w_-]*$/)?.[0].length || 0; + replaceRange = Range.create({ line: position.line, character: position.character - val } as Position, position); + } return values.map(value => { const newText = value.insertText || value.label; From 1f22c3ab314c00dc300651dac95df31972dc7032 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Thu, 12 Jan 2023 15:23:59 -0800 Subject: [PATCH 2/5] Clarify test names --- actions-languageservice/src/complete.test.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/actions-languageservice/src/complete.test.ts b/actions-languageservice/src/complete.test.ts index 2bb413a..077657b 100644 --- a/actions-languageservice/src/complete.test.ts +++ b/actions-languageservice/src/complete.test.ts @@ -374,8 +374,7 @@ jobs: }); }); - - it("sets a range for invalid tokens", async () => { + it("sets a range for token key", async () => { const input = "on: push\njobs:\n build:\n runs-o|"; const result = await complete(...getPositionFromCursor(input)); @@ -390,7 +389,7 @@ jobs: }); }); - it("sets a 0-length range while no initial token", async () => { + it("sets a 0-length range while no initial token key", async () => { const input = "on: push\njobs:\n build:\n |"; const result = await complete(...getPositionFromCursor(input)); From d7761dc5389903cef42a4173c8765197e70efd16 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Fri, 13 Jan 2023 11:58:42 -0800 Subject: [PATCH 3/5] Remove cast and format --- actions-languageservice/src/complete.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index a38a53e..53a9110 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -102,13 +102,12 @@ export async function complete( let replaceRange: Range | undefined; if (token?.range) { replaceRange = mapRange(token.range); - } - else if (!token) { + } else if (!token) { // Not a valid token, create a range from the current position const line = newDoc.getText({start: {line: position.line, character: 0}, end: position}); // Get the length of the current word const val = line.match(/[\w_-]*$/)?.[0].length || 0; - replaceRange = Range.create({ line: position.line, character: position.character - val } as Position, position); + replaceRange = Range.create({line: position.line, character: position.character - val}, position); } return values.map(value => { From d5831b2e8964f83c8e7e9f6318dae4f3cdf8e630 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 17 Jan 2023 10:27:51 -0800 Subject: [PATCH 4/5] Use parent token (revertable) --- actions-languageservice/src/complete.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 53a9110..fec3979 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -102,12 +102,8 @@ export async function complete( let replaceRange: Range | undefined; if (token?.range) { replaceRange = mapRange(token.range); - } else if (!token) { - // Not a valid token, create a range from the current position - const line = newDoc.getText({start: {line: position.line, character: 0}, end: position}); - // Get the length of the current word - const val = line.match(/[\w_-]*$/)?.[0].length || 0; - replaceRange = Range.create({line: position.line, character: position.character - val}, position); + } else if (!token && parent?.range) { + replaceRange = mapRange(parent.range) } return values.map(value => { From f3a570d10dd3d7220a689338b51ac08907ba7812 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 24 Jan 2023 13:16:19 -0800 Subject: [PATCH 5/5] Revert "Use parent token (revertable)" This reverts commit d5831b2e8964f83c8e7e9f6318dae4f3cdf8e630. --- actions-languageservice/src/complete.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 491bf2b..cd88b64 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -112,8 +112,12 @@ export async function complete( let replaceRange: Range | undefined; if (token?.range) { replaceRange = mapRange(token.range); - } else if (!token && parent?.range) { - replaceRange = mapRange(parent.range) + } else if (!token) { + // Not a valid token, create a range from the current position + const line = newDoc.getText({start: {line: position.line, character: 0}, end: position}); + // Get the length of the current word + const val = line.match(/[\w_-]*$/)?.[0].length || 0; + replaceRange = Range.create({line: position.line, character: position.character - val}, position); } return values.map(value => {