From ba23758999f6ff8312898a97da106dd8d48d1a71 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 21 Feb 2023 14:50:28 -0800 Subject: [PATCH 1/4] Add output description to hover --- .../reusable-job-inputs.ts | 2 +- .../src/hover.reusable-workflow.test.ts | 24 +++++++++++++++++++ actions-languageservice/src/hover.ts | 11 +++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/actions-languageservice/src/description-providers/reusable-job-inputs.ts b/actions-languageservice/src/description-providers/reusable-job-inputs.ts index 78f823d..d9cd71c 100644 --- a/actions-languageservice/src/description-providers/reusable-job-inputs.ts +++ b/actions-languageservice/src/description-providers/reusable-job-inputs.ts @@ -1,4 +1,4 @@ -import {isMapping, isString, ParseWorkflowResult} from "@github/actions-workflow-parser"; +import {isMapping, isString} from "@github/actions-workflow-parser"; import {DESCRIPTION} from "@github/actions-workflow-parser/templates/template-constants"; import {WorkflowContext} from "../context/workflow-context"; import {TokenResult} from "../utils/find-token"; diff --git a/actions-languageservice/src/hover.reusable-workflow.test.ts b/actions-languageservice/src/hover.reusable-workflow.test.ts index b32d6fc..5d09483 100644 --- a/actions-languageservice/src/hover.reusable-workflow.test.ts +++ b/actions-languageservice/src/hover.reusable-workflow.test.ts @@ -34,4 +34,28 @@ jobs: expect(result).not.toBeUndefined(); expect(result?.contents).toEqual("**Context:** github, inputs, vars, needs, strategy, matrix"); }); + + it("hover on job output with description", async () => { + const input = ` +on: push + +jobs: + build: + uses: ./reusable-workflow-with-outputs.yaml + echo_outputs: + runs-on: ubuntu-latest + needs: build + steps: + - run: echo \${{ needs.build.outputs.bu|ild_id }} +`; + + const result = await hover( + ...getPositionFromCursor(input), + testHoverConfig("", "string-steps-context") + ); + expect(result).not.toBeUndefined(); + expect(result?.contents).toEqual( + "The resulting build ID\n\n**Context:** github, inputs, vars, needs, strategy, matrix, secrets, steps, job, runner, env, hashFiles(1,255)" + ); + }); }); diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 99f3718..7c80e23 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -15,10 +15,7 @@ import {Hover} from "vscode-languageserver-types"; import {ContextProviderConfig} from "./context-providers/config"; import {getContext, Mode} from "./context-providers/default"; import {getWorkflowContext, WorkflowContext} from "./context/workflow-context"; -import { - isReusableWorkflowJobInput, - getReusableWorkflowInputDescription -} from "./description-providers/reusable-job-inputs"; +import {isReusableWorkflowJobInput, getReusableWorkflowInputDescription} from "./description-providers/reusable-job-inputs"; import {ExpressionPos, mapToExpressionPos} from "./expression-hover/expression-pos"; import {HoverVisitor} from "./expression-hover/visitor"; import {validatorFunctions} from "./expression-validation/functions"; @@ -67,7 +64,11 @@ export async function hover(document: TextDocument, position: Position, config?: const exprPos = mapToExpressionPos(token, position); if (exprPos) { - return expressionHover(exprPos, context, namedContexts, functions); + let hover = expressionHover(exprPos, context, namedContexts, functions); + if (hover) { + hover.contents = appendContext(token, hover.contents as string); + } + return hover; } } } From fa3c7104a831ee18c2d349e3b80acf22f4a2dafb Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 21 Feb 2023 15:19:03 -0800 Subject: [PATCH 2/4] Refactor appendContext --- actions-languageservice/src/hover.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 7c80e23..9643c56 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -66,7 +66,7 @@ export async function hover(document: TextDocument, position: Position, config?: if (exprPos) { let hover = expressionHover(exprPos, context, namedContexts, functions); if (hover) { - hover.contents = appendContext(token, hover.contents as string); + hover.contents = appendContext(hover.contents as string, allowedContext); } return hover; } @@ -92,7 +92,7 @@ export async function hover(document: TextDocument, position: Position, config?: if (tokenResult.parent && isReusableWorkflowJobInput(tokenResult)) { let description = getReusableWorkflowInputDescription(workflowContext, tokenResult); - description = appendContext(token, description); + description = appendContext(description, token.definitionInfo?.allowedContext); return { contents: description, range: mapRange(token.range) @@ -100,7 +100,7 @@ export async function hover(document: TextDocument, position: Position, config?: } let description = await getDescription(config, workflowContext, token, tokenResult.path); - description = appendContext(token, description); + description = appendContext(description, token.definitionInfo?.allowedContext); return { contents: description, @@ -108,8 +108,7 @@ export async function hover(document: TextDocument, position: Position, config?: } satisfies Hover; } -function appendContext(token: TemplateToken, description: string) { - const allowedContext = token.definitionInfo?.allowedContext; +function appendContext(description: string, allowedContext?: string[]) { if (allowedContext && allowedContext?.length > 0) { // Only add padding if there is a description description += `${description.length > 0 ? `\n\n` : ""}**Context:** ${allowedContext.join(", ")}`; From 6e03957780647d411ab66123a66fd70e9468c26a Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 21 Feb 2023 15:24:51 -0800 Subject: [PATCH 3/4] Format --- actions-languageservice/src/hover.reusable-workflow.test.ts | 5 +---- actions-languageservice/src/hover.ts | 5 ++++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/actions-languageservice/src/hover.reusable-workflow.test.ts b/actions-languageservice/src/hover.reusable-workflow.test.ts index 5d09483..37ef45b 100644 --- a/actions-languageservice/src/hover.reusable-workflow.test.ts +++ b/actions-languageservice/src/hover.reusable-workflow.test.ts @@ -49,10 +49,7 @@ jobs: - run: echo \${{ needs.build.outputs.bu|ild_id }} `; - const result = await hover( - ...getPositionFromCursor(input), - testHoverConfig("", "string-steps-context") - ); + const result = await hover(...getPositionFromCursor(input), testHoverConfig("", "string-steps-context")); expect(result).not.toBeUndefined(); expect(result?.contents).toEqual( "The resulting build ID\n\n**Context:** github, inputs, vars, needs, strategy, matrix, secrets, steps, job, runner, env, hashFiles(1,255)" diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 9643c56..263fd88 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -15,7 +15,10 @@ import {Hover} from "vscode-languageserver-types"; import {ContextProviderConfig} from "./context-providers/config"; import {getContext, Mode} from "./context-providers/default"; import {getWorkflowContext, WorkflowContext} from "./context/workflow-context"; -import {isReusableWorkflowJobInput, getReusableWorkflowInputDescription} from "./description-providers/reusable-job-inputs"; +import { + isReusableWorkflowJobInput, + getReusableWorkflowInputDescription +} from "./description-providers/reusable-job-inputs"; import {ExpressionPos, mapToExpressionPos} from "./expression-hover/expression-pos"; import {HoverVisitor} from "./expression-hover/visitor"; import {validatorFunctions} from "./expression-validation/functions"; From d7b582c975990f8edfe87cb5c767aad41be61fb3 Mon Sep 17 00:00:00 2001 From: Jacob Wallraff Date: Tue, 21 Feb 2023 15:58:45 -0800 Subject: [PATCH 4/4] Don't add context to expression hover --- actions-languageservice/src/hover.reusable-workflow.test.ts | 6 ++---- actions-languageservice/src/hover.ts | 6 +----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/actions-languageservice/src/hover.reusable-workflow.test.ts b/actions-languageservice/src/hover.reusable-workflow.test.ts index 37ef45b..31f9154 100644 --- a/actions-languageservice/src/hover.reusable-workflow.test.ts +++ b/actions-languageservice/src/hover.reusable-workflow.test.ts @@ -2,7 +2,7 @@ import {hover} from "./hover"; import {testHoverConfig} from "./hover.test"; import {getPositionFromCursor} from "./test-utils/cursor-position"; -describe("hover on reusable workflows", () => { +describe("hover.reusable-workflow", () => { it("hover on job input with description", async () => { const input = ` on: push @@ -51,8 +51,6 @@ jobs: const result = await hover(...getPositionFromCursor(input), testHoverConfig("", "string-steps-context")); expect(result).not.toBeUndefined(); - expect(result?.contents).toEqual( - "The resulting build ID\n\n**Context:** github, inputs, vars, needs, strategy, matrix, secrets, steps, job, runner, env, hashFiles(1,255)" - ); + expect(result?.contents).toEqual("The resulting build ID"); }); }); diff --git a/actions-languageservice/src/hover.ts b/actions-languageservice/src/hover.ts index 263fd88..6a073eb 100644 --- a/actions-languageservice/src/hover.ts +++ b/actions-languageservice/src/hover.ts @@ -67,11 +67,7 @@ export async function hover(document: TextDocument, position: Position, config?: const exprPos = mapToExpressionPos(token, position); if (exprPos) { - let hover = expressionHover(exprPos, context, namedContexts, functions); - if (hover) { - hover.contents = appendContext(hover.contents as string, allowedContext); - } - return hover; + return expressionHover(exprPos, context, namedContexts, functions); } } }