From 4ff09b2a8adcd18cc9e724e308aedb82b012ab9a Mon Sep 17 00:00:00 2001 From: Christopher Schleiden Date: Wed, 11 Jan 2023 10:59:06 -0800 Subject: [PATCH] Move description dictionary to a new file --- actions-expressions/src/completion.test.ts | 3 +- actions-expressions/src/completion.ts | 33 ++----------------- .../completion/descriptionDictionary.test.ts | 30 +++++++++++++++++ .../src/completion/descriptionDictionary.ts | 32 ++++++++++++++++++ actions-expressions/src/index.ts | 3 +- 5 files changed, 68 insertions(+), 33 deletions(-) create mode 100644 actions-expressions/src/completion/descriptionDictionary.test.ts create mode 100644 actions-expressions/src/completion/descriptionDictionary.ts diff --git a/actions-expressions/src/completion.test.ts b/actions-expressions/src/completion.test.ts index 9a4257d..559f540 100644 --- a/actions-expressions/src/completion.test.ts +++ b/actions-expressions/src/completion.test.ts @@ -1,4 +1,5 @@ -import {complete, CompletionItem, DescriptionDictionary, trimTokenVector} from "./completion"; +import {complete, CompletionItem, trimTokenVector} from "./completion"; +import {DescriptionDictionary} from "./completion/descriptionDictionary"; import {BooleanData} from "./data/boolean"; import {Dictionary} from "./data/dictionary"; import {StringData} from "./data/string"; diff --git a/actions-expressions/src/completion.ts b/actions-expressions/src/completion.ts index f647dfa..b6a965b 100644 --- a/actions-expressions/src/completion.ts +++ b/actions-expressions/src/completion.ts @@ -1,5 +1,6 @@ +import {DescriptionPair} from "./completion/descriptionDictionary"; import {Dictionary, isDictionary} from "./data/dictionary"; -import {ExpressionData, Kind, Pair} from "./data/expressiondata"; +import {ExpressionData} from "./data/expressiondata"; import {Evaluator} from "./evaluator"; import {wellKnownFunctions} from "./funcs"; import {FunctionInfo} from "./funcs/info"; @@ -12,36 +13,6 @@ export type CompletionItem = { function: boolean; }; -export type DescriptionPair = Pair & {description?: string}; - -export class DescriptionDictionary extends Dictionary { - private readonly descriptions = new Map(); - - constructor(...pairs: DescriptionPair[]) { - super(); - - for (const p of pairs) { - this.add(p.key, p.value, p.description); - } - } - - override add(key: string, value: ExpressionData, description?: string): void { - super.add(key, value); - if (description) { - this.descriptions.set(key, description); - } - } - - override pairs(): DescriptionPair[] { - const pairs = super.pairs(); - return pairs.map(p => ({...p, description: this.descriptions.get(p.key)})); - } -} - -export function isDescriptionDictionary(x: ExpressionData): x is DescriptionDictionary { - return x.kind === Kind.Dictionary && x instanceof DescriptionDictionary; -} - // Complete returns a list of completion items for the given expression. // // The main functionality is auto-completing functions and context access: diff --git a/actions-expressions/src/completion/descriptionDictionary.test.ts b/actions-expressions/src/completion/descriptionDictionary.test.ts new file mode 100644 index 0000000..960c289 --- /dev/null +++ b/actions-expressions/src/completion/descriptionDictionary.test.ts @@ -0,0 +1,30 @@ +import {StringData} from "../data"; +import {DescriptionDictionary} from "./descriptionDictionary"; + +describe("description dictionary", () => { + it("pairs contains all values", () => { + const d = new DescriptionDictionary(); + d.add("ABC", new StringData("val")); + + expect(d.pairs()).toEqual([{key: "ABC", value: new StringData("val")}]); + }); + + it("does not add duplicate entries", () => { + const d = new DescriptionDictionary(); + d.add("ABC", new StringData("val1")); + d.add("abc", new StringData("val2")); + + expect(d.pairs()).toEqual([{key: "ABC", value: new StringData("val1")}]); + }); + + it("can set optional descriptions", () => { + const d = new DescriptionDictionary(); + d.add("ABC", new StringData("val"), "desc"); + d.add("DEF", new StringData("val")); + + expect(d.pairs()).toEqual([ + {key: "ABC", value: new StringData("val"), description: "desc"}, + {key: "DEF", value: new StringData("val")} + ]); + }); +}); diff --git a/actions-expressions/src/completion/descriptionDictionary.ts b/actions-expressions/src/completion/descriptionDictionary.ts new file mode 100644 index 0000000..8e07bb3 --- /dev/null +++ b/actions-expressions/src/completion/descriptionDictionary.ts @@ -0,0 +1,32 @@ +import {Dictionary} from "../data/dictionary"; +import {ExpressionData, Kind, Pair} from "../data/expressiondata"; + +export type DescriptionPair = Pair & {description?: string}; + +export function isDescriptionDictionary(x: ExpressionData): x is DescriptionDictionary { + return x.kind === Kind.Dictionary && x instanceof DescriptionDictionary; +} + +export class DescriptionDictionary extends Dictionary { + private readonly descriptions = new Map(); + + constructor(...pairs: DescriptionPair[]) { + super(); + + for (const p of pairs) { + this.add(p.key, p.value, p.description); + } + } + + override add(key: string, value: ExpressionData, description?: string): void { + super.add(key, value); + if (description) { + this.descriptions.set(key, description); + } + } + + override pairs(): DescriptionPair[] { + const pairs = super.pairs(); + return pairs.map(p => ({...p, description: this.descriptions.get(p.key)})); + } +} diff --git a/actions-expressions/src/index.ts b/actions-expressions/src/index.ts index 53fc82a..06eda82 100644 --- a/actions-expressions/src/index.ts +++ b/actions-expressions/src/index.ts @@ -1,5 +1,6 @@ export {Expr} from "./ast"; -export {complete, CompletionItem, DescriptionDictionary, DescriptionPair, isDescriptionDictionary} from "./completion"; +export {complete, CompletionItem} from "./completion"; +export {DescriptionDictionary, DescriptionPair, isDescriptionDictionary} from "./completion/descriptionDictionary"; export * as data from "./data"; export {ExpressionError} from "./errors"; export {Evaluator} from "./evaluator";