From 6576f30639a4dd3a0b8fdf1c5c91345987986c6e Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 3 Dec 2021 14:42:49 +0100 Subject: [PATCH] Refactoring of uncertain benefit: allow multiple function definitions at once --- .../packages/schema/src/compiler.ts | 46 +++++++++---------- .../packages/schema/src/compiler/context.ts | 4 +- .../packages/schema/src/compiler/genctor.ts | 20 ++++---- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/implementations/javascript/packages/schema/src/compiler.ts b/implementations/javascript/packages/schema/src/compiler.ts index fd2f834..f052f2f 100644 --- a/implementations/javascript/packages/schema/src/compiler.ts +++ b/implementations/javascript/packages/schema/src/compiler.ts @@ -31,13 +31,13 @@ export function compile( ` = `, renderType(mod, t), `;`)); if (t.kind === 'union') { - mod.defineFunction(_ctx => - seq(`export namespace ${nameStr} `, block( - ... Array.from(t.variants).map(([vn, vt]) => + mod.defineFunctions(_ctx => + [seq(`export namespace ${nameStr} `, block( + ... Array.from(t.variants).flatMap(([vn, vt]) => genConstructor(mod, vn, vn, vt, t, resultTypeItem)) - ))); + ))]); } else { - mod.defineFunction(_ctx => + mod.defineFunctions(_ctx => genConstructor(mod, nameStr, void 0, t, t, resultTypeItem)); } } @@ -46,26 +46,26 @@ export function compile( const t = typeForDefinition(mod.resolver(), def); const name = name0 as symbol; - mod.defineFunction(ctx => - seq(`export function as${name.description!}`, mod.genericParameters(), - `(v: _.Value<_embedded>): `, name.description!, mod.genericArgsFor(t), ` `, - ctx.block(() => [ - seq(`let result = to${name.description!}(v)`), - seq(`if (result === void 0) `, - `throw new TypeError(\`Invalid ${name.description!}: \${_.stringify(v)}\`)`), - seq(`return result`)]))); + mod.defineFunctions(ctx => + [seq(`export function as${name.description!}`, mod.genericParameters(), + `(v: _.Value<_embedded>): `, name.description!, mod.genericArgsFor(t), ` `, + ctx.block(() => [ + seq(`let result = to${name.description!}(v)`), + seq(`if (result === void 0) `, + `throw new TypeError(\`Invalid ${name.description!}: \${_.stringify(v)}\`)`), + seq(`return result`)]))]); - mod.defineFunction(ctx => - seq(`export function to${name.description!}`, mod.genericParameters(), - `(v: _.Value<_embedded>): undefined | `, name.description!, mod.genericArgsFor(t), ` `, - ctx.block(() => [seq(`let result: undefined | `, name.description!, mod.genericArgsFor(t)), - ... converterForDefinition(ctx, def, `v`, `result`), - seq(`return result`)]))); + mod.defineFunctions(ctx => + [seq(`export function to${name.description!}`, mod.genericParameters(), + `(v: _.Value<_embedded>): undefined | `, name.description!, mod.genericArgsFor(t), ` `, + ctx.block(() => [seq(`let result: undefined | `, name.description!, mod.genericArgsFor(t)), + ... converterForDefinition(ctx, def, `v`, `result`), + seq(`return result`)]))]); - mod.defineFunction(ctx => - seq(`export function from${name.description!}`, mod.genericParameters(), - `(_v: `, name.description!, mod.genericArgsFor(t), `): _.Value<_embedded> `, - ctx.block(() => unconverterForDefinition(ctx, def, `_v`)))); + mod.defineFunctions(ctx => + [seq(`export function from${name.description!}`, mod.genericParameters(), + `(_v: `, name.description!, mod.genericArgsFor(t), `): _.Value<_embedded> `, + ctx.block(() => unconverterForDefinition(ctx, def, `_v`)))]); } const f = new Formatter(); diff --git a/implementations/javascript/packages/schema/src/compiler/context.ts b/implementations/javascript/packages/schema/src/compiler/context.ts index 88d4ed1..d0451dd 100644 --- a/implementations/javascript/packages/schema/src/compiler/context.ts +++ b/implementations/javascript/packages/schema/src/compiler/context.ts @@ -83,8 +83,8 @@ export class ModuleContext { this.typedefs.push(f); } - defineFunction(f: (ctx: FunctionContext) => Item): void { - this.functiondefs.push(f(new FunctionContext(this))); + defineFunctions(f: (ctx: FunctionContext) => Item[]): void { + this.functiondefs.push(... f(new FunctionContext(this))); } resolver(modulePath?: M.ModulePath): (ref: M.Ref) => RefType { diff --git a/implementations/javascript/packages/schema/src/compiler/genctor.ts b/implementations/javascript/packages/schema/src/compiler/genctor.ts index 8e9ebd4..6feacff 100644 --- a/implementations/javascript/packages/schema/src/compiler/genctor.ts +++ b/implementations/javascript/packages/schema/src/compiler/genctor.ts @@ -11,7 +11,7 @@ export function genConstructor( arg: SimpleType, resultType: Type, resultTypeItem: Item, -): Item { +): Item[] { const formals: Array<[string, FieldType]> = []; let simpleValue = false; @@ -38,13 +38,13 @@ export function genConstructor( braces(...formals.map(f => seq(M.jsId(f[0]), ': ', renderType(mod, f[1])))))] : formals.map(f => seq(M.jsId(f[0]), ': ', renderType(mod, f[1]))); - return seq(`export function ${M.jsId(name)}`, mod.genericParametersFor(resultType), - parens(... declArgs), - ': ', resultTypeItem, ' ', block( - seq(`return `, - ((arg.kind === 'unit' && initializers.length === 0) - ? 'null' - : (simpleValue - ? 'value' - : braces(... initializers)))))); + return [seq(`export function ${M.jsId(name)}`, mod.genericParametersFor(resultType), + parens(...declArgs), + ': ', resultTypeItem, ' ', block( + seq(`return `, + ((arg.kind === 'unit' && initializers.length === 0) + ? 'null' + : (simpleValue + ? 'value' + : braces(...initializers))))))]; }