From b432867548a3f47100f0c1a3a903b45ba2f5afae Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Tue, 7 Feb 2023 16:42:28 -0500 Subject: [PATCH 1/2] Complete multi-segment expressions --- .../src/complete.expressions.test.ts | 7 ++++++ actions-languageservice/src/complete.ts | 10 ++++---- .../src/context-providers/matrix.test.ts | 2 +- .../src/model/converter/jobs.ts | 2 +- .../src/model/converter/steps.ts | 2 +- .../src/templates/template-reader.ts | 7 +++--- .../tokens/basic-expression-token.ts | 24 ++++++++++++++++--- 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/actions-languageservice/src/complete.expressions.test.ts b/actions-languageservice/src/complete.expressions.test.ts index 070ea21..d7f2b25 100644 --- a/actions-languageservice/src/complete.expressions.test.ts +++ b/actions-languageservice/src/complete.expressions.test.ts @@ -262,6 +262,13 @@ jobs: expect(result.map(x => x.label)).toEqual(["event"]); }); + it("auto-complete complex partial", async () => { + const input = 'run-name: "run ${{ github.ev| }} run"'; + const result = await complete(...getPositionFromCursor(input), undefined, contextProviderConfig); + + expect(result.map(x => x.label)).toEqual(["event"]); + }); + it("using default context provider", async () => { const input = "on: push\njobs:\n build:\n runs-on: ubuntu-latest\n environment:\n url: ${{ runner.| }}\n steps:\n - run: echo"; diff --git a/actions-languageservice/src/complete.ts b/actions-languageservice/src/complete.ts index 54942fb..a0ce6e0 100644 --- a/actions-languageservice/src/complete.ts +++ b/actions-languageservice/src/complete.ts @@ -205,20 +205,18 @@ function getExpressionCompletionItems( context: DescriptionDictionary, pos: Position ): CompletionItem[] { - let expressionInput = ""; let currentInput = ""; - let relCharPos: number = 0; if (isBasicExpression(token)) { - expressionInput = currentInput = token.expression; - relCharPos = getRelCharPos(token.range!, expressionInput, pos); + currentInput = token.source || token.expression; } else { const stringToken = token.assertString("Expected string token for expression completion"); currentInput = stringToken.source || stringToken.value; - relCharPos = getRelCharPos(stringToken.range!, currentInput, pos); - expressionInput = (getExpressionInput(currentInput, relCharPos) || "").trim(); } + const relCharPos = getRelCharPos(token.range!, currentInput, pos); + const expressionInput = (getExpressionInput(currentInput, relCharPos) || "").trim(); + try { return completeExpression(expressionInput, context, [], validatorFunctions).map(item => mapExpressionCompletionItem(item, currentInput[relCharPos]) diff --git a/actions-languageservice/src/context-providers/matrix.test.ts b/actions-languageservice/src/context-providers/matrix.test.ts index 6b8bd99..3285b0d 100644 --- a/actions-languageservice/src/context-providers/matrix.test.ts +++ b/actions-languageservice/src/context-providers/matrix.test.ts @@ -45,7 +45,7 @@ function stringToToken(value: string) { } function expressionToToken(expr: string) { - return new BasicExpressionToken(undefined, undefined, expr, undefined, undefined); + return new BasicExpressionToken(undefined, undefined, expr, undefined, undefined, expr); } function contextFromStrategy(strategy?: TemplateToken) { diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 17aa165..a70cef7 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -111,7 +111,7 @@ function convertJob(context: TemplateContext, jobKey: StringToken, token: Mappin id: jobKey, name: undefined, needs: undefined, - if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined), + if: new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, "success()"), env: undefined, concurrency: undefined, environment: undefined, diff --git a/actions-workflow-parser/src/model/converter/steps.ts b/actions-workflow-parser/src/model/converter/steps.ts index 4adca20..2ecf0e7 100644 --- a/actions-workflow-parser/src/model/converter/steps.ts +++ b/actions-workflow-parser/src/model/converter/steps.ts @@ -52,7 +52,7 @@ function convertStep(context: TemplateContext, idBuilder: IdBuilder, step: Templ let uses: StringToken | undefined; let continueOnError: boolean | undefined; let env: MappingToken | undefined; - const ifCondition = new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined); + const ifCondition = new BasicExpressionToken(undefined, undefined, "success()", undefined, undefined, "success()"); for (const item of mapping) { const key = item.key.assertString("steps item key"); switch (key.value) { diff --git a/actions-workflow-parser/src/templates/template-reader.ts b/actions-workflow-parser/src/templates/template-reader.ts index d00ea75..2bbcbbc 100644 --- a/actions-workflow-parser/src/templates/template-reader.ts +++ b/actions-workflow-parser/src/templates/template-reader.ts @@ -606,8 +606,9 @@ class TemplateReader { this._fileId, token.range, `format('${format.join("")}'${args.join("")})`, - token.definitionInfo, - expressionTokens + definitionInfo, + expressionTokens, + raw ); } @@ -667,7 +668,7 @@ class TemplateReader { // Return the expression return { - expression: new BasicExpressionToken(this._fileId, range, trimmed, definitionInfo, undefined), + expression: new BasicExpressionToken(this._fileId, range, trimmed, definitionInfo, undefined, value), error: undefined }; } diff --git a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts index 6d5912d..b7c29f5 100644 --- a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts +++ b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts @@ -13,6 +13,8 @@ export class BasicExpressionToken extends ExpressionToken { public readonly originalExpressions: BasicExpressionToken[] | undefined; + public readonly source: string; + /** * @param originalExpressions If the basic expression was transformed from individual expressions, these will be the original ones */ @@ -21,11 +23,13 @@ export class BasicExpressionToken extends ExpressionToken { range: TokenRange | undefined, expression: string, definitionInfo: DefinitionInfo | undefined, - originalExpressions: BasicExpressionToken[] | undefined + originalExpressions: BasicExpressionToken[] | undefined, + source: string ) { super(TokenType.BasicExpression, file, range, undefined, definitionInfo); this.expr = expression; this.originalExpressions = originalExpressions; + this.source = source; } public get expression(): string { @@ -34,8 +38,22 @@ export class BasicExpressionToken extends ExpressionToken { public override clone(omitSource?: boolean): TemplateToken { return omitSource - ? new BasicExpressionToken(undefined, undefined, this.expr, this.definitionInfo, this.originalExpressions) - : new BasicExpressionToken(this.file, this.range, this.expr, this.definitionInfo, this.originalExpressions); + ? new BasicExpressionToken( + undefined, + undefined, + this.expr, + this.definitionInfo, + this.originalExpressions, + this.source + ) + : new BasicExpressionToken( + this.file, + this.range, + this.expr, + this.definitionInfo, + this.originalExpressions, + this.source + ); } public override toString(): string { From 99612e73ab1625509e7b92abbf4b9151c36f60ee Mon Sep 17 00:00:00 2001 From: Beth Brennan Date: Tue, 7 Feb 2023 17:45:34 -0500 Subject: [PATCH 2/2] Merge clean up --- actions-workflow-parser/src/model/converter/jobs.ts | 1 - .../src/templates/tokens/basic-expression-token.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/actions-workflow-parser/src/model/converter/jobs.ts b/actions-workflow-parser/src/model/converter/jobs.ts index 50152b9..b07e368 100644 --- a/actions-workflow-parser/src/model/converter/jobs.ts +++ b/actions-workflow-parser/src/model/converter/jobs.ts @@ -96,4 +96,3 @@ function validateNeeds( } } } - diff --git a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts index 89295fd..01c7a44 100644 --- a/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts +++ b/actions-workflow-parser/src/templates/tokens/basic-expression-token.ts @@ -15,8 +15,6 @@ export class BasicExpressionToken extends ExpressionToken { public readonly originalExpressions: BasicExpressionToken[] | undefined; - public readonly source: string; - /** * The range of the expression within the source string. *