Refactoring of uncertain benefit: allow multiple function definitions at once

This commit is contained in:
Tony Garnock-Jones 2021-12-03 14:42:49 +01:00
parent e12d978915
commit 6576f30639
3 changed files with 35 additions and 35 deletions

View File

@ -31,13 +31,13 @@ export function compile(
` = `, renderType(mod, t), `;`)); ` = `, renderType(mod, t), `;`));
if (t.kind === 'union') { if (t.kind === 'union') {
mod.defineFunction(_ctx => mod.defineFunctions(_ctx =>
seq(`export namespace ${nameStr} `, block( [seq(`export namespace ${nameStr} `, block(
... Array.from(t.variants).map(([vn, vt]) => ... Array.from(t.variants).flatMap(([vn, vt]) =>
genConstructor(mod, vn, vn, vt, t, resultTypeItem)) genConstructor(mod, vn, vn, vt, t, resultTypeItem))
))); ))]);
} else { } else {
mod.defineFunction(_ctx => mod.defineFunctions(_ctx =>
genConstructor(mod, nameStr, void 0, t, t, resultTypeItem)); genConstructor(mod, nameStr, void 0, t, t, resultTypeItem));
} }
} }
@ -46,26 +46,26 @@ export function compile(
const t = typeForDefinition(mod.resolver(), def); const t = typeForDefinition(mod.resolver(), def);
const name = name0 as symbol; const name = name0 as symbol;
mod.defineFunction(ctx => mod.defineFunctions(ctx =>
seq(`export function as${name.description!}`, mod.genericParameters(), [seq(`export function as${name.description!}`, mod.genericParameters(),
`(v: _.Value<_embedded>): `, name.description!, mod.genericArgsFor(t), ` `, `(v: _.Value<_embedded>): `, name.description!, mod.genericArgsFor(t), ` `,
ctx.block(() => [ ctx.block(() => [
seq(`let result = to${name.description!}(v)`), seq(`let result = to${name.description!}(v)`),
seq(`if (result === void 0) `, seq(`if (result === void 0) `,
`throw new TypeError(\`Invalid ${name.description!}: \${_.stringify(v)}\`)`), `throw new TypeError(\`Invalid ${name.description!}: \${_.stringify(v)}\`)`),
seq(`return result`)]))); seq(`return result`)]))]);
mod.defineFunction(ctx => mod.defineFunctions(ctx =>
seq(`export function to${name.description!}`, mod.genericParameters(), [seq(`export function to${name.description!}`, mod.genericParameters(),
`(v: _.Value<_embedded>): undefined | `, name.description!, mod.genericArgsFor(t), ` `, `(v: _.Value<_embedded>): undefined | `, name.description!, mod.genericArgsFor(t), ` `,
ctx.block(() => [seq(`let result: undefined | `, name.description!, mod.genericArgsFor(t)), ctx.block(() => [seq(`let result: undefined | `, name.description!, mod.genericArgsFor(t)),
... converterForDefinition(ctx, def, `v`, `result`), ... converterForDefinition(ctx, def, `v`, `result`),
seq(`return result`)]))); seq(`return result`)]))]);
mod.defineFunction(ctx => mod.defineFunctions(ctx =>
seq(`export function from${name.description!}`, mod.genericParameters(), [seq(`export function from${name.description!}`, mod.genericParameters(),
`(_v: `, name.description!, mod.genericArgsFor(t), `): _.Value<_embedded> `, `(_v: `, name.description!, mod.genericArgsFor(t), `): _.Value<_embedded> `,
ctx.block(() => unconverterForDefinition(ctx, def, `_v`)))); ctx.block(() => unconverterForDefinition(ctx, def, `_v`)))]);
} }
const f = new Formatter(); const f = new Formatter();

View File

@ -83,8 +83,8 @@ export class ModuleContext {
this.typedefs.push(f); this.typedefs.push(f);
} }
defineFunction(f: (ctx: FunctionContext) => Item): void { defineFunctions(f: (ctx: FunctionContext) => Item[]): void {
this.functiondefs.push(f(new FunctionContext(this))); this.functiondefs.push(... f(new FunctionContext(this)));
} }
resolver(modulePath?: M.ModulePath): (ref: M.Ref) => RefType { resolver(modulePath?: M.ModulePath): (ref: M.Ref) => RefType {

View File

@ -11,7 +11,7 @@ export function genConstructor(
arg: SimpleType, arg: SimpleType,
resultType: Type, resultType: Type,
resultTypeItem: Item, resultTypeItem: Item,
): Item { ): Item[] {
const formals: Array<[string, FieldType]> = []; const formals: Array<[string, FieldType]> = [];
let simpleValue = false; let simpleValue = false;
@ -38,13 +38,13 @@ export function genConstructor(
braces(...formals.map(f => seq(M.jsId(f[0]), ': ', renderType(mod, f[1])))))] 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]))); : formals.map(f => seq(M.jsId(f[0]), ': ', renderType(mod, f[1])));
return seq(`export function ${M.jsId(name)}`, mod.genericParametersFor(resultType), return [seq(`export function ${M.jsId(name)}`, mod.genericParametersFor(resultType),
parens(... declArgs), parens(...declArgs),
': ', resultTypeItem, ' ', block( ': ', resultTypeItem, ' ', block(
seq(`return `, seq(`return `,
((arg.kind === 'unit' && initializers.length === 0) ((arg.kind === 'unit' && initializers.length === 0)
? 'null' ? 'null'
: (simpleValue : (simpleValue
? 'value' ? 'value'
: braces(... initializers)))))); : braces(...initializers))))))];
} }