diff --git a/actions-languageservice/src/complete.test.ts b/actions-languageservice/src/complete.test.ts index 20c9dd1..d7ab496 100644 --- a/actions-languageservice/src/complete.test.ts +++ b/actions-languageservice/src/complete.test.ts @@ -372,6 +372,36 @@ jobs: }); }); + it("sets a range for token key", 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 key", 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 36efd5a..cd88b64 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -112,6 +112,12 @@ 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); } return values.map(value => {