From 9ecbd0bdd14da03a884d2ca53534dc3e67b72637 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 27 Mar 2024 13:26:09 +0100 Subject: [PATCH] First re-bootstrap of schema --- .../schema/src/compiler/genconverter.ts | 15 ++-- .../schema/src/compiler/genunconverter.ts | 4 +- .../schema/src/compiler/rendertype.ts | 8 +- .../packages/schema/src/compiler/value.ts | 2 +- .../packages/schema/src/gen/schema.ts | 86 +++++++++---------- 5 files changed, 60 insertions(+), 55 deletions(-) diff --git a/implementations/javascript/packages/schema/src/compiler/genconverter.ts b/implementations/javascript/packages/schema/src/compiler/genconverter.ts index 6f670a7..6b2a517 100644 --- a/implementations/javascript/packages/schema/src/compiler/genconverter.ts +++ b/implementations/javascript/packages/schema/src/compiler/genconverter.ts @@ -192,7 +192,7 @@ export function converterForSimple( const v = ctx.gentempname(); return [ seq(`${dest} = new _.EncodableSet`, - anglebrackets(renderType(ctx.mod, vt), '_embedded'), + anglebrackets('_embedded', renderType(ctx.mod, vt)), parens(encoderForSimplePattern(ctx, p.pattern) ?? `v => v`)), seq(`for (const ${v} of ${src}) `, ctx.block(() => [ ... converterFor(ctx, M.anonymousSimplePattern(p.pattern), v, vv => @@ -203,17 +203,19 @@ export function converterForSimple( case 'dictof': return [`${dest} = void 0`, seq(`if (_.Dictionary.isDictionary<_embedded>(${src})) `, ctx.block(() => { + const srcMap = ctx.gentempname(); const resolver = ctx.mod.resolver(); const kt = simpleType(resolver, p.key); const vt = simpleType(resolver, p.value); const k = ctx.gentempname(); const v = ctx.gentempname(); return [ + seq(`const ${srcMap} = new _.DictionaryMap(${src})`), seq(`${dest} = new _.EncodableDictionary`, - anglebrackets(renderType(ctx.mod, kt), renderType(ctx.mod, vt), '_embedded'), + anglebrackets('_embedded', renderType(ctx.mod, kt), renderType(ctx.mod, vt)), parens(encoderForSimplePattern(ctx, p.key) ?? `k => k`, encoderForSimplePattern(ctx, p.value) ?? `v => v`)), - seq(`for (const [${k}, ${v}] of ${src}) `, ctx.block(() => [ + seq(`for (const [${k}, ${v}] of ${srcMap}) `, ctx.block(() => [ ... converterFor(ctx, M.anonymousSimplePattern(p.key), k, kk => converterFor(ctx, M.anonymousSimplePattern(p.value), v, vv => [`${dest}.set(${kk}, ${vv})`, `continue`])), @@ -251,12 +253,13 @@ function converterForCompound( case 'tuplePrefix': return converterForTuple(ctx, p.fixed, src, knownArray, p.variable, ks); case 'dict': { + const srcMap = ctx.gentempname(); const entries = Array.from(p.entries); function loop(i: number): Item[] { if (i < entries.length) { const [k, n] = entries[i]; const tmpSrc = ctx.gentemp(); - return [seq(`if ((${tmpSrc} = ${src}.get(${ctx.mod.literal(k)})) !== void 0) `, + return [seq(`if ((${tmpSrc} = ${srcMap}.get(${ctx.mod.literal(k)})) !== void 0) `, ctx.block(() => converterFor( ctx, @@ -267,7 +270,9 @@ function converterForCompound( return ks(); } } - return [seq(`if (_.Dictionary.isDictionary<_embedded>(${src})) `, ctx.block(() => loop(0)))]; + return [seq(`if (_.Dictionary.isDictionary<_embedded>(${src})) `, ctx.block(() => [ + seq(`const ${srcMap} = new _.DictionaryMap(${src})`), + ... loop(0)]))]; } default: ((_p: never) => {})(p); diff --git a/implementations/javascript/packages/schema/src/compiler/genunconverter.ts b/implementations/javascript/packages/schema/src/compiler/genunconverter.ts index d3fdda8..3035e73 100644 --- a/implementations/javascript/packages/schema/src/compiler/genunconverter.ts +++ b/implementations/javascript/packages/schema/src/compiler/genunconverter.ts @@ -57,7 +57,7 @@ function unconverterFor(ctx: FunctionContext, p: M.Pattern, src: string): Item { unconverterFor(ctx, M.Pattern.SimplePattern(p.pattern), 'v'), `)`))); case 'dictof': - return seq(`new _.Dictionary<_embedded>`, parens(seq( + return seq(`_.Dictionary.from<_embedded>`, parens(seq( `_.Array.from(${src}.entries()).map(([k, v]) => `, brackets( unconverterFor(ctx, M.Pattern.SimplePattern(p.key), 'k'), @@ -95,7 +95,7 @@ function unconverterFor(ctx: FunctionContext, p: M.Pattern, src: string): Item { } } case 'dict': - return seq(`new _.Dictionary<_embedded>`, parens( + return seq(`_.Dictionary.from<_embedded>`, parens( brackets(... Array.from(p.entries.entries()).map(([k, n]) => brackets( ctx.mod.literal(k), diff --git a/implementations/javascript/packages/schema/src/compiler/rendertype.ts b/implementations/javascript/packages/schema/src/compiler/rendertype.ts index 9b99fe6..70e67f4 100644 --- a/implementations/javascript/packages/schema/src/compiler/rendertype.ts +++ b/implementations/javascript/packages/schema/src/compiler/rendertype.ts @@ -47,12 +47,12 @@ export function renderType(ctxt: ModuleContext, t: Type): Item { return seq(t.typeName, ctxt.genericArgsFor(t)); } case 'set': return seq('_.EncodableSet', anglebrackets( - renderType(ctxt, t.type), - '_embedded')); + '_embedded', + renderType(ctxt, t.type))); case 'dictionary': return seq('_.EncodableDictionary', anglebrackets( + '_embedded', renderType(ctxt, t.key), - renderType(ctxt, t.value), - '_embedded')); + renderType(ctxt, t.value))); case 'array': return seq('Array', anglebrackets(renderType(ctxt, t.type))); case 'record': return braces(... simpleTypeFields(ctxt, t)); default: diff --git a/implementations/javascript/packages/schema/src/compiler/value.ts b/implementations/javascript/packages/schema/src/compiler/value.ts index 7fd0a98..6a97523 100644 --- a/implementations/javascript/packages/schema/src/compiler/value.ts +++ b/implementations/javascript/packages/schema/src/compiler/value.ts @@ -23,7 +23,7 @@ export function sourceCodeFor(v: Value): Item { return seq('new _.Set<_.Value<_embedded>>', parens(brackets(... Array.from(s).map(k)))); }, dictionary(d: DictionaryMap, k: Fold): Item { - return seq('new _.Dictionary<_embedded>', parens(brackets(... Array.from(d).map(([kk,vv]) => + return seq('_.Dictionary.from<_embedded>', parens(brackets(... Array.from(d).map(([kk,vv]) => brackets(k(kk), k(vv)))))); }, diff --git a/implementations/javascript/packages/schema/src/gen/schema.ts b/implementations/javascript/packages/schema/src/gen/schema.ts index 2d996fa..19492cb 100644 --- a/implementations/javascript/packages/schema/src/gen/schema.ts +++ b/implementations/javascript/packages/schema/src/gen/schema.ts @@ -920,15 +920,15 @@ export function toModules<_embedded extends _.Embeddable = _.GenericEmbedded>(v: let result: undefined | Modules<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - const vMap = _.Dictionary.asMap(v); + const _tmp1 = new _.DictionaryMap(v); _tmp0 = new _.EncodableDictionary<_embedded, ModulePath, Schema<_embedded>>(fromModulePath, fromSchema<_embedded>); - for (const [_tmp1, _tmp2] of vMap) { - let _tmp3: (ModulePath) | undefined; - _tmp3 = toModulePath(_tmp1); - if (_tmp3 !== void 0) { - let _tmp4: (Schema<_embedded>) | undefined; - _tmp4 = toSchema(_tmp2); - if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; + for (const [_tmp2, _tmp3] of _tmp1) { + let _tmp4: (ModulePath) | undefined; + _tmp4 = toModulePath(_tmp2); + if (_tmp4 !== void 0) { + let _tmp5: (Schema<_embedded>) | undefined; + _tmp5 = toSchema(_tmp3); + if (_tmp5 !== void 0) {_tmp0.set(_tmp4, _tmp5); continue;}; }; _tmp0 = void 0; break; @@ -959,26 +959,26 @@ export function toSchema<_embedded extends _.Embeddable = _.GenericEmbedded>(v: _tmp0 = _.is(v.label, $schema) ? {} : void 0; if (_tmp0 !== void 0) { if (_.Dictionary.isDictionary<_embedded>(v[0])) { - const v0 = _.Dictionary.asMap(v[0]); - let _tmp1: (_.Value<_embedded>) | undefined; - if ((_tmp1 = v0.get($version)) !== void 0) { - let _tmp2: (Version) | undefined; - _tmp2 = toVersion(_tmp1); - if (_tmp2 !== void 0) { - let _tmp3: (_.Value<_embedded>) | undefined; - if ((_tmp3 = v0.get($embeddedType)) !== void 0) { - let _tmp4: (EmbeddedTypeName) | undefined; - _tmp4 = toEmbeddedTypeName(_tmp3); - if (_tmp4 !== void 0) { - let _tmp5: (_.Value<_embedded>) | undefined; - if ((_tmp5 = v0.get($definitions)) !== void 0) { - let _tmp6: (Definitions<_embedded>) | undefined; - _tmp6 = toDefinitions(_tmp5); - if (_tmp6 !== void 0) { + let _tmp2: (_.Value<_embedded>) | undefined; + const _tmp1 = new _.DictionaryMap(v[0]); + if ((_tmp2 = _tmp1.get($version)) !== void 0) { + let _tmp3: (Version) | undefined; + _tmp3 = toVersion(_tmp2); + if (_tmp3 !== void 0) { + let _tmp4: (_.Value<_embedded>) | undefined; + if ((_tmp4 = _tmp1.get($embeddedType)) !== void 0) { + let _tmp5: (EmbeddedTypeName) | undefined; + _tmp5 = toEmbeddedTypeName(_tmp4); + if (_tmp5 !== void 0) { + let _tmp6: (_.Value<_embedded>) | undefined; + if ((_tmp6 = _tmp1.get($definitions)) !== void 0) { + let _tmp7: (Definitions<_embedded>) | undefined; + _tmp7 = toDefinitions(_tmp6); + if (_tmp7 !== void 0) { result = { - "version": _tmp2, - "embeddedType": _tmp4, - "definitions": _tmp6, + "version": _tmp3, + "embeddedType": _tmp5, + "definitions": _tmp7, __as_preserve__() {return fromSchema(this);}, __preserve_on__(e) { e.push(fromSchema(this)); }, __preserve_text_on__(w) { w.push(fromSchema(this)); } @@ -1090,15 +1090,15 @@ export function toDefinitions<_embedded extends _.Embeddable = _.GenericEmbedded let result: undefined | Definitions<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - const vMap = _.Dictionary.asMap(v); + const _tmp1 = new _.DictionaryMap(v); _tmp0 = new _.EncodableDictionary<_embedded, symbol, Definition<_embedded>>(k => k, fromDefinition<_embedded>); - for (const [_tmp1, _tmp2] of vMap) { - let _tmp3: (symbol) | undefined; - _tmp3 = typeof _tmp1 === 'symbol' ? _tmp1 : void 0; - if (_tmp3 !== void 0) { - let _tmp4: (Definition<_embedded>) | undefined; - _tmp4 = toDefinition(_tmp2); - if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; + for (const [_tmp2, _tmp3] of _tmp1) { + let _tmp4: (symbol) | undefined; + _tmp4 = typeof _tmp2 === 'symbol' ? _tmp2 : void 0; + if (_tmp4 !== void 0) { + let _tmp5: (Definition<_embedded>) | undefined; + _tmp5 = toDefinition(_tmp3); + if (_tmp5 !== void 0) {_tmp0.set(_tmp4, _tmp5); continue;}; }; _tmp0 = void 0; break; @@ -1623,15 +1623,15 @@ export function toDictionaryEntries<_embedded extends _.Embeddable = _.GenericEm let result: undefined | DictionaryEntries<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - const vMap = _.Dictionary.asMap(v); + const _tmp1 = new _.DictionaryMap(v); _tmp0 = new _.EncodableDictionary<_embedded, _.Value<_embedded>, NamedSimplePattern<_embedded>>(k => k, fromNamedSimplePattern<_embedded>); - for (const [_tmp1, _tmp2] of vMap) { - let _tmp3: (_.Value<_embedded>) | undefined; - _tmp3 = _tmp1; - if (_tmp3 !== void 0) { - let _tmp4: (NamedSimplePattern<_embedded>) | undefined; - _tmp4 = toNamedSimplePattern(_tmp2); - if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; + for (const [_tmp2, _tmp3] of _tmp1) { + let _tmp4: (_.Value<_embedded>) | undefined; + _tmp4 = _tmp2; + if (_tmp4 !== void 0) { + let _tmp5: (NamedSimplePattern<_embedded>) | undefined; + _tmp5 = toNamedSimplePattern(_tmp3); + if (_tmp5 !== void 0) {_tmp0.set(_tmp4, _tmp5); continue;}; }; _tmp0 = void 0; break;