json-as 1.1.11 → 1.1.13

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.
@@ -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 "./linker.js";
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
- sources = new Set();
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
- if (this.visitedClasses.has(node.range.source.internalPath + node.name.text))
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(node.range.source.internalPath))
83
- this.schemas.set(node.range.source.internalPath, []);
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 " + node.range.source.internalPath);
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, node.range.source);
81
+ const internalSearch = getClass(extendsName, source);
103
82
  if (internalSearch) {
104
83
  if (DEBUG > 0)
105
- console.log("Found " + extendsName + " internally from " + node.range.source.internalPath);
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, node.range.source, this.parser);
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 " + node.range.source.internalPath);
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 " + node.range.source.internalPath);
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, node.range.source);
163
+ const internalSearch = getClass(unknownType, source);
184
164
  if (internalSearch) {
185
165
  if (DEBUG > 0)
186
- console.log("Found " + unknownType + " internally from " + node.range.source.internalPath);
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, node.range.source, this.parser);
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 " + node.range.source.internalPath);
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(node.range.source.internalPath).push(schema);
198
+ this.schemas.get(source.internalPath).push(schema);
219
199
  this.schema = schema;
220
- this.visitedClasses.add(node.range.source.internalPath + node.name.text);
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 " + node.range.source.normalizedPath + (this.schema.deps.length ? " with dependencies:\n " + this.schema.deps.map((v) => v.name).join("\n ") : ""));
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
- const type = toString(member.type);
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
- if (member.type.endsWith(" | null"))
436
- sortedMembers.null.push(member);
437
- if (isString(member.type) || member.type == "JSON.Raw")
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))
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<" + first.type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(first.name) + "));\n";
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<" + mem.type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(mem.name) + "));\n";
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));
@@ -1247,9 +1237,15 @@ function isPrimitive(type) {
1247
1237
  function isBoolean(type) {
1248
1238
  return type == "bool" || type == "boolean";
1249
1239
  }
1250
- function isStruct(type, source) {
1240
+ function isStruct(type) {
1251
1241
  type = stripNull(type);
1252
- return JSONTransform.SN.schemas.get(source.internalPath).some((v) => v.name == type) || JSONTransform.SN.schema.name == type;
1242
+ const schema = JSONTransform.SN.schema;
1243
+ if (schema.name == type)
1244
+ return true;
1245
+ const depSearch = schema.deps.some((v) => v.name == type);
1246
+ if (depSearch)
1247
+ return true;
1248
+ return false;
1253
1249
  }
1254
1250
  function isString(type) {
1255
1251
  return stripNull(type) == "string" || stripNull(type) == "String";