This commit is contained in:
Jacob Wallraff
2023-02-17 13:04:33 -08:00
parent c5caf4b35f
commit 7389a38952
2 changed files with 19 additions and 27 deletions
@@ -13,14 +13,10 @@ jobs:
with:
us|ername:
`;
const result = await hover(
...getPositionFromCursor(input),
testHoverConfig("username", "scalar-needs-context")
);
const result = await hover(...getPositionFromCursor(input), testHoverConfig("username", "scalar-needs-context"));
expect(result).not.toBeUndefined();
expect(result?.contents).toEqual(
"A username passed from the caller workflow\n\n" +
"**Context:** github, inputs, vars, needs, strategy, matrix"
"A username passed from the caller workflow\n\n**Context:** github, inputs, vars, needs, strategy, matrix"
);
});
+17 -21
View File
@@ -26,7 +26,7 @@ import {nullTrace} from "./nulltrace";
import {isPotentiallyExpression} from "./utils/expression-detection";
import {findToken, TokenResult} from "./utils/find-token";
import {mapRange} from "./utils/range";
import { ReusableWorkflowJob } from "@github/actions-workflow-parser/model/workflow-template";
import {ReusableWorkflowJob} from "@github/actions-workflow-parser/model/workflow-template";
export type HoverConfig = {
descriptionProvider?: DescriptionProvider;
@@ -35,11 +35,7 @@ export type HoverConfig = {
};
export type DescriptionProvider = {
getDescription(
context: WorkflowContext,
token: TemplateToken,
path: TemplateToken[]
): Promise<string | undefined>
getDescription(context: WorkflowContext, token: TemplateToken, path: TemplateToken[]): Promise<string | undefined>;
};
export async function hover(document: TextDocument, position: Position, config?: HoverConfig): Promise<Hover | null> {
@@ -58,7 +54,7 @@ export async function hover(document: TextDocument, position: Position, config?:
const tokenDefinitionInfo = (keyToken || parent || token)?.definitionInfo;
const template = await convertWorkflowTemplate(result.context, result.value, config?.fileProvider, {
errorPolicy: ErrorPolicy.TryConversion,
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0,
fetchReusableWorkflowDepth: config?.fileProvider ? 1 : 0
});
const workflowContext = getWorkflowContext(document.uri, template, tokenResult.path);
if (token && tokenDefinitionInfo) {
@@ -94,7 +90,7 @@ export async function hover(document: TextDocument, position: Position, config?:
}
if (tokenResult.parent && isReusableWorkflowJobInput(tokenResult)) {
let description = getReusableWorkflowInputDescription(workflowContext, tokenResult, template)
let description = getReusableWorkflowInputDescription(workflowContext, tokenResult, template);
description = appendContext(token, description);
return {
contents: description,
@@ -145,10 +141,7 @@ function isCronMappingValue(tokenResult: TokenResult): boolean {
}
function isReusableWorkflowJobInput(tokenResult: TokenResult): boolean {
return (
tokenResult.parent?.definition?.key === "workflow-job-with" &&
isString(tokenResult.token!)
);
return tokenResult.parent?.definition?.key === "workflow-job-with" && isString(tokenResult.token!);
}
function expressionHover(
@@ -195,8 +188,12 @@ function expressionHover(
}
}
function getReusableWorkflowInputDescription(workflowContext: WorkflowContext, tokenResult: TokenResult, template: WorkflowTemplate): string {
const reusableWorkflowJob = workflowContext.reusableWorkflowJob
function getReusableWorkflowInputDescription(
workflowContext: WorkflowContext,
tokenResult: TokenResult,
template: WorkflowTemplate
): string {
const reusableWorkflowJob = workflowContext.reusableWorkflowJob;
if (!reusableWorkflowJob || !isReusableWorkflowJob(reusableWorkflowJob)) {
return "";
@@ -209,20 +206,19 @@ function getReusableWorkflowInputDescription(workflowContext: WorkflowContext, t
// Find the reusable job in the template that matches the current reusable job
const templateJob = template.jobs.find(job => {
return isReusableWorkflowJob(job) && job.id.value === reusableWorkflowJob.id.value
}) as ReusableWorkflowJob
return isReusableWorkflowJob(job) && job.id.value === reusableWorkflowJob.id.value;
}) as ReusableWorkflowJob;
// Find the input description in the template, if any
if (templateJob && reusableWorkflowJob["input-definitions"] && templateJob["input-definitions"]) {
const definition = templateJob["input-definitions"].find((tokenResult.token as StringToken).value)
const definition = templateJob["input-definitions"].find((tokenResult.token as StringToken).value);
if (definition && isMapping(definition)) {
const description = definition.find(DESCRIPTION)
const description = definition.find(DESCRIPTION);
if (description && isString(description)) {
return description.value
return description.value;
}
}
}
return ""
return "";
}