From 634f7ecbd4dc53c1f5dcc3e6c12bf4ed072dcf11 Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Thu, 2 Feb 2023 08:53:01 -0800 Subject: [PATCH] Extract helper functions --- actions-languageservice/src/utils/rel-char-pos.ts | 15 +++++++++++++++ actions-languageservice/src/utils/type-guards.ts | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 actions-languageservice/src/utils/rel-char-pos.ts create mode 100644 actions-languageservice/src/utils/type-guards.ts diff --git a/actions-languageservice/src/utils/rel-char-pos.ts b/actions-languageservice/src/utils/rel-char-pos.ts new file mode 100644 index 0000000..3ffa100 --- /dev/null +++ b/actions-languageservice/src/utils/rel-char-pos.ts @@ -0,0 +1,15 @@ +import {TokenRange} from "@github/actions-workflow-parser/templates/tokens/token-range"; +import {Position} from "vscode-languageserver-textdocument"; +import {mapRange} from "./range"; + +export function getRelCharOffset(tokenRange: TokenRange, currentInput: string, pos: Position): number { + const range = mapRange(tokenRange); + if (range.start.line !== range.end.line) { + const lines = currentInput.split("\n"); + const lineDiff = pos.line - range.start.line - 1; + const linesBeforeCusor = lines.slice(0, lineDiff); + return linesBeforeCusor.join("\n").length + pos.character + 1; + } else { + return pos.character - range.start.character; + } +} diff --git a/actions-languageservice/src/utils/type-guards.ts b/actions-languageservice/src/utils/type-guards.ts new file mode 100644 index 0000000..62fbe2e --- /dev/null +++ b/actions-languageservice/src/utils/type-guards.ts @@ -0,0 +1,12 @@ +import {isString} from "@github/actions-workflow-parser"; +import {DefinitionType} from "@github/actions-workflow-parser/templates/schema/definition-type"; +import {StringDefinition} from "@github/actions-workflow-parser/templates/schema/string-definition"; +import {OPEN_EXPRESSION} from "@github/actions-workflow-parser/templates/template-constants"; +import {TemplateToken} from "@github/actions-workflow-parser/templates/tokens/index"; + +export function isStringExpression(token: TemplateToken): boolean { + const isExpression = + token.definition?.definitionType === DefinitionType.String && (token.definition as StringDefinition).isExpression; + const containsExpression = isString(token) && token.value.indexOf(OPEN_EXPRESSION) >= 0; + return isExpression || containsExpression; +}