json-as 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +417 -0
- package/README.md +96 -14
- package/assembly/deserialize/index/typedarray.ts +14 -0
- package/assembly/deserialize/simd/string.ts +3 -3
- package/assembly/deserialize/simple/string.ts +88 -2
- package/assembly/deserialize/swar/string.ts +8 -11
- package/assembly/index.ts +137 -181
- package/assembly/serialize/index/arbitrary.ts +5 -0
- package/assembly/serialize/index/typedarray.ts +65 -0
- package/assembly/serialize/simd/string.ts +3 -11
- package/assembly/serialize/simple/arbitrary.ts +6 -0
- package/assembly/serialize/simple/string.ts +3 -11
- package/assembly/serialize/swar/string.ts +3 -11
- package/assembly/util/swar.ts +49 -0
- package/lib/as-bs.ts +88 -69
- package/package.json +19 -1
- package/transform/lib/index.d.ts +1 -0
- package/transform/lib/index.d.ts.map +1 -1
- package/transform/lib/index.js +153 -32
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/custom.d.ts.map +1 -1
- package/transform/lib/linkers/custom.js +7 -3
- package/transform/lib/linkers/custom.js.map +1 -1
- package/transform/lib/types.d.ts +2 -0
- package/transform/lib/types.d.ts.map +1 -1
- package/transform/lib/types.js +13 -0
- package/transform/lib/types.js.map +1 -1
- package/.as-test/coverage/naive/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/naive/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/naive/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/naive/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/simd/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/simd/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/simd/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.arbitrary.spec.ts.log.json +0 -5628
- package/.as-test/coverage/swar/coverage.array.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.bool.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.box.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.custom.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.date.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.enum.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.float.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.generics.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.hierarchy.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.integer.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.map.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.namespace.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.null.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.raw.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.resolving.spec.ts.log.json +0 -5628
- package/.as-test/coverage/swar/coverage.set.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.staticarray.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.string.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.struct.spec.ts.log.json +0 -5187
- package/.as-test/coverage/swar/coverage.types.spec.ts.log.json +0 -5187
- package/.as-test/logs/naive/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/naive/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/naive/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/naive/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/naive/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/naive/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/naive/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/naive/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/naive/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/naive/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/naive/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/naive/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/naive/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/naive/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/naive/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/naive/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/naive/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/naive/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/naive/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/naive/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/naive/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/naive/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/naive/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/naive/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/naive/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/naive/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/naive/test.log.json +0 -2289
- package/.as-test/logs/naive/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/naive/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/naive/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/naive/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/naive/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/naive/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/naive/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/naive/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/naive/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/simd/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/simd/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/simd/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/simd/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/simd/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/simd/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/simd/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/simd/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/simd/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/simd/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/simd/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/simd/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/simd/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/simd/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/simd/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/simd/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/simd/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/simd/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/simd/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/simd/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/simd/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/simd/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/simd/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/simd/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/simd/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/simd/test.log.json +0 -11371
- package/.as-test/logs/simd/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/simd/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/simd/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/simd/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/simd/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/simd/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/simd/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/simd/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/simd/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/swar/run.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/swar/run.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/swar/run.box.spec.ts.log.json +0 -353
- package/.as-test/logs/swar/run.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/run.date.spec.ts.log.json +0 -397
- package/.as-test/logs/swar/run.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/swar/run.float.spec.ts.log.json +0 -453
- package/.as-test/logs/swar/run.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/swar/run.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/swar/run.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/swar/run.map.spec.ts.log.json +0 -247
- package/.as-test/logs/swar/run.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/swar/run.null.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/run.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/run.set.spec.ts.log.json +0 -733
- package/.as-test/logs/swar/run.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/swar/run.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/swar/run.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/swar/run.types.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/swar/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/swar/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/swar/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/swar/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/swar/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/swar/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/swar/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/swar/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/swar/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/swar/test.log.json +0 -11371
- package/.as-test/logs/swar/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/swar/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/swar/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/swar/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/swar/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/swar/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/swar/test.string.spec.ts.log.json +0 -2345
- package/.as-test/logs/swar/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/swar/test.types.spec.ts.log.json +0 -273
- package/.as-test/logs/test.arbitrary.spec.ts.log.json +0 -943
- package/.as-test/logs/test.array.spec.ts.log.json +0 -1053
- package/.as-test/logs/test.bool.spec.ts.log.json +0 -257
- package/.as-test/logs/test.box.spec.ts.log.json +0 -353
- package/.as-test/logs/test.custom.spec.ts.log.json +0 -309
- package/.as-test/logs/test.date.spec.ts.log.json +0 -397
- package/.as-test/logs/test.enum.spec.ts.log.json +0 -343
- package/.as-test/logs/test.float.spec.ts.log.json +0 -453
- package/.as-test/logs/test.generics.spec.ts.log.json +0 -393
- package/.as-test/logs/test.hierarchy.spec.ts.log.json +0 -325
- package/.as-test/logs/test.integer.spec.ts.log.json +0 -373
- package/.as-test/logs/test.log.json +0 -11371
- package/.as-test/logs/test.map.spec.ts.log.json +0 -247
- package/.as-test/logs/test.namespace.spec.ts.log.json +0 -361
- package/.as-test/logs/test.null.spec.ts.log.json +0 -273
- package/.as-test/logs/test.raw.spec.ts.log.json +0 -309
- package/.as-test/logs/test.resolving.spec.ts.log.json +0 -273
- package/.as-test/logs/test.set.spec.ts.log.json +0 -733
- package/.as-test/logs/test.staticarray.spec.ts.log.json +0 -931
- package/.as-test/logs/test.string.spec.ts.log.json +0 -2289
- package/.as-test/logs/test.struct.spec.ts.log.json +0 -523
- package/.as-test/logs/test.types.spec.ts.log.json +0 -273
- package/.as-test/runners/default.bindings.js +0 -68
- package/.as-test/runners/default.wasi.js +0 -38
- package/ARCHITECTURE.md +0 -323
- package/CONTRIBUTING.md +0 -244
- package/TODO +0 -1
- package/as-test.config.json +0 -40
- package/assembly/test.ts +0 -24
- package/eslint.config.js +0 -68
- package/lib/tsconfig.json +0 -8
- package/test.ts +0 -99
- package/tools/assemblyscript-eslint-local.js +0 -6
- package/tools/assemblyscript-eslint.js +0 -53
- package/tools/assemblyscript-prettier-plugin.js +0 -33
- package/tools/replacer.js +0 -63
- package/transform/tsconfig.json +0 -35
package/transform/lib/index.js
CHANGED
|
@@ -19,10 +19,63 @@ function needsReferenceLoad(type) {
|
|
|
19
19
|
}
|
|
20
20
|
function getSerializeCall(type, realName) {
|
|
21
21
|
if (type == "ArrayBuffer") {
|
|
22
|
-
return `JSON.
|
|
22
|
+
return `JSON.__serialize<ArrayBuffer>(load<ArrayBuffer>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
|
|
23
23
|
}
|
|
24
24
|
return needsReferenceLoad(type) ? `JSON.__serialize<${type}>(changetype<${type}>(load<usize>(ptr, offsetof<this>(${JSON.stringify(realName)}))));\n` : `JSON.__serialize<${type}>(load<${type}>(ptr, offsetof<this>(${JSON.stringify(realName)})));\n`;
|
|
25
25
|
}
|
|
26
|
+
const CUSTOM_JSON_KINDS = new Set(["any", "string", "number", "object", "array", "boolean", "null", "any | null", "string | null", "number | null", "object | null", "array | null", "boolean | null"]);
|
|
27
|
+
function parseCustomJsonKind(method, decoratorName) {
|
|
28
|
+
const decorator = method.decorators?.find((v) => v.name.text.toLowerCase() == decoratorName);
|
|
29
|
+
if (!decorator || !decorator.args || decorator.args.length == 0)
|
|
30
|
+
return "any";
|
|
31
|
+
if (decorator.args.length > 1)
|
|
32
|
+
throwError(`@${decoratorName} accepts at most one argument`, decorator.range);
|
|
33
|
+
const arg = decorator.args[0];
|
|
34
|
+
if (arg.kind != 16 || arg.literalKind != 2) {
|
|
35
|
+
throwError(`@${decoratorName} argument must be a string literal like @${decoratorName}("string")`, arg.range);
|
|
36
|
+
}
|
|
37
|
+
const kind = arg.value;
|
|
38
|
+
if (!CUSTOM_JSON_KINDS.has(kind)) {
|
|
39
|
+
throwError(`Unsupported @${decoratorName} JSON type '${kind}'. Expected one of: any, string, number, object, array, boolean, null`, arg.range);
|
|
40
|
+
}
|
|
41
|
+
return kind;
|
|
42
|
+
}
|
|
43
|
+
function addMemberToCustomBucket(sortedMembers, member, kind) {
|
|
44
|
+
const isNullable = kind.endsWith(" | null");
|
|
45
|
+
const baseKind = isNullable ? kind.slice(0, kind.length - 7) : kind;
|
|
46
|
+
if (isNullable)
|
|
47
|
+
sortedMembers.null.push(member);
|
|
48
|
+
switch (baseKind) {
|
|
49
|
+
case "string":
|
|
50
|
+
sortedMembers.string.push(member);
|
|
51
|
+
break;
|
|
52
|
+
case "number":
|
|
53
|
+
sortedMembers.number.push(member);
|
|
54
|
+
break;
|
|
55
|
+
case "boolean":
|
|
56
|
+
sortedMembers.boolean.push(member);
|
|
57
|
+
break;
|
|
58
|
+
case "null":
|
|
59
|
+
if (!isNullable)
|
|
60
|
+
sortedMembers.null.push(member);
|
|
61
|
+
break;
|
|
62
|
+
case "array":
|
|
63
|
+
sortedMembers.array.push(member);
|
|
64
|
+
break;
|
|
65
|
+
case "object":
|
|
66
|
+
sortedMembers.object.push(member);
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
sortedMembers.string.push(member);
|
|
70
|
+
sortedMembers.number.push(member);
|
|
71
|
+
sortedMembers.object.push(member);
|
|
72
|
+
sortedMembers.array.push(member);
|
|
73
|
+
sortedMembers.boolean.push(member);
|
|
74
|
+
if (!isNullable)
|
|
75
|
+
sortedMembers.null.push(member);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
26
79
|
export class JSONTransform extends Visitor {
|
|
27
80
|
static SN = new JSONTransform();
|
|
28
81
|
program;
|
|
@@ -34,6 +87,46 @@ export class JSONTransform extends Visitor {
|
|
|
34
87
|
imports = [];
|
|
35
88
|
simdStatements = [];
|
|
36
89
|
visitedClasses = new Set();
|
|
90
|
+
collectInheritedFieldMembers(node, source, members, visited = new Set()) {
|
|
91
|
+
if (!node.extendsType)
|
|
92
|
+
return;
|
|
93
|
+
const extendsName = source.resolveExtendsName(node);
|
|
94
|
+
if (!extendsName || visited.has(extendsName))
|
|
95
|
+
return;
|
|
96
|
+
visited.add(extendsName);
|
|
97
|
+
let baseDecl = source.getClass(extendsName);
|
|
98
|
+
let baseSource = baseDecl ? source : null;
|
|
99
|
+
if (!baseDecl) {
|
|
100
|
+
const imported = source.getImportedClass(extendsName, this.parser);
|
|
101
|
+
if (imported) {
|
|
102
|
+
baseDecl = imported;
|
|
103
|
+
baseSource = this.sources.get(imported.range.source);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!baseDecl) {
|
|
107
|
+
const available = source.getAvailableClass(extendsName, this.parser);
|
|
108
|
+
if (available) {
|
|
109
|
+
baseDecl = available;
|
|
110
|
+
baseSource = this.sources.get(available.range.source);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!baseDecl || !baseSource)
|
|
114
|
+
return;
|
|
115
|
+
const isDecoratedBase = !!baseDecl.decorators?.some((decorator) => {
|
|
116
|
+
const name = decorator.name.text;
|
|
117
|
+
return name === "json" || name === "serializable";
|
|
118
|
+
});
|
|
119
|
+
if (isDecoratedBase)
|
|
120
|
+
return;
|
|
121
|
+
this.collectInheritedFieldMembers(baseDecl, baseSource, members, visited);
|
|
122
|
+
const inheritedMembers = baseDecl.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"));
|
|
123
|
+
for (let i = inheritedMembers.length - 1; i >= 0; i--) {
|
|
124
|
+
const inherited = inheritedMembers[i];
|
|
125
|
+
if (!members.some((member) => member.name.text == inherited.name.text)) {
|
|
126
|
+
members.unshift(inherited);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
37
130
|
visitClassDeclarationRef(node) {
|
|
38
131
|
if (!node.decorators?.length ||
|
|
39
132
|
!node.decorators.some((decorator) => {
|
|
@@ -88,13 +181,14 @@ export class JSONTransform extends Visitor {
|
|
|
88
181
|
return;
|
|
89
182
|
if (!this.schemas.has(source.internalPath))
|
|
90
183
|
this.schemas.set(source.internalPath, []);
|
|
91
|
-
const members = [...node.members.filter((v) => v.kind === 54 && v.
|
|
184
|
+
const members = [...node.members.filter((v) => v.kind === 54 && !v.is(32) && !v.is(512) && !v.is(1024) && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
|
|
92
185
|
const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer") && !v.name.text.startsWith("__try"))];
|
|
93
186
|
const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer") && !v.name.text.startsWith("__try"))];
|
|
94
187
|
const schema = new Schema();
|
|
95
188
|
schema.node = node;
|
|
96
189
|
schema.name = source.getQualifiedName(node);
|
|
97
190
|
if (node.extendsType) {
|
|
191
|
+
this.collectInheritedFieldMembers(node, source, members);
|
|
98
192
|
const extendsName = source.resolveExtendsName(node);
|
|
99
193
|
if (!schema.parent) {
|
|
100
194
|
const depSearch = schema.deps.find((v) => v.name == extendsName);
|
|
@@ -140,6 +234,30 @@ export class JSONTransform extends Visitor {
|
|
|
140
234
|
schema.deps.push(schem);
|
|
141
235
|
schema.parent = schem;
|
|
142
236
|
}
|
|
237
|
+
else {
|
|
238
|
+
const availableSearch = source.getAvailableClass(extendsName, this.parser);
|
|
239
|
+
if (availableSearch) {
|
|
240
|
+
if (DEBUG > 0)
|
|
241
|
+
console.log("Found " + availableSearch.name.text + " from available sources for " + source.internalPath);
|
|
242
|
+
const availableSource = this.sources.get(availableSearch.range.source);
|
|
243
|
+
if (availableSearch.decorators?.some((decorator) => {
|
|
244
|
+
const name = decorator.name.text;
|
|
245
|
+
return name === "json" || name === "serializable";
|
|
246
|
+
})) {
|
|
247
|
+
if (!this.visitedClasses.has(availableSource.getFullPath(availableSearch))) {
|
|
248
|
+
this.visitClassDeclarationRef(availableSearch);
|
|
249
|
+
this.schemas.get(availableSource.internalPath).push(this.schema);
|
|
250
|
+
this.visitClassDeclaration(node);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const schem = this.schemas.get(availableSource.internalPath)?.find((s) => s.name == extendsName);
|
|
254
|
+
if (schem) {
|
|
255
|
+
schema.deps.push(schem);
|
|
256
|
+
schema.parent = schem;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
143
261
|
}
|
|
144
262
|
}
|
|
145
263
|
}
|
|
@@ -256,7 +374,9 @@ export class JSONTransform extends Visitor {
|
|
|
256
374
|
if (serializers.length) {
|
|
257
375
|
this.schema.custom = true;
|
|
258
376
|
const serializer = serializers[0];
|
|
377
|
+
const serializerJsonKind = parseCustomJsonKind(serializer, "serializer");
|
|
259
378
|
const hasCall = CustomTransform.hasCall(serializer);
|
|
379
|
+
this.schema.customJsonKind = serializerJsonKind;
|
|
260
380
|
CustomTransform.visit(serializer);
|
|
261
381
|
if (serializer.signature.parameters.length > 1)
|
|
262
382
|
throwError("Found too many parameters in custom serializer for " + this.schema.name + ", but serializers can only accept one parameter of type '" + this.schema.name + "'!", serializer.signature.parameters[1].range);
|
|
@@ -268,9 +388,16 @@ export class JSONTransform extends Visitor {
|
|
|
268
388
|
serializer.decorators.push(Node.createDecorator(Node.createIdentifierExpression("inline", serializer.range), null, serializer.range));
|
|
269
389
|
}
|
|
270
390
|
SERIALIZE_CUSTOM += " __SERIALIZE(ptr: usize): void {\n";
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
SERIALIZE_CUSTOM += " bs.
|
|
391
|
+
if (hasCall) {
|
|
392
|
+
SERIALIZE_CUSTOM += " const savedOffset = bs.offset;\n";
|
|
393
|
+
SERIALIZE_CUSTOM += " const savedStackSize = bs.stackSize;\n";
|
|
394
|
+
}
|
|
395
|
+
SERIALIZE_CUSTOM += " const self = changetype<this>(ptr);\n";
|
|
396
|
+
SERIALIZE_CUSTOM += " const data = self." + serializer.name.text + "(" + (serializer.signature.parameters.length ? "self" : "") + ");\n";
|
|
397
|
+
if (hasCall) {
|
|
398
|
+
SERIALIZE_CUSTOM += " bs.offset = savedOffset;\n";
|
|
399
|
+
SERIALIZE_CUSTOM += " bs.stackSize = savedStackSize;\n";
|
|
400
|
+
}
|
|
274
401
|
SERIALIZE_CUSTOM += " const dataSize = data.length << 1;\n";
|
|
275
402
|
SERIALIZE_CUSTOM += " memory.copy(bs.offset, changetype<usize>(data), dataSize);\n";
|
|
276
403
|
SERIALIZE_CUSTOM += " bs.offset += dataSize;\n";
|
|
@@ -279,6 +406,12 @@ export class JSONTransform extends Visitor {
|
|
|
279
406
|
if (deserializers.length) {
|
|
280
407
|
this.schema.custom = true;
|
|
281
408
|
const deserializer = deserializers[0];
|
|
409
|
+
const deserializerJsonKind = parseCustomJsonKind(deserializer, "deserializer");
|
|
410
|
+
if (this.schema.customJsonKind != "any" && deserializerJsonKind != "any" && this.schema.customJsonKind != deserializerJsonKind) {
|
|
411
|
+
throwError(`@serializer and @deserializer JSON types for ${this.schema.name} must match`, deserializer.range);
|
|
412
|
+
}
|
|
413
|
+
if (this.schema.customJsonKind == "any")
|
|
414
|
+
this.schema.customJsonKind = deserializerJsonKind;
|
|
282
415
|
if (!deserializer.signature.parameters.length)
|
|
283
416
|
throwError("Could not find any parameters in custom deserializer for " + this.schema.name + ". Deserializers must have one parameter like 'deserializer(data: string): " + this.schema.name + " {}'", deserializer.range);
|
|
284
417
|
if (deserializer.signature.parameters.length > 1)
|
|
@@ -290,10 +423,8 @@ export class JSONTransform extends Visitor {
|
|
|
290
423
|
if (!deserializer.decorators.some((v) => v.name.text == "inline")) {
|
|
291
424
|
deserializer.decorators.push(Node.createDecorator(Node.createIdentifierExpression("inline", deserializer.range), null, deserializer.range));
|
|
292
425
|
}
|
|
293
|
-
DESERIALIZE_CUSTOM += "
|
|
294
|
-
DESERIALIZE_CUSTOM += "
|
|
295
|
-
DESERIALIZE_CUSTOM += " memory.copy(changetype<usize>(out), changetype<usize>(data), offsetof<nonnull<__JSON_T>>());\n";
|
|
296
|
-
DESERIALIZE_CUSTOM += " return srcEnd;\n";
|
|
426
|
+
DESERIALIZE_CUSTOM += " @inline __DESERIALIZE_CUSTOM(data: string): this {\n";
|
|
427
|
+
DESERIALIZE_CUSTOM += " return inline.always(this." + deserializer.name.text + "(data));\n";
|
|
297
428
|
DESERIALIZE_CUSTOM += " }\n";
|
|
298
429
|
}
|
|
299
430
|
if (!members.length && !deserializers.length && !serializers.length) {
|
|
@@ -316,6 +447,7 @@ export class JSONTransform extends Visitor {
|
|
|
316
447
|
mem.value = value;
|
|
317
448
|
mem.node = member;
|
|
318
449
|
mem.byteSize = sizeof(mem.type);
|
|
450
|
+
mem.custom = schema.deps.some((dep) => dep?.name == stripNull(type) && dep.custom);
|
|
319
451
|
this.schema.byteSize += mem.byteSize;
|
|
320
452
|
if (member.decorators) {
|
|
321
453
|
for (const decorator of member.decorators) {
|
|
@@ -482,13 +614,12 @@ export class JSONTransform extends Visitor {
|
|
|
482
614
|
};
|
|
483
615
|
for (const member of this.schema.members) {
|
|
484
616
|
const type = stripNull(member.type);
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
sortedMembers.
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
sortedMembers.null.push(member);
|
|
617
|
+
const customDep = this.schema.deps.find((dep) => dep && (dep.name == type || dep.name.endsWith("." + type)) && dep.custom);
|
|
618
|
+
const isCustomType = member.custom || !!customDep;
|
|
619
|
+
if (isCustomType || member.generic) {
|
|
620
|
+
addMemberToCustomBucket(sortedMembers, member, member.generic ? "any" : customDep?.customJsonKind || "any");
|
|
621
|
+
if (member.node.type.isNullable)
|
|
622
|
+
sortedMembers.null.push(member);
|
|
492
623
|
}
|
|
493
624
|
else {
|
|
494
625
|
if (member.node.type.isNullable)
|
|
@@ -1222,13 +1353,16 @@ export class JSONTransform extends Visitor {
|
|
|
1222
1353
|
const DESERIALIZE_DIRECT = useFastPath ? DESERIALIZE_FAST.replace("@inline __DESERIALIZE_FAST<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {", "@inline __DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): usize {") : DESERIALIZE.replace("__DESERIALIZE_SLOW<__JSON_T>", "__DESERIALIZE<__JSON_T>");
|
|
1223
1354
|
const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE_CUSTOM || SERIALIZE, node);
|
|
1224
1355
|
const INITIALIZE_METHOD = !useFastPath ? SimpleParser.parseClassMember(INITIALIZE, node) : null;
|
|
1225
|
-
const
|
|
1356
|
+
const DESERIALIZE_CUSTOM_METHOD = DESERIALIZE_CUSTOM ? SimpleParser.parseClassMember(DESERIALIZE_CUSTOM, node) : null;
|
|
1357
|
+
const DESERIALIZE_METHOD = DESERIALIZE_CUSTOM ? null : SimpleParser.parseClassMember(DESERIALIZE_DIRECT, node);
|
|
1226
1358
|
const DESERIALIZE_FAST_METHOD = useFastPath ? SimpleParser.parseClassMember(DESERIALIZE_FAST, node) : null;
|
|
1227
1359
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
1228
1360
|
node.members.push(SERIALIZE_METHOD);
|
|
1229
1361
|
if (!useFastPath && INITIALIZE_METHOD && !node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
1230
1362
|
node.members.push(INITIALIZE_METHOD);
|
|
1231
|
-
if (!node.members.find((v) => v.name.text == "
|
|
1363
|
+
if (DESERIALIZE_CUSTOM_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE_CUSTOM"))
|
|
1364
|
+
node.members.push(DESERIALIZE_CUSTOM_METHOD);
|
|
1365
|
+
if (DESERIALIZE_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
1232
1366
|
node.members.push(DESERIALIZE_METHOD);
|
|
1233
1367
|
if (!DESERIALIZE_CUSTOM && useFastPath && DESERIALIZE_FAST_METHOD && !node.members.find((v) => v.name.text == "__DESERIALIZE_FAST"))
|
|
1234
1368
|
node.members.push(DESERIALIZE_FAST_METHOD);
|
|
@@ -1271,15 +1405,6 @@ export class JSONTransform extends Visitor {
|
|
|
1271
1405
|
this.baseCWD = this.baseCWD.replaceAll("/", path.sep);
|
|
1272
1406
|
const baseDir = path.resolve(fileURLToPath(import.meta.url), "..", "..", "..");
|
|
1273
1407
|
let fromPath = node.range.source.normalizedPath.replaceAll("/", path.sep);
|
|
1274
|
-
const isLib = path.dirname(baseDir).endsWith("node_modules");
|
|
1275
|
-
if (!isLib && !this.parser.sources.some((s) => s.normalizedPath.startsWith("assembly/index"))) {
|
|
1276
|
-
const newPath = path.join(baseDir, "assembly", "index.ts");
|
|
1277
|
-
this.parser.parseFile(readFileSync(newPath).toString(), newPath, false);
|
|
1278
|
-
}
|
|
1279
|
-
else if (isLib && !this.parser.sources.some((s) => s.normalizedPath.startsWith("~lib/json-as/assembly/index"))) {
|
|
1280
|
-
const newPath = "~lib/json-as/assembly/index.ts";
|
|
1281
|
-
this.parser.parseFile(readFileSync(path.join(baseDir, "assembly", "index.ts")).toString(), newPath, false);
|
|
1282
|
-
}
|
|
1283
1408
|
fromPath = fromPath.startsWith("~lib") ? fromPath.slice(5) : path.join(this.baseCWD, fromPath);
|
|
1284
1409
|
const bsImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "bs" || d.name.text == "bs"));
|
|
1285
1410
|
const jsonImport = this.imports.find((i) => i.declarations?.find((d) => d.foreignName.text == "JSON" || d.name.text == "JSON"));
|
|
@@ -1456,11 +1581,7 @@ export default class Transformer extends Transform {
|
|
|
1456
1581
|
}
|
|
1457
1582
|
}
|
|
1458
1583
|
afterParse(parser) {
|
|
1459
|
-
const transformer = JSONTransform
|
|
1460
|
-
transformer.schemas = new Map();
|
|
1461
|
-
transformer.sources = new SourceSet();
|
|
1462
|
-
transformer.visitedClasses = new Set();
|
|
1463
|
-
transformer.simdStatements = [];
|
|
1584
|
+
const transformer = new JSONTransform();
|
|
1464
1585
|
const sources = parser.sources
|
|
1465
1586
|
.filter((source) => {
|
|
1466
1587
|
const p = source.internalPath;
|