From c6f490c62d1e3278d8d68c3d1c5342ab43225ccb Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 19 Jan 2023 17:20:37 -0800 Subject: [PATCH] Improve auto-completion for `if:` properties --- .../src/complete.expressions.test.ts | 89 +++++++++++++++++-- actions-languageservice/src/complete.ts | 8 +- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index f2269f6..5e50813 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -30,6 +30,7 @@ describe("expressions", () => { return getExpressionInput(doc.getText(), pos.character); }; + // With ${{ }} expect(test("${{ gh |")).toBe(" gh "); expect(test("${{ gh |}}")).toBe(" gh "); expect(test("${{ vars| == 'test' }}")).toBe(" vars"); @@ -41,6 +42,18 @@ describe("expressions", () => { expect(test("${{ test.|")).toBe(" test."); expect(test("${{ test.| }}")).toBe(" test."); expect(test("${{ 1 == (test.|)")).toBe(" 1 == (test."); + + // Without ${{ }} + expect(test("gh |")).toBe("gh "); + expect(test("gh |}}")).toBe("gh "); + expect(test("vars| == 'test' }}")).toBe("vars"); + expect(test("fromJso|('test').bar == 'test' }}")).toBe("fromJso"); + expect(test("github.| == 'test' }}")).toBe("github."); + expect(test("github.| == 'test' }}")).toBe("github."); + + expect(test("test.|")).toBe("test."); + expect(test("test.| }}")).toBe("test."); + expect(test("1 == (test.|)")).toBe("1 == (test."); }); describe("top-level auto-complete", () => { @@ -250,30 +263,90 @@ jobs: expect(result.map(x => x.label)).toEqual(["arch", "name", "os", "temp", "tool_cache"]); }); - it("job if", async () => { - const input = `on: push + describe("job if", () => { + describe("without ${{", () => { + it("simple", async () => { + const input = `on: push jobs: build: if: github.| runs-on: ubuntu-latest steps: - run: echo`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); - expect(result.map(x => x.label)).toEqual(["event"]); + expect(result.map(x => x.label)).toEqual(["event"]); + }); + + it("complex", async () => { + const input = `on: push +jobs: + build: + if: false && github.| == 'some-repo' + runs-on: ubuntu-latest + steps: + - run: echo`; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + }); + + describe("with ${{", () => { + it("simple", async () => { + const input = `on: push +jobs: + build: + if: \${{ github.| }} + runs-on: ubuntu-latest + steps: + - run: echo`; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + + it("complex", async () => { + const input = `on: push +jobs: + build: + if: \${{ false && github.| == 'some-repo' }} + runs-on: ubuntu-latest + steps: + - run: echo`; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + }); }); - it("step if", async () => { - const input = `on: push + describe("step if", () => { + it("with ${{", async () => { + const input = `on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - run: echo + if: \${{ github.| }}`; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + + it("without ${{", async () => { + const input = `on: push jobs: build: runs-on: ubuntu-latest steps: - run: echo if: github.|`; - const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); - expect(result.map(x => x.label)).toEqual(["event"]); + expect(result.map(x => x.label)).toEqual(["event"]); + }); }); }); diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 281b235..36efd5a 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -27,12 +27,14 @@ import {definitionValues} from "./value-providers/definition"; export function getExpressionInput(input: string, pos: number): string { // Find start marker around the cursor position - const startPos = input.lastIndexOf(OPEN_EXPRESSION, pos); + let startPos = input.lastIndexOf(OPEN_EXPRESSION, pos); if (startPos === -1) { - return input; + startPos = 0; + } else { + startPos += OPEN_EXPRESSION.length; } - return input.substring(startPos + OPEN_EXPRESSION.length, pos); + return input.substring(startPos, pos); } export async function complete(