json-as 1.1.11 → 1.1.12
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 +10 -0
- package/README.md +1 -1
- package/assembly/__benches__/large.bench.ts +22 -19
- package/assembly/__tests__/generics.spec.ts +40 -0
- package/assembly/__tests__/lib/index.ts +3 -7
- package/assembly/__tests__/types.spec.ts +26 -0
- package/bench/large.bench.ts +104 -215
- package/package.json +2 -3
- package/run-bench.js.sh +1 -1
- package/transform/lib/index.js +70 -80
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/linkers/alias.js +49 -0
- package/transform/lib/linkers/alias.js.map +1 -0
- package/transform/lib/{linker.js → linkers/classes.js} +3 -17
- package/transform/lib/linkers/classes.js.map +1 -0
- package/transform/lib/linkers/custom.js +32 -0
- package/transform/lib/linkers/custom.js.map +1 -0
- package/transform/lib/linkers/imports.js +17 -0
- package/transform/lib/linkers/imports.js.map +1 -0
- package/transform/lib/types.js +13 -0
- package/transform/lib/types.js.map +1 -1
- package/transform/src/index.ts +67 -82
- package/transform/src/linkers/alias.ts +59 -0
- package/transform/src/{linker.ts → linkers/classes.ts} +3 -23
- package/transform/src/linkers/custom.ts +32 -0
- package/transform/src/linkers/imports.ts +22 -0
- package/transform/src/types.ts +15 -1
- package/transform/tsconfig.json +1 -1
- package/bench/lib/test.ts +0 -37
- package/transform/lib/linker.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.12",
|
|
4
4
|
"author": "Jairus Tanaka",
|
|
5
5
|
"description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
|
|
6
6
|
"types": "assembly/index.ts",
|
|
@@ -19,8 +19,7 @@
|
|
|
19
19
|
"test": "bash ./run-tests.sh",
|
|
20
20
|
"bench:as": "bash ./run-bench.as.sh",
|
|
21
21
|
"bench:js": "bash ./run-bench.js.sh",
|
|
22
|
-
"build:test": "rm -rf ./build/ && JSON_DEBUG=1 asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --debug --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json",
|
|
23
|
-
"build:test:simd": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --optimizeLevel 3 --shrinkLevel 0 --enable simd --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json",
|
|
22
|
+
"build:test": "rm -rf ./build/ && JSON_DEBUG=1 JSON_WRITE=assembly/test.ts asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --debug --config ./node_modules/@assemblyscript/wasi-shim/asconfig.json",
|
|
24
23
|
"test:wasmtime": "wasmtime ./build/test.wasm",
|
|
25
24
|
"test:wasmer": "wasmer ./build/test.wasm",
|
|
26
25
|
"build:transform": "tsc -p ./transform",
|
package/run-bench.js.sh
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
RUNTIMES=${RUNTIMES:-"v8-liftoff v8-ignition v8-sparkplug v8-turbofan jsc-default"}
|
|
3
3
|
npx tsc -p ./bench > /dev/null 2>&1
|
|
4
|
-
for file in ./bench
|
|
4
|
+
for file in ./bench/*.bench.ts; do
|
|
5
5
|
filename=$(basename -- "$file")
|
|
6
6
|
file_js="${filename%.ts}.js"
|
|
7
7
|
|
package/transform/lib/index.js
CHANGED
|
@@ -4,9 +4,10 @@ import { Visitor } from "./visitor.js";
|
|
|
4
4
|
import { isStdlib, removeExtension, SimpleParser, toString } from "./util.js";
|
|
5
5
|
import * as path from "path";
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
|
-
import { Property, PropertyFlags, Schema } from "./types.js";
|
|
8
|
-
import { getClass, getImportedClass } from "./
|
|
7
|
+
import { Property, PropertyFlags, Schema, Src } from "./types.js";
|
|
8
|
+
import { getClass, getImportedClass } from "./linkers/classes.js";
|
|
9
9
|
import { existsSync, writeFileSync } from "fs";
|
|
10
|
+
import { CustomTransform } from "./linkers/custom.js";
|
|
10
11
|
let indent = " ";
|
|
11
12
|
let id = 0;
|
|
12
13
|
const WRITE = process.env["JSON_WRITE"];
|
|
@@ -19,35 +20,6 @@ const DEBUG = rawValue === "true"
|
|
|
19
20
|
? 0
|
|
20
21
|
: Number(rawValue);
|
|
21
22
|
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "true";
|
|
22
|
-
class CustomTransform extends Visitor {
|
|
23
|
-
static SN = new CustomTransform();
|
|
24
|
-
modify = false;
|
|
25
|
-
visitCallExpression(node) {
|
|
26
|
-
super.visit(node.args, node);
|
|
27
|
-
if (node.expression.kind != 21 || node.expression.property.text != "stringify")
|
|
28
|
-
return;
|
|
29
|
-
if (node.expression.expression.kind != 6 || node.expression.expression.text != "JSON")
|
|
30
|
-
return;
|
|
31
|
-
if (this.modify) {
|
|
32
|
-
node.expression.expression = Node.createPropertyAccessExpression(Node.createIdentifierExpression("JSON", node.expression.range), Node.createIdentifierExpression("internal", node.expression.range), node.expression.range);
|
|
33
|
-
}
|
|
34
|
-
this.modify = true;
|
|
35
|
-
}
|
|
36
|
-
static visit(node, ref = null) {
|
|
37
|
-
if (!node)
|
|
38
|
-
return;
|
|
39
|
-
CustomTransform.SN.modify = true;
|
|
40
|
-
CustomTransform.SN.visit(node, ref);
|
|
41
|
-
CustomTransform.SN.modify = false;
|
|
42
|
-
}
|
|
43
|
-
static hasCall(node) {
|
|
44
|
-
if (!node)
|
|
45
|
-
return;
|
|
46
|
-
CustomTransform.SN.modify = false;
|
|
47
|
-
CustomTransform.SN.visit(node);
|
|
48
|
-
return CustomTransform.SN.modify;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
23
|
class JSONTransform extends Visitor {
|
|
52
24
|
static SN = new JSONTransform();
|
|
53
25
|
program;
|
|
@@ -55,9 +27,9 @@ class JSONTransform extends Visitor {
|
|
|
55
27
|
parser;
|
|
56
28
|
schemas = new Map();
|
|
57
29
|
schema;
|
|
58
|
-
|
|
30
|
+
src;
|
|
31
|
+
sources = new Map();
|
|
59
32
|
imports = [];
|
|
60
|
-
topStatements = [];
|
|
61
33
|
simdStatements = [];
|
|
62
34
|
visitedClasses = new Set();
|
|
63
35
|
visitClassDeclarationRef(node) {
|
|
@@ -77,10 +49,17 @@ class JSONTransform extends Visitor {
|
|
|
77
49
|
return name === "json" || name === "serializable";
|
|
78
50
|
}))
|
|
79
51
|
return;
|
|
80
|
-
|
|
52
|
+
const source = node.range.source;
|
|
53
|
+
if (!this.sources.has(source.internalPath)) {
|
|
54
|
+
this.src = new Src(source);
|
|
55
|
+
this.sources.set(source.internalPath, this.src);
|
|
56
|
+
}
|
|
57
|
+
else
|
|
58
|
+
this.src = this.sources.get(source.internalPath);
|
|
59
|
+
if (this.visitedClasses.has(source.internalPath + node.name.text))
|
|
81
60
|
return;
|
|
82
|
-
if (!this.schemas.has(
|
|
83
|
-
this.schemas.set(
|
|
61
|
+
if (!this.schemas.has(source.internalPath))
|
|
62
|
+
this.schemas.set(source.internalPath, []);
|
|
84
63
|
const members = [...node.members.filter((v) => v.kind === 54 && v.flags !== 32 && v.flags !== 512 && v.flags !== 1024 && !v.decorators?.some((decorator) => decorator.name.text === "omit"))];
|
|
85
64
|
const serializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "serializer"))];
|
|
86
65
|
const deserializers = [...node.members.filter((v) => v.kind === 58 && v.decorators && v.decorators.some((e) => e.name.text.toLowerCase() === "deserializer"))];
|
|
@@ -93,16 +72,16 @@ class JSONTransform extends Visitor {
|
|
|
93
72
|
const depSearch = schema.deps.find((v) => v.name == extendsName);
|
|
94
73
|
if (depSearch) {
|
|
95
74
|
if (DEBUG > 0)
|
|
96
|
-
console.log("Found " + extendsName + " in dependencies of " +
|
|
75
|
+
console.log("Found " + extendsName + " in dependencies of " + source.internalPath);
|
|
97
76
|
if (!schema.deps.some(v => v.name == depSearch.name))
|
|
98
77
|
schema.deps.push(depSearch);
|
|
99
78
|
schema.parent = depSearch;
|
|
100
79
|
}
|
|
101
80
|
else {
|
|
102
|
-
const internalSearch = getClass(extendsName,
|
|
81
|
+
const internalSearch = getClass(extendsName, source);
|
|
103
82
|
if (internalSearch) {
|
|
104
83
|
if (DEBUG > 0)
|
|
105
|
-
console.log("Found " + extendsName + " internally from " +
|
|
84
|
+
console.log("Found " + extendsName + " internally from " + source.internalPath);
|
|
106
85
|
if (!this.visitedClasses.has(internalSearch.range.source.internalPath + internalSearch.name.text)) {
|
|
107
86
|
this.visitClassDeclarationRef(internalSearch);
|
|
108
87
|
this.schemas.get(internalSearch.range.source.internalPath).push(this.schema);
|
|
@@ -116,10 +95,10 @@ class JSONTransform extends Visitor {
|
|
|
116
95
|
schema.parent = schem;
|
|
117
96
|
}
|
|
118
97
|
else {
|
|
119
|
-
const externalSearch = getImportedClass(extendsName,
|
|
98
|
+
const externalSearch = getImportedClass(extendsName, source, this.parser);
|
|
120
99
|
if (externalSearch) {
|
|
121
100
|
if (DEBUG > 0)
|
|
122
|
-
console.log("Found " + externalSearch.name.text + " externally from " +
|
|
101
|
+
console.log("Found " + externalSearch.name.text + " externally from " + source.internalPath);
|
|
123
102
|
if (!this.visitedClasses.has(externalSearch.range.source.internalPath + externalSearch.name.text)) {
|
|
124
103
|
this.visitClassDeclarationRef(externalSearch);
|
|
125
104
|
this.schemas.get(externalSearch.range.source.internalPath).push(this.schema);
|
|
@@ -146,6 +125,7 @@ class JSONTransform extends Visitor {
|
|
|
146
125
|
}
|
|
147
126
|
const getUnknownTypes = (type, types = []) => {
|
|
148
127
|
type = stripNull(type);
|
|
128
|
+
type = this.src.aliases.find(v => stripNull(v.name) == type)?.getBaseType() || type;
|
|
149
129
|
if (type.startsWith("Array<")) {
|
|
150
130
|
return getUnknownTypes(type.slice(6, -1));
|
|
151
131
|
}
|
|
@@ -175,15 +155,15 @@ class JSONTransform extends Visitor {
|
|
|
175
155
|
const depSearch = schema.deps.find((v) => v.name == unknownType);
|
|
176
156
|
if (depSearch) {
|
|
177
157
|
if (DEBUG > 0)
|
|
178
|
-
console.log("Found " + unknownType + " in dependencies of " +
|
|
158
|
+
console.log("Found " + unknownType + " in dependencies of " + source.internalPath);
|
|
179
159
|
if (!schema.deps.some(v => v.name == depSearch.name))
|
|
180
160
|
schema.deps.push(depSearch);
|
|
181
161
|
}
|
|
182
162
|
else {
|
|
183
|
-
const internalSearch = getClass(unknownType,
|
|
163
|
+
const internalSearch = getClass(unknownType, source);
|
|
184
164
|
if (internalSearch) {
|
|
185
165
|
if (DEBUG > 0)
|
|
186
|
-
console.log("Found " + unknownType + " internally from " +
|
|
166
|
+
console.log("Found " + unknownType + " internally from " + source.internalPath);
|
|
187
167
|
if (!this.visitedClasses.has(internalSearch.range.source.internalPath + internalSearch.name.text)) {
|
|
188
168
|
this.visitClassDeclarationRef(internalSearch);
|
|
189
169
|
this.schemas.get(internalSearch.range.source.internalPath).push(this.schema);
|
|
@@ -196,10 +176,10 @@ class JSONTransform extends Visitor {
|
|
|
196
176
|
schema.deps.push(schem);
|
|
197
177
|
}
|
|
198
178
|
else {
|
|
199
|
-
const externalSearch = getImportedClass(unknownType,
|
|
179
|
+
const externalSearch = getImportedClass(unknownType, source, this.parser);
|
|
200
180
|
if (externalSearch) {
|
|
201
181
|
if (DEBUG > 0)
|
|
202
|
-
console.log("Found " + externalSearch.name.text + " externally from " +
|
|
182
|
+
console.log("Found " + externalSearch.name.text + " externally from " + source.internalPath);
|
|
203
183
|
if (!this.visitedClasses.has(externalSearch.range.source.internalPath + externalSearch.name.text)) {
|
|
204
184
|
this.visitClassDeclarationRef(externalSearch);
|
|
205
185
|
this.schemas.get(externalSearch.range.source.internalPath).push(this.schema);
|
|
@@ -215,16 +195,16 @@ class JSONTransform extends Visitor {
|
|
|
215
195
|
}
|
|
216
196
|
}
|
|
217
197
|
}
|
|
218
|
-
this.schemas.get(
|
|
198
|
+
this.schemas.get(source.internalPath).push(schema);
|
|
219
199
|
this.schema = schema;
|
|
220
|
-
this.visitedClasses.add(
|
|
200
|
+
this.visitedClasses.add(source.internalPath + node.name.text);
|
|
221
201
|
let SERIALIZE = "__SERIALIZE(ptr: usize): void {\n";
|
|
222
202
|
let INITIALIZE = "@inline __INITIALIZE(): this {\n";
|
|
223
203
|
let DESERIALIZE = "__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T {\n";
|
|
224
204
|
let DESERIALIZE_CUSTOM = "";
|
|
225
205
|
let SERIALIZE_CUSTOM = "";
|
|
226
206
|
if (DEBUG > 0)
|
|
227
|
-
console.log("Created schema: " + this.schema.name + " in file " +
|
|
207
|
+
console.log("Created schema: " + this.schema.name + " in file " + source.normalizedPath + (this.schema.deps.length ? " with dependencies:\n " + this.schema.deps.map((v) => v.name).join("\n ") : ""));
|
|
228
208
|
if (serializers.length > 1)
|
|
229
209
|
throwError("Multiple serializers detected for class " + node.name.text + " but schemas can only have one serializer!", serializers[1].range);
|
|
230
210
|
if (deserializers.length > 1)
|
|
@@ -277,7 +257,8 @@ class JSONTransform extends Visitor {
|
|
|
277
257
|
for (const member of members) {
|
|
278
258
|
if (!member.type)
|
|
279
259
|
throwError("Fields must be strongly typed", node.range);
|
|
280
|
-
|
|
260
|
+
let type = toString(member.type);
|
|
261
|
+
type = this.src.aliases.find(v => stripNull(v.name) == stripNull(type))?.getBaseType() || type;
|
|
281
262
|
const name = member.name;
|
|
282
263
|
const value = member.initializer ? toString(member.initializer) : null;
|
|
283
264
|
if (type.startsWith("(") && type.includes("=>"))
|
|
@@ -432,21 +413,34 @@ class JSONTransform extends Visitor {
|
|
|
432
413
|
object: [],
|
|
433
414
|
};
|
|
434
415
|
for (const member of this.schema.members) {
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
416
|
+
const type = stripNull(member.type);
|
|
417
|
+
if (node.isGeneric && node.typeParameters.some((p) => stripNull(p.name.text) == type)) {
|
|
418
|
+
member.generic = true;
|
|
438
419
|
sortedMembers.string.push(member);
|
|
439
|
-
else if (isBoolean(member.type) || member.type.startsWith("JSON.Box<bool"))
|
|
440
|
-
sortedMembers.boolean.push(member);
|
|
441
|
-
else if (isPrimitive(member.type) || member.type.startsWith("JSON.Box<"))
|
|
442
420
|
sortedMembers.number.push(member);
|
|
443
|
-
else if (isArray(member.type))
|
|
444
|
-
sortedMembers.array.push(member);
|
|
445
|
-
else
|
|
446
421
|
sortedMembers.object.push(member);
|
|
422
|
+
sortedMembers.array.push(member);
|
|
423
|
+
sortedMembers.boolean.push(member);
|
|
424
|
+
sortedMembers.null.push(member);
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
if (member.node.type.isNullable)
|
|
428
|
+
sortedMembers.null.push(member);
|
|
429
|
+
if (isString(type) || type == "JSON.Raw")
|
|
430
|
+
sortedMembers.string.push(member);
|
|
431
|
+
else if (isBoolean(type) || type.startsWith("JSON.Box<bool"))
|
|
432
|
+
sortedMembers.boolean.push(member);
|
|
433
|
+
else if (isPrimitive(type) || type.startsWith("JSON.Box<"))
|
|
434
|
+
sortedMembers.number.push(member);
|
|
435
|
+
else if (isArray(type))
|
|
436
|
+
sortedMembers.array.push(member);
|
|
437
|
+
else if (isStruct(type, source))
|
|
438
|
+
sortedMembers.object.push(member);
|
|
439
|
+
else
|
|
440
|
+
throw new Error("Could not determine type " + type + " for member " + member.name + " in class " + this.schema.name);
|
|
441
|
+
}
|
|
447
442
|
}
|
|
448
443
|
indent = "";
|
|
449
|
-
let shouldGroup = false;
|
|
450
444
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
451
445
|
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
452
446
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
@@ -575,7 +569,7 @@ class JSONTransform extends Visitor {
|
|
|
575
569
|
generateConsts(group);
|
|
576
570
|
const first = group[0];
|
|
577
571
|
const fName = first.alias || first.name;
|
|
578
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
572
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isString<" + first.type + ">() && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
579
573
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart + 2), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
580
574
|
DESERIALIZE += indent + " srcStart += 4;\n";
|
|
581
575
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -584,7 +578,7 @@ class JSONTransform extends Visitor {
|
|
|
584
578
|
for (let i = 1; i < group.length; i++) {
|
|
585
579
|
const mem = group[i];
|
|
586
580
|
const memName = mem.alias || mem.name;
|
|
587
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
581
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isString<" + mem.type + ">() && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
588
582
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart + 2), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
589
583
|
DESERIALIZE += indent + " srcStart += 4;\n";
|
|
590
584
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -623,7 +617,7 @@ class JSONTransform extends Visitor {
|
|
|
623
617
|
generateConsts(group);
|
|
624
618
|
const first = group[0];
|
|
625
619
|
const fName = first.alias || first.name;
|
|
626
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
620
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "(isInteger<" + first.type + ">() || isFloat<" + first.type + ">()) && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
627
621
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
628
622
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
629
623
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -632,7 +626,7 @@ class JSONTransform extends Visitor {
|
|
|
632
626
|
for (let i = 1; i < group.length; i++) {
|
|
633
627
|
const mem = group[i];
|
|
634
628
|
const memName = mem.alias || mem.name;
|
|
635
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
629
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "(isInteger<" + mem.type + ">() || isFloat<" + mem.type + ">()) && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
636
630
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
637
631
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
638
632
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -678,7 +672,7 @@ class JSONTransform extends Visitor {
|
|
|
678
672
|
generateConsts(group);
|
|
679
673
|
const first = group[0];
|
|
680
674
|
const fName = first.alias || first.name;
|
|
681
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
675
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isDefined(out.__DESERIALIZE) &&" : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
682
676
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
683
677
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
684
678
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -686,7 +680,7 @@ class JSONTransform extends Visitor {
|
|
|
686
680
|
for (let i = 1; i < group.length; i++) {
|
|
687
681
|
const mem = group[i];
|
|
688
682
|
const memName = mem.alias || mem.name;
|
|
689
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
683
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isDefined(out.__DESERIALIZE) &&" : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
690
684
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
691
685
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
692
686
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -732,7 +726,7 @@ class JSONTransform extends Visitor {
|
|
|
732
726
|
generateConsts(group);
|
|
733
727
|
const first = group[0];
|
|
734
728
|
const fName = first.alias || first.name;
|
|
735
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
729
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isArray<" + first.type + ">() && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
736
730
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), JSON.__deserialize<" + first.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
737
731
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
738
732
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -740,7 +734,7 @@ class JSONTransform extends Visitor {
|
|
|
740
734
|
for (let i = 1; i < group.length; i++) {
|
|
741
735
|
const mem = group[i];
|
|
742
736
|
const memName = mem.alias || mem.name;
|
|
743
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
737
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isArray" + mem.type + ">() && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
744
738
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), JSON.__deserialize<" + mem.type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
745
739
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
746
740
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -776,7 +770,7 @@ class JSONTransform extends Visitor {
|
|
|
776
770
|
generateConsts(group);
|
|
777
771
|
const first = group[0];
|
|
778
772
|
const fName = first.alias || first.name;
|
|
779
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
773
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
780
774
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
781
775
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
782
776
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -785,7 +779,7 @@ class JSONTransform extends Visitor {
|
|
|
785
779
|
for (let i = 1; i < group.length; i++) {
|
|
786
780
|
const mem = group[i];
|
|
787
781
|
const memName = mem.alias || mem.name;
|
|
788
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
782
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
789
783
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
790
784
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
791
785
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -820,7 +814,7 @@ class JSONTransform extends Visitor {
|
|
|
820
814
|
generateConsts(group);
|
|
821
815
|
const first = group[0];
|
|
822
816
|
const fName = first.alias || first.name;
|
|
823
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
817
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isBoolean<" + first.type + ">() && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
824
818
|
DESERIALIZE += indent + " store<" + first.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
825
819
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
826
820
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -829,7 +823,7 @@ class JSONTransform extends Visitor {
|
|
|
829
823
|
for (let i = 1; i < group.length; i++) {
|
|
830
824
|
const mem = group[i];
|
|
831
825
|
const memName = mem.alias || mem.name;
|
|
832
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
826
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isBoolean<" + mem.type + ">() && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
833
827
|
DESERIALIZE += indent + " store<" + mem.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
834
828
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
835
829
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -866,8 +860,8 @@ class JSONTransform extends Visitor {
|
|
|
866
860
|
generateConsts(group);
|
|
867
861
|
const first = group[0];
|
|
868
862
|
const fName = first.alias || first.name;
|
|
869
|
-
DESERIALIZE += indent + " if (" + getComparision(fName) + ") { // " + fName + "\n";
|
|
870
|
-
DESERIALIZE += indent + " store<
|
|
863
|
+
DESERIALIZE += indent + " if (" + (first.generic ? "isNullable<" + first.type + ">() && " : "") + getComparision(fName) + ") { // " + fName + "\n";
|
|
864
|
+
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
|
|
871
865
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
872
866
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
873
867
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -875,8 +869,8 @@ class JSONTransform extends Visitor {
|
|
|
875
869
|
for (let i = 1; i < group.length; i++) {
|
|
876
870
|
const mem = group[i];
|
|
877
871
|
const memName = mem.alias || mem.name;
|
|
878
|
-
DESERIALIZE += indent + " else if (" + getComparision(memName) + ") { // " + memName + "\n";
|
|
879
|
-
DESERIALIZE += indent + " store<
|
|
872
|
+
DESERIALIZE += indent + " else if (" + (mem.generic ? "isNullable<" + mem.type + ">() && " : "") + getComparision(memName) + ") { // " + memName + "\n";
|
|
873
|
+
DESERIALIZE += indent + " store<usize>(changetype<usize>(out), 0, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
|
|
880
874
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
881
875
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
882
876
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -1099,10 +1093,6 @@ export default class Transformer extends Transform {
|
|
|
1099
1093
|
transformer.imports = [];
|
|
1100
1094
|
transformer.currentSource = source;
|
|
1101
1095
|
transformer.visit(source);
|
|
1102
|
-
if (transformer.topStatements.length) {
|
|
1103
|
-
source.statements.unshift(...transformer.topStatements);
|
|
1104
|
-
transformer.topStatements = [];
|
|
1105
|
-
}
|
|
1106
1096
|
if (transformer.simdStatements.length) {
|
|
1107
1097
|
for (const simd of transformer.simdStatements)
|
|
1108
1098
|
source.statements.unshift(SimpleParser.parseTopLevelStatement(simd));
|