@idlizer/core 2.1.9-arktscgen-6 → 2.1.9-arktscgen-9

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.
Files changed (60) hide show
  1. package/build/lib/src/IndentedPrinter.d.ts +2 -1
  2. package/build/lib/src/IndentedPrinter.js +9 -2
  3. package/build/lib/src/Language.d.ts +0 -1
  4. package/build/lib/src/Language.js +7 -8
  5. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +27 -40
  6. package/build/lib/src/LanguageWriters/ArgConvertors.js +167 -206
  7. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +13 -34
  8. package/build/lib/src/LanguageWriters/LanguageWriter.js +31 -82
  9. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +2 -2
  10. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +17 -1
  11. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +121 -6
  12. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +6 -0
  13. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +2 -3
  14. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +9 -25
  15. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +0 -5
  16. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +0 -9
  17. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +4 -6
  18. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +15 -28
  19. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +14 -10
  20. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +51 -74
  21. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +2 -8
  22. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +11 -21
  23. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +12 -9
  24. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +121 -32
  25. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +5 -6
  26. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +17 -33
  27. package/build/lib/src/config.d.ts +402 -133
  28. package/build/lib/src/config.js +13 -7
  29. package/build/lib/src/diagnosticmessages.d.ts +45 -0
  30. package/build/lib/src/diagnosticmessages.js +66 -0
  31. package/build/lib/src/diagnostictypes.d.ts +140 -0
  32. package/build/lib/src/diagnostictypes.js +72 -0
  33. package/build/lib/src/formatter.d.ts +3 -0
  34. package/build/lib/src/formatter.js +98 -0
  35. package/build/lib/src/from-idl/deserialize.d.ts +1 -0
  36. package/build/lib/src/from-idl/deserialize.js +107 -5
  37. package/build/lib/src/idl.d.ts +8 -0
  38. package/build/lib/src/idl.js +16 -3
  39. package/build/lib/src/index.d.ts +7 -1
  40. package/build/lib/src/index.js +7 -1
  41. package/build/lib/src/peer-generation/Materialized.d.ts +2 -2
  42. package/build/lib/src/peer-generation/Materialized.js +4 -9
  43. package/build/lib/src/peer-generation/PeerLibrary.js +1 -5
  44. package/build/lib/src/peer-generation/PeerMethod.d.ts +0 -4
  45. package/build/lib/src/peer-generation/PeerMethod.js +18 -36
  46. package/build/lib/src/peer-generation/idl/common.js +1 -1
  47. package/build/lib/src/peer-generation/isMaterialized.js +0 -4
  48. package/build/lib/src/peer-generation/modules.d.ts +1 -0
  49. package/build/lib/src/peer-generation/modules.js +25 -6
  50. package/build/lib/src/peer-generation/unions.d.ts +0 -2
  51. package/build/lib/src/peer-generation/unions.js +3 -23
  52. package/build/lib/src/transformers/FqnTransformer.d.ts +4 -0
  53. package/build/lib/src/transformers/FqnTransformer.js +17 -0
  54. package/build/lib/src/transformers/GenericTransformer.d.ts +8 -0
  55. package/build/lib/src/transformers/GenericTransformer.js +141 -0
  56. package/build/lib/src/util.d.ts +5 -2
  57. package/build/lib/src/util.js +26 -12
  58. package/package.json +2 -2
  59. package/build/lib/src/peer-generation/isExternalType.d.ts +0 -4
  60. package/build/lib/src/peer-generation/isExternalType.js +0 -15
@@ -17,7 +17,7 @@ import { Language } from "../Language";
17
17
  import { BlockStatement, PrintHint, StringExpression, MethodModifier, NamedMethodSignature, ProxyStatement, ExpressionStatement } from "./LanguageWriter";
18
18
  import { RuntimeType } from "./common";
19
19
  import { generatorConfiguration, generatorTypePrefix } from "../config";
20
- import { getExtractorName, hashCodeFromString, warn } from "../util";
20
+ import { capitalize, getExtractor, hashCodeFromString, throwException, warn } from "../util";
21
21
  import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
22
22
  import { CppConvertor, CppNameConvertor } from "./convertors/CppConvertors";
23
23
  import { createEmptyReferenceResolver } from "../peer-generation/ReferenceResolver";
@@ -25,6 +25,7 @@ import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
25
25
  import { qualifiedName } from "../peer-generation/idl/common";
26
26
  import { LayoutNodeRole } from "../peer-generation/LayoutManager";
27
27
  import { PeerMethodSignature } from "../peer-generation/PeerMethod";
28
+ import { isInExternalModule } from "../peer-generation/modules";
28
29
  export function getSerializerName(declaration) {
29
30
  return `${idl.getQualifiedName(declaration, "namespace.name").split('.').join('_')}_serializer`;
30
31
  }
@@ -122,13 +123,12 @@ export class BaseArgConvertor {
122
123
  return writer.getObjectAccessor(this, value, args);
123
124
  return this.useArray && (args === null || args === void 0 ? void 0 : args.index) ? `${value}[${args.index}]` : value;
124
125
  }
125
- discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor, duplicates) {
126
+ discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor) {
126
127
  if (!uniqueFields || uniqueFields.length === 0)
127
128
  return undefined;
128
129
  const firstNonOptional = uniqueFields.find(it => !optionalAccessor(it));
129
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [
130
- writer.makeDiscriminatorFromFields(this, value, firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it)), duplicates)
131
- ]);
130
+ const accessors = firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it));
131
+ return writer.makeNaryOp("||", accessors.map(it => writer.makeHasOwnProperty(value + "!", it)));
132
132
  }
133
133
  }
134
134
  export class BooleanConvertor extends BaseArgConvertor {
@@ -139,7 +139,7 @@ export class BooleanConvertor extends BaseArgConvertor {
139
139
  return writer.castToBoolean(param);
140
140
  }
141
141
  convertorSerialize(param, value, printer) {
142
- printer.writeMethodCall(`${param}Serializer`, "writeBoolean", [value]);
142
+ return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeBoolean", [printer.makeString(value)]));
143
143
  }
144
144
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
145
145
  return assigneer(writer.makeString(`${deserializerName}.readBoolean()`));
@@ -161,7 +161,9 @@ export class UndefinedConvertor extends BaseArgConvertor {
161
161
  convertorArg(param, writer) {
162
162
  return writer.makeUndefined().asString();
163
163
  }
164
- convertorSerialize(param, value, printer) { }
164
+ convertorSerialize(param, value, printer) {
165
+ return printer.makeStatement(printer.makeString(""));
166
+ }
165
167
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
166
168
  return assigneer(writer.makeUndefined());
167
169
  }
@@ -196,7 +198,7 @@ export class StringConvertor extends BaseArgConvertor {
196
198
  : writer.escapeKeyword(param);
197
199
  }
198
200
  convertorSerialize(param, value, writer) {
199
- writer.writeMethodCall(`${param}Serializer`, `writeString`, [value]);
201
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeString", [writer.makeString(value)]));
200
202
  }
201
203
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
202
204
  return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readString()`), this.idlType, { optional: false }));
@@ -231,7 +233,7 @@ export class EnumConvertor extends BaseArgConvertor {
231
233
  return writer.i32FromEnum(writer.makeString(writer.escapeKeyword(param)), this.enumEntry).asString();
232
234
  }
233
235
  convertorSerialize(param, value, writer) {
234
- writer.writeMethodCall(`${param}Serializer`, "writeInt32", [writer.i32FromEnum(writer.makeString(value), this.enumEntry).asString()]);
236
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt32", [writer.i32FromEnum(writer.makeString(value), this.enumEntry)]));
235
237
  }
236
238
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
237
239
  const readExpr = writer.makeMethodCall(`${deserializerName}`, "readInt32", []);
@@ -251,7 +253,21 @@ export class EnumConvertor extends BaseArgConvertor {
251
253
  return writer.getNodeName(this.idlType); // this.enumTypeName(writer.language)
252
254
  }
253
255
  unionDiscriminator(value, index, writer, duplicates) {
254
- return writer.makeDiscriminatorConvertor(this, value, index);
256
+ const convertorNativeType = this.nativeType();
257
+ const decl = writer.resolver.resolveTypeReference(idl.isReferenceType(convertorNativeType)
258
+ ? convertorNativeType
259
+ : idl.createReferenceType(this.targetType(writer)));
260
+ if (decl === undefined || !idl.isEnum(decl)) {
261
+ throwException(`The type reference ${decl === null || decl === void 0 ? void 0 : decl.name} must be Enum`);
262
+ }
263
+ const ordinal = idl.isStringEnum(decl)
264
+ ? writer.i32FromEnum(writer.makeCast(writer.makeString(writer.getObjectAccessor(this, value)), this.idlType), decl)
265
+ : writer.makeUnionVariantCast(writer.getObjectAccessor(this, value), writer.getNodeName(idl.IDLI32Type), this, index);
266
+ const { low, high } = idl.extremumOfOrdinals(decl);
267
+ return writer.makeNaryOp("&&", [
268
+ writer.makeNaryOp(">=", [ordinal, writer.makeString(low.toString())]),
269
+ writer.makeNaryOp("<=", [ordinal, writer.makeString(high.toString())])
270
+ ]);
255
271
  }
256
272
  }
257
273
  export class NumberConvertor extends BaseArgConvertor {
@@ -265,8 +281,8 @@ export class NumberConvertor extends BaseArgConvertor {
265
281
  ? writer.makeUnsafeCast_(writer.makeString(`&${param}`), this.idlType, PrintHint.AsConstPointer)
266
282
  : writer.escapeKeyword(param);
267
283
  }
268
- convertorSerialize(param, value, printer) {
269
- printer.writeMethodCall(`${param}Serializer`, "writeNumber", [value]);
284
+ convertorSerialize(param, value, writer) {
285
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeNumber", [writer.makeString(value)]));
270
286
  }
271
287
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
272
288
  return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readNumber()`), this.idlType, { optional: false }));
@@ -290,8 +306,8 @@ export class NumericConvertor extends BaseArgConvertor {
290
306
  convertorArg(param, writer) {
291
307
  return param;
292
308
  }
293
- convertorSerialize(param, value, printer) {
294
- printer.writeMethodCall(`${param}Serializer`, `write${this.interopNameConvertor.convert(this.idlType)}`, [value]);
309
+ convertorSerialize(param, value, writer) {
310
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `write${this.interopNameConvertor.convert(this.idlType)}`, [writer.makeString(value)]));
295
311
  }
296
312
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
297
313
  return assigneer(writer.makeString(`${deserializerName}.read${this.interopNameConvertor.convert(this.idlType)}()`));
@@ -313,8 +329,8 @@ export class BigIntToU64Convertor extends BaseArgConvertor {
313
329
  convertorArg(param, writer) {
314
330
  return writer.escapeKeyword(param);
315
331
  }
316
- convertorSerialize(param, value, printer) {
317
- printer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
332
+ convertorSerialize(param, value, writer) {
333
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `writeInt64`, [writer.makeString(value)]));
318
334
  }
319
335
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
320
336
  return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readInt64()`), this.idlType, { optional: false }));
@@ -345,13 +361,8 @@ export class ObjectConvertor extends BaseArgConvertor {
345
361
  convertorArg(param, writer) {
346
362
  return writer.escapeKeyword(param);
347
363
  }
348
- convertorSerialize(param, value, printer) {
349
- if (printer.language === Language.CPP) {
350
- printer.writeMethodCall(`${param}Serializer`, "writeObject", [value]);
351
- }
352
- else {
353
- printer.writeMethodCall(`${param}Serializer`, "holdAndWriteObject", [value]);
354
- }
364
+ convertorSerialize(param, value, writer) {
365
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, writer.language === Language.CPP ? `writeObject` : "holdAndWriteObject", [writer.makeString(value)]));
355
366
  }
356
367
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
357
368
  return assigneer(writer.makeCast(writer.makeMethodCall(deserializerName, 'readObject', []), this.idlType, { optional: false }));
@@ -380,8 +391,8 @@ export class PointerConvertor extends BaseArgConvertor {
380
391
  convertorArg(param, writer) {
381
392
  return param;
382
393
  }
383
- convertorSerialize(param, value, printer) {
384
- printer.writeMethodCall(`${param}Serializer`, `writePointer`, [value]);
394
+ convertorSerialize(param, value, writer) {
395
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeString(value)]));
385
396
  }
386
397
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
387
398
  return assigneer(writer.makeString(`${deserializerName}.readPointer()`));
@@ -403,8 +414,8 @@ export class BufferConvertor extends BaseArgConvertor {
403
414
  convertorArg(param, _) {
404
415
  return param;
405
416
  }
406
- convertorSerialize(param, value, printer) {
407
- printer.writeMethodCall(`${param}Serializer`, "writeBuffer", [value]);
417
+ convertorSerialize(param, value, writer) {
418
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeBuffer", [writer.makeString(value)]));
408
419
  }
409
420
  convertorDeserialize(_, deserializerName, assigneer, writer) {
410
421
  return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readBuffer()`), this.idlType, { optional: false }));
@@ -419,7 +430,7 @@ export class BufferConvertor extends BaseArgConvertor {
419
430
  return true;
420
431
  }
421
432
  unionDiscriminator(value, index, writer, duplicates) {
422
- return writer.instanceOf(this, value);
433
+ return writer.instanceOf(value, this.idlType);
423
434
  }
424
435
  }
425
436
  export class AggregateConvertor extends BaseArgConvertor {
@@ -441,12 +452,16 @@ export class AggregateConvertor extends BaseArgConvertor {
441
452
  throw new Error("Do not use for aggregates");
442
453
  }
443
454
  convertorSerialize(param, value, printer) {
444
- this.memberConvertors.forEach((it, index) => {
445
- let memberName = this.members[index][0];
446
- let memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
447
- printer.writeStatement(printer.makeAssign(`${value}_${memberName}`, undefined, printer.makeString(memberAccess), true));
448
- it.convertorSerialize(param, `${value}_${memberName}`, printer);
455
+ const stmts = this.memberConvertors.flatMap((it, index) => {
456
+ const memberName = this.members[index][0];
457
+ const memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
458
+ const memberMangledName = `${value}${capitalize(memberName)}`;
459
+ return [
460
+ printer.makeAssign(memberMangledName, undefined, printer.makeString(memberAccess), true),
461
+ it.convertorSerialize(param, memberMangledName, printer)
462
+ ];
449
463
  });
464
+ return printer.makeBlock(stmts, false);
450
465
  }
451
466
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
452
467
  const statements = [];
@@ -461,7 +476,8 @@ export class AggregateConvertor extends BaseArgConvertor {
461
476
  for (let i = 0; i < this.decl.properties.length; i++) {
462
477
  const prop = this.decl.properties[i];
463
478
  const propConvertor = this.memberConvertors[i];
464
- statements.push(propConvertor.convertorDeserialize(`${bufferName}_${prop.name}_buf`, deserializerName, (expr) => {
479
+ const propName = `${bufferName}${capitalize(prop.name)}`;
480
+ statements.push(propConvertor.convertorDeserialize(`${propName}TempBuf`, deserializerName, (expr) => {
465
481
  if (writer.language === Language.CPP) {
466
482
  // prefix initialization for CPP, just easier. Waiting for easy work with nullables
467
483
  return writer.makeAssign(`${bufferName}.${writer.escapeKeyword(prop.name)}`, undefined, expr, false);
@@ -470,7 +486,7 @@ export class AggregateConvertor extends BaseArgConvertor {
470
486
  * todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
471
487
  */
472
488
  const memberType = idl.maybeOptional(prop.type, prop.isOptional);
473
- return writer.makeAssign(`${bufferName}_${prop.name}`, memberType, expr, true, true);
489
+ return writer.makeAssign(propName, memberType, expr, true, true);
474
490
  }, writer));
475
491
  }
476
492
  if (writer.language === Language.CPP) {
@@ -480,9 +496,15 @@ export class AggregateConvertor extends BaseArgConvertor {
480
496
  const resultExpression = writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(", ")})`);
481
497
  statements.push(assigneer(resultExpression));
482
498
  }
499
+ else if (writer.language == Language.KOTLIN) {
500
+ const resultExpression = this.decl.subkind === idl.IDLInterfaceSubkind.Tuple ?
501
+ writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(', ')})`) :
502
+ writer.makeString(`object: ${writer.getNodeName(this.idlType)} { ${this.decl.properties.map(prop => `override var ${prop.name} = ${bufferName}_${prop.name}`).join("; ")} }`);
503
+ statements.push(assigneer(resultExpression));
504
+ }
483
505
  else {
484
506
  const resultExpression = this.makeAssigneeExpression(this.decl.properties.map(prop => {
485
- return [prop.name, writer.makeString(`${bufferName}_${prop.name}`)];
507
+ return [prop.name, writer.makeString(`${bufferName}${capitalize(prop.name)}`)];
486
508
  }), writer);
487
509
  statements.push(assigneer(resultExpression));
488
510
  }
@@ -506,7 +528,7 @@ export class AggregateConvertor extends BaseArgConvertor {
506
528
  }
507
529
  unionDiscriminator(value, index, writer, duplicates) {
508
530
  const uniqueFields = this.members.filter(it => !duplicates.has(it[0]));
509
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1], duplicates);
531
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1]);
510
532
  }
511
533
  }
512
534
  export class TupleConvertor extends AggregateConvertor {
@@ -517,10 +539,13 @@ export class TupleConvertor extends AggregateConvertor {
517
539
  throw new Error("Must never be used");
518
540
  }
519
541
  convertorSerialize(param, value, printer) {
520
- this.memberConvertors.forEach((it, index) => {
521
- printer.writeStatement(printer.makeAssign(`${value}_${index}`, undefined, printer.makeTupleAccess(value, index), true));
522
- it.convertorSerialize(param, `${value}_${index}`, printer);
542
+ const stmts = this.memberConvertors.flatMap((it, index) => {
543
+ return [
544
+ printer.makeAssign(`${value}_${index}`, undefined, printer.makeTupleAccess(value, index), true),
545
+ it.convertorSerialize(param, `${value}_${index}`, printer)
546
+ ];
523
547
  });
548
+ return printer.makeBlock(stmts, false);
524
549
  }
525
550
  makeAssigneeExpression(fields, writer) {
526
551
  return writer.makeCast(writer.makeString(`[${fields.map(it => it[1].asString()).join(', ')}]`), this.idlType);
@@ -551,10 +576,10 @@ export class InterfaceConvertor extends BaseArgConvertor {
551
576
  convertorArg(param, writer) {
552
577
  throw new Error("Must never be used");
553
578
  }
554
- convertorSerialize(param, value, printer) {
579
+ convertorSerialize(param, value, writer) {
555
580
  const accessor = getSerializerName(this.declaration);
556
- printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
557
- printer.writeStaticMethodCall(accessor, 'write', [`${param}Serializer`, value]);
581
+ writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
582
+ return writer.makeStatement(writer.makeStaticMethodCall(accessor, 'write', [writer.makeString(`${param}Serializer`), writer.makeString(value)]));
558
583
  }
559
584
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
560
585
  const accessor = getSerializerName(this.declaration);
@@ -580,7 +605,7 @@ export class InterfaceConvertor extends BaseArgConvertor {
580
605
  var _a;
581
606
  // Try to figure out interface by examining field sets
582
607
  const uniqueFields = (_a = this.declaration) === null || _a === void 0 ? void 0 : _a.properties.filter(it => !duplicates.has(it.name));
583
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
608
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
584
609
  }
585
610
  }
586
611
  export class ClassConvertor extends InterfaceConvertor {
@@ -588,7 +613,7 @@ export class ClassConvertor extends InterfaceConvertor {
588
613
  super(library, name, param, declaration);
589
614
  }
590
615
  unionDiscriminator(value, index, writer, duplicateMembers) {
591
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicateMembers)]);
616
+ return writer.instanceOf(value, this.idlType);
592
617
  }
593
618
  }
594
619
  export class ArrayConvertor extends BaseArgConvertor {
@@ -603,26 +628,27 @@ export class ArrayConvertor extends BaseArgConvertor {
603
628
  throw new Error("Must never be used");
604
629
  }
605
630
  convertorSerialize(param, value, printer) {
631
+ const statements = [];
606
632
  // Array length.
607
633
  const valueLength = printer.makeArrayLength(value).asString();
608
- const loopCounter = "i";
609
- printer.writeMethodCall(`${param}Serializer`, "writeInt32", [printer.castToInt(valueLength, 32)]);
610
- printer.writeStatement(printer.makeLoop(loopCounter, valueLength));
611
- printer.pushIndent();
612
- printer.writeStatement(printer.makeAssign(`${value}_element`, this.elementType, printer.makeArrayAccess(value, loopCounter), true));
613
- this.elementConvertor.convertorSerialize(param, `${value}_element`, printer);
614
- printer.popIndent();
615
- printer.print(`}`);
634
+ statements.push(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt32", [printer.makeString(printer.castToInt(valueLength, 32))])));
635
+ const loopCounter = `${value}CounterI`;
636
+ const elementName = `${value}TmpElement`;
637
+ statements.push(printer.makeLoop(loopCounter, valueLength, printer.makeBlock([
638
+ printer.makeAssign(elementName, this.elementType, printer.makeArrayAccess(value, loopCounter), true),
639
+ this.elementConvertor.convertorSerialize(param, elementName, printer)
640
+ ], false)));
641
+ return printer.makeBlock(statements, false);
616
642
  }
617
643
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
618
- const lengthBuffer = `${bufferName}_length`;
619
- const counterBuffer = `${bufferName}_i`;
644
+ const lengthBuffer = `${bufferName}Length`;
645
+ const counterBuffer = `${bufferName}BufCounterI`;
620
646
  const statements = [];
621
647
  const arrayType = this.idlType;
622
648
  statements.push(writer.makeAssign(lengthBuffer, idl.IDLI32Type, writer.makeString(`${deserializerName}.readInt32()`), true));
623
649
  statements.push(writer.makeAssign(bufferName, arrayType, writer.makeArrayInit(this.type, lengthBuffer), true, false));
624
650
  statements.push(writer.makeArrayResize(bufferName, writer.getNodeName(arrayType), lengthBuffer, deserializerName));
625
- statements.push(writer.makeLoop(counterBuffer, lengthBuffer, this.elementConvertor.convertorDeserialize(`${bufferName}_buf`, deserializerName, (expr) => {
651
+ statements.push(writer.makeLoop(counterBuffer, lengthBuffer, this.elementConvertor.convertorDeserialize(`${bufferName}TempBuf`, deserializerName, (expr) => {
626
652
  return writer.makeAssign(writer.makeArrayAccess(bufferName, counterBuffer).asString(), undefined, expr, false);
627
653
  }, writer)));
628
654
  statements.push(assigneer(writer.makeString(bufferName)));
@@ -638,7 +664,7 @@ export class ArrayConvertor extends BaseArgConvertor {
638
664
  return true;
639
665
  }
640
666
  unionDiscriminator(value, index, writer, duplicates) {
641
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
667
+ return writer.instanceOf(value, this.idlType);
642
668
  }
643
669
  getObjectAccessor(language, value, args) {
644
670
  const array = language === Language.CPP ? ".array" : "";
@@ -660,20 +686,22 @@ export class MapConvertor extends BaseArgConvertor {
660
686
  convertorSerialize(param, value, printer) {
661
687
  // Map size.
662
688
  const mapSize = printer.makeMapSize(value);
663
- printer.writeMethodCall(`${param}Serializer`, "writeInt32", [printer.castToInt(mapSize.asString(), 32)]);
664
- printer.writeStatement(printer.makeMapForEach(value, `${value}_key`, `${value}_value`, () => {
665
- this.keyConvertor.convertorSerialize(param, `${value}_key`, printer);
666
- this.valueConvertor.convertorSerialize(param, `${value}_value`, printer);
667
- }));
689
+ return printer.makeBlock([
690
+ printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt32", [printer.makeString(printer.castToInt(mapSize.asString(), 32))])),
691
+ printer.makeMapForEach(value, `${value}KeyVar`, `${value}ValueVar`, [
692
+ this.keyConvertor.convertorSerialize(param, `${value}KeyVar`, printer),
693
+ this.valueConvertor.convertorSerialize(param, `${value}ValueVar`, printer)
694
+ ])
695
+ ], false);
668
696
  }
669
697
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
670
698
  const mapTypeName = writer.getNodeName(this.idlType);
671
699
  const keyType = this.keyType;
672
700
  const valueType = this.valueType;
673
- const sizeBuffer = `${bufferName}_size`;
674
- const keyBuffer = `${bufferName}_key`;
675
- const valueBuffer = `${bufferName}_value`;
676
- const counterBuffer = `${bufferName}_i`;
701
+ const sizeBuffer = `${bufferName}SizeVar`;
702
+ const keyBuffer = `${bufferName}KeyVar`;
703
+ const valueBuffer = `${bufferName}ValueVar`;
704
+ const counterBuffer = `${bufferName}IVar`;
677
705
  const keyAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "keys" });
678
706
  const valueAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "values" });
679
707
  return new BlockStatement([
@@ -681,10 +709,10 @@ export class MapConvertor extends BaseArgConvertor {
681
709
  writer.makeAssign(bufferName, this.idlType, writer.makeMapInit(this.idlType), true, false),
682
710
  writer.makeMapResize(mapTypeName, keyType, valueType, bufferName, sizeBuffer, deserializerName),
683
711
  writer.makeLoop(counterBuffer, sizeBuffer, new BlockStatement([
684
- this.keyConvertor.convertorDeserialize(`${keyBuffer}_buf`, deserializerName, (expr) => {
712
+ this.keyConvertor.convertorDeserialize(`${keyBuffer}TempBuf`, deserializerName, (expr) => {
685
713
  return writer.makeAssign(keyBuffer, keyType, expr, true, true);
686
714
  }, writer),
687
- this.valueConvertor.convertorDeserialize(`${valueBuffer}_buf`, deserializerName, (expr) => {
715
+ this.valueConvertor.convertorDeserialize(`${valueBuffer}TempBuf`, deserializerName, (expr) => {
688
716
  return writer.makeAssign(valueBuffer, valueType, expr, true, true);
689
717
  }, writer),
690
718
  writer.makeMapInsert(keyAccessor, keyBuffer, valueAccessor, valueBuffer),
@@ -702,7 +730,7 @@ export class MapConvertor extends BaseArgConvertor {
702
730
  return true;
703
731
  }
704
732
  unionDiscriminator(value, index, writer, duplicates) {
705
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.makeString(`${value} instanceof Map`)]);
733
+ return writer.makeString(`${value} instanceof Map`);
706
734
  }
707
735
  getObjectAccessor(language, value, args) {
708
736
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) && (args === null || args === void 0 ? void 0 : args.field)
@@ -712,7 +740,7 @@ export class MapConvertor extends BaseArgConvertor {
712
740
  }
713
741
  export class DateConvertor extends BaseArgConvertor {
714
742
  constructor(param) {
715
- super(idl.IDLBigintType, [RuntimeType.NUMBER], false, false, param);
743
+ super(idl.IDLDate, [RuntimeType.NUMBER], false, false, param);
716
744
  }
717
745
  convertorArg(param, writer) {
718
746
  if (writer.language === Language.CPP) {
@@ -722,17 +750,17 @@ export class DateConvertor extends BaseArgConvertor {
722
750
  }
723
751
  convertorSerialize(param, value, writer) {
724
752
  if (writer.language === Language.CPP) {
725
- writer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
753
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [writer.makeString(value)]));
726
754
  }
727
755
  else if (writer.language === Language.CJ) {
728
- writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
729
- writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type).asString()
730
- ]);
756
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [
757
+ writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type)
758
+ ]));
731
759
  }
732
760
  else {
733
- writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
734
- writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type).asString()
735
- ]);
761
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [
762
+ writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type)
763
+ ]));
736
764
  }
737
765
  }
738
766
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
@@ -767,7 +795,7 @@ export class ProxyConvertor extends BaseArgConvertor {
767
795
  return this.convertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
768
796
  }
769
797
  convertorSerialize(param, value, printer) {
770
- this.convertor.convertorSerialize(param, value, printer);
798
+ return this.convertor.convertorSerialize(param, value, printer);
771
799
  }
772
800
  nativeType() {
773
801
  return this.convertor.nativeType();
@@ -802,7 +830,7 @@ export class CustomTypeConvertor extends BaseArgConvertor {
802
830
  }
803
831
  /** todo: check */
804
832
  convertorSerialize(param, value, printer) {
805
- printer.writeMethodCall(`${param}Serializer`, `writeCustomObject`, [`"${this.customTypeName}"`, printer.makeCastCustomObject(value, this.isGenericType).asString()]);
833
+ return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, `writeCustomObject`, [printer.makeString(`"${this.customTypeName}"`), printer.makeCastCustomObject(value, this.isGenericType)]));
806
834
  }
807
835
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
808
836
  const type = writer.language === Language.CPP
@@ -843,30 +871,12 @@ export class OptionConvertor extends BaseArgConvertor {
843
871
  throw new Error("Must never be used");
844
872
  }
845
873
  convertorSerialize(param, value, printer) {
846
- const valueType = `${value}_type`.replaceAll('.', '_');
847
- const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
848
- printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
849
- if (printer.language != Language.CJ && printer.language != Language.KOTLIN) {
850
- printer.runtimeType(this, valueType, value);
851
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
852
- }
853
- printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
854
- printer.pushIndent();
855
- if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
856
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
857
- }
858
- const valueValue = `${value}_value`.replaceAll('.', '_');
859
- printer.writeStatement(printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true));
860
- this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
861
- printer.popIndent();
862
- printer.print(`}`);
863
- if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
864
- printer.print('else {');
865
- printer.pushIndent();
866
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
867
- printer.popIndent();
868
- printer.print('}');
869
- }
874
+ const valueValue = `${value}TmpValue`.replaceAll('.', '_');
875
+ return printer.makeCondition(printer.makeDefinedCheck(value), new BlockStatement([
876
+ printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.OBJECT)])),
877
+ printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true),
878
+ this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer)
879
+ ], true, false), new BlockStatement([printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.UNDEFINED)]))], true, false));
870
880
  }
871
881
  convertorCArg(param) {
872
882
  throw new Error("Must never be used");
@@ -883,7 +893,7 @@ export class OptionConvertor extends BaseArgConvertor {
883
893
  ? `${bufferName}.value` : bufferName;
884
894
  return writer.makeAssign(receiver, undefined, expr, false);
885
895
  }, writer)
886
- ]);
896
+ ], true, false);
887
897
  statements.push(writer.makeSetOptionTag(bufferName, writer.makeCast(writer.makeString(runtimeBufferName), writer.getTagType())));
888
898
  statements.push(writer.makeCondition(writer.makeRuntimeTypeDefinedCheck(runtimeBufferName), thenStatement));
889
899
  statements.push(assigneer(writer.makeString(bufferName)));
@@ -916,27 +926,23 @@ export class UnionConvertor extends BaseArgConvertor {
916
926
  throw new Error("Do not use for union");
917
927
  }
918
928
  convertorSerialize(param, value, printer) {
919
- var _a;
920
- printer.writeStatement(printer.makeAssign(`${value}_type`, idl.IDLI32Type, printer.makeUnionTypeDefaultInitializer(), true, false));
921
- printer.writeStatement(printer.makeUnionSelector(value, `${value}_type`));
922
- this.memberConvertors.forEach((it, index) => {
923
- const maybeElse = (index > 0 && this.memberConvertors[index - 1].runtimeTypes.length > 0) ? "else " : "";
924
- const conditions = this.unionChecker.makeDiscriminator(value, index, printer);
925
- printer.print(`${maybeElse}if (${conditions.asString()}) {`);
926
- printer.pushIndent();
927
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(index.toString(), 8)]);
929
+ const branches = this.memberConvertors.map((it, index) => {
930
+ const discriminator = this.unionChecker.makeDiscriminator(value, index, printer);
931
+ const statements = [];
932
+ statements.push(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeString(printer.castToInt(index.toString(), 8))])));
928
933
  if (!(it instanceof UndefinedConvertor)) {
929
- printer.writeStatement(printer.makeAssign(`${value}_${index}`, undefined, printer.makeUnionVariantCast(it.getObjectAccessor(printer.language, value), printer.getNodeName(it.idlType), it, index), true));
930
- it.convertorSerialize(param, `${value}_${index}`, printer);
934
+ const varName = `${value}ForIdx${index}`;
935
+ statements.push(printer.makeAssign(varName, undefined, printer.makeUnionVariantCast(it.getObjectAccessor(printer.language, value), printer.getNodeName(it.idlType), it, index), true));
936
+ statements.push(it.convertorSerialize(param, varName, printer));
931
937
  }
932
- printer.popIndent();
933
- printer.print(`}`);
938
+ const stmt = new BlockStatement(statements, false);
939
+ return { expr: discriminator, stmt };
934
940
  });
935
- this.unionChecker.reportConflicts((_a = this.library.getCurrentContext()) !== null && _a !== void 0 ? _a : "<unknown context>", printer);
941
+ return printer.makeMultiBranchCondition(branches);
936
942
  }
937
943
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
938
944
  const statements = [];
939
- let selectorBuffer = `${bufferName}_selector`;
945
+ let selectorBuffer = `${bufferName}UnionSelector`;
940
946
  const maybeOptionalUnion = writer.language === Language.CPP || writer.language == Language.CJ
941
947
  ? this.type
942
948
  : idl.createOptionalType(this.type);
@@ -949,8 +955,8 @@ export class UnionConvertor extends BaseArgConvertor {
949
955
  const expr = writer.makeString(`${selectorBuffer} == ${writer.castToInt(index.toString(), 8)}`);
950
956
  const stmt = new BlockStatement([
951
957
  writer.makeSetUnionSelector(bufferName, `${index}`),
952
- it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
953
- if (writer.language == Language.CJ) {
958
+ it.convertorDeserialize(`${bufferName}BufU`, deserializerName, (expr) => {
959
+ if (writer.language == Language.CJ || writer.language == Language.KOTLIN) {
954
960
  return writer.makeAssign(receiver, undefined, writer.makeFunctionCall(writer.getNodeName(this.type), [expr]), false);
955
961
  }
956
962
  else {
@@ -977,8 +983,7 @@ export class UnionConvertor extends BaseArgConvertor {
977
983
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) ? `${value}.value${args.index}` : value;
978
984
  }
979
985
  unionDiscriminator(value, index, writer, duplicates) {
980
- const checker = new UnionRuntimeTypeChecker(this.memberConvertors);
981
- return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => checker.makeDiscriminator(value, n, writer)));
986
+ return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => this.unionChecker.makeDiscriminator(value, n, writer)));
982
987
  }
983
988
  }
984
989
  export class FunctionConvertor extends BaseArgConvertor {
@@ -988,13 +993,13 @@ export class FunctionConvertor extends BaseArgConvertor {
988
993
  this.library = library;
989
994
  }
990
995
  convertorArg(param, writer) {
991
- return writer.language == Language.CPP ? `makeArkFunctionFromId(${param})` : `registerCallback(${param})`;
996
+ throw new Error('Shall not be used');
992
997
  }
993
998
  convertorSerialize(param, value, writer) {
994
- writer.writeMethodCall(`${param}Serializer`, "writeFunction", [value]);
999
+ throw new Error('Shall not be used');
995
1000
  }
996
1001
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
997
- return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readFunction()`), idl.IDLFunctionType, { optional: true }));
1002
+ throw new Error('Shall not be used');
998
1003
  }
999
1004
  nativeType() {
1000
1005
  return idl.IDLFunctionType;
@@ -1017,16 +1022,21 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1017
1022
  case Language.CPP:
1018
1023
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1019
1024
  case Language.JAVA:
1025
+ case Language.KOTLIN:
1020
1026
  case Language.CJ:
1021
1027
  return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1022
1028
  default:
1029
+ if (isInExternalModule(this.declaration)) {
1030
+ const extractor = getExtractor(this.declaration, writer.language, true);
1031
+ return `${extractor.receiver}.${extractor.method}(${param})`;
1032
+ }
1023
1033
  return `toPeerPtr(${param})`;
1024
1034
  }
1025
1035
  }
1026
1036
  convertorSerialize(param, value, printer) {
1027
1037
  const accessorRoot = getSerializerName(this.declaration);
1028
1038
  printer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1029
- printer.writeStaticMethodCall(accessorRoot, 'write', [`${param}Serializer`, value]);
1039
+ return printer.makeStatement(printer.makeStaticMethodCall(accessorRoot, 'write', [printer.makeString(`${param}Serializer`), printer.makeString(value)]));
1030
1040
  }
1031
1041
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1032
1042
  const accessorRoot = getSerializerName(this.declaration);
@@ -1046,62 +1056,11 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1046
1056
  unionDiscriminator(value, index, writer, duplicates) {
1047
1057
  if (idl.isInterface(this.declaration)) {
1048
1058
  if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
1049
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
1050
- }
1051
- if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1052
- const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
1053
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
1054
- }
1055
- }
1056
- }
1057
- }
1058
- export class ExternalTypeConvertor extends BaseArgConvertor {
1059
- constructor(library, param, declaration) {
1060
- super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
1061
- this.library = library;
1062
- this.declaration = declaration;
1063
- console.log(`ExternalType convertor for type: ${declaration.name}`);
1064
- }
1065
- convertorArg(param, writer) {
1066
- const lang = writer.language;
1067
- switch (lang) {
1068
- case Language.CPP:
1069
- return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1070
- default:
1071
- return `extractors.${getExtractorName(this.declaration, lang, true)}(${param})`;
1072
- }
1073
- }
1074
- convertorSerialize(param, value, printer) {
1075
- const accessor = getSerializerName(this.declaration);
1076
- printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1077
- printer.writeStatement(printer.makeStatement(printer.makeStaticMethodCall(accessor, 'write', [
1078
- printer.makeString(`${param}Serializer`),
1079
- printer.makeString(value)
1080
- ])));
1081
- }
1082
- convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1083
- const accessor = getSerializerName(this.declaration);
1084
- writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1085
- const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]), this.declaration);
1086
- return assigneer(readStatement);
1087
- }
1088
- nativeType() {
1089
- return idl.createReferenceType(this.declaration);
1090
- }
1091
- interopType() {
1092
- return idl.IDLPointerType;
1093
- }
1094
- isPointerType() {
1095
- return false;
1096
- }
1097
- unionDiscriminator(value, index, writer, duplicates) {
1098
- if (idl.isInterface(this.declaration)) {
1099
- if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
1100
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
1059
+ return writer.instanceOf(value, this.idlType);
1101
1060
  }
1102
1061
  if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1103
1062
  const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
1104
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
1063
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
1105
1064
  }
1106
1065
  }
1107
1066
  }
@@ -1116,7 +1075,7 @@ export class ImportTypeConvertor extends BaseArgConvertor {
1116
1075
  throw new Error("Must never be used");
1117
1076
  }
1118
1077
  convertorSerialize(param, value, printer) {
1119
- printer.writeMethodCall(`${param}Serializer`, "writeCustomObject", [`"${this.importedName}"`, value]);
1078
+ return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeCustomObject", [printer.makeString(`"${this.importedName}"`), printer.makeString(value)]));
1120
1079
  }
1121
1080
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1122
1081
  return assigneer(writer.makeString(`${deserializerName}.readCustomObject("${this.importedName}")`));
@@ -1151,14 +1110,15 @@ export class CallbackConvertor extends BaseArgConvertor {
1151
1110
  }
1152
1111
  convertorSerialize(param, value, writer) {
1153
1112
  if (writer.language == Language.CPP) {
1154
- writer.writeMethodCall(`${param}Serializer`, "writeCallbackResource", [`${value}.resource`]);
1155
- writer.writeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.call`), idl.IDLPointerType, { unsafe: true }).asString()]);
1156
- writer.writeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.callSync`), idl.IDLPointerType, { unsafe: true }).asString()]);
1157
- return;
1113
+ return writer.makeBlock([
1114
+ writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeCallbackResource", [writer.makeString(`${value}.resource`)])),
1115
+ writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.call`), idl.IDLPointerType, { unsafe: true })])),
1116
+ writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.callSync`), idl.IDLPointerType, { unsafe: true })]))
1117
+ ], false);
1158
1118
  }
1159
1119
  if (this.isTransformed)
1160
1120
  value = `CallbackTransformer.transformFrom${this.library.getInteropName(this.decl)}(${value})`;
1161
- writer.writeMethodCall(`${param}Serializer`, `holdAndWriteCallback`, [`${value}`]);
1121
+ return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallback`, [writer.makeString(`${value}`)]));
1162
1122
  }
1163
1123
  convertorDeserialize(bufferName, deserializerName, assigneer, writer, useSyncVersion = false) {
1164
1124
  if (writer.language == Language.CPP) {
@@ -1175,12 +1135,12 @@ export class CallbackConvertor extends BaseArgConvertor {
1175
1135
  });
1176
1136
  return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
1177
1137
  }
1178
- const resourceName = bufferName + "_resource";
1179
- const callName = bufferName + "_call";
1180
- const callSyncName = bufferName + '_callSync';
1181
- const argsSerializer = bufferName + "_args";
1182
- const continuationValueName = bufferName + "_continuationValue";
1183
- const continuationCallbackName = bufferName + "_continuationCallback";
1138
+ const resourceName = bufferName + "BufResource";
1139
+ const callName = bufferName + "BufCall";
1140
+ const callSyncName = bufferName + 'BufCallSync';
1141
+ const argsSerializer = bufferName + "BufArgs";
1142
+ const continuationValueName = bufferName + "BufContinuationValue";
1143
+ const continuationCallbackName = bufferName + "BufContinuationCallback";
1184
1144
  const statements = [];
1185
1145
  statements.push(writer.makeAssign(resourceName, idl.createReferenceType("CallbackResource"), writer.makeMethodCall(deserializerName, 'readCallbackResource', []), true));
1186
1146
  statements.push(writer.makeAssign(callName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, `readPointer`, []), true));
@@ -1196,14 +1156,14 @@ export class CallbackConvertor extends BaseArgConvertor {
1196
1156
  continuation = [
1197
1157
  writer.language == Language.CJ ?
1198
1158
  writer.makeAssign(continuationValueName, undefined, writer.makeString(`${writer.getNodeName(this.decl.returnType).replace(/[\<\>]/g, '')}Holder(None<${writer.getNodeName(this.decl.returnType)}>)`), true, true) :
1199
- writer.makeAssign(continuationValueName, optionalReturnType, undefined, true, false),
1159
+ writer.makeAssign(continuationValueName, optionalReturnType, writer.language == Language.KOTLIN ? writer.makeNull() : undefined, true, false),
1200
1160
  writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
1201
1161
  writer.language == Language.CJ ?
1202
1162
  writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
1203
1163
  writer.makeAssign(continuationValueName, undefined, writer.makeString(`value`), false)
1204
1164
  ]), true),
1205
1165
  new ProxyStatement(writer => {
1206
- continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer);
1166
+ writer.writeStatement(continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer));
1207
1167
  }),
1208
1168
  ];
1209
1169
  }
@@ -1215,7 +1175,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1215
1175
  ...this.decl.parameters.map(it => {
1216
1176
  const convertor = this.library.typeConvertor(it.name, it.type, it.isOptional);
1217
1177
  return new ProxyStatement((writer) => {
1218
- convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer);
1178
+ writer.writeStatement(convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer));
1219
1179
  });
1220
1180
  }),
1221
1181
  ...continuation,
@@ -1231,7 +1191,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1231
1191
  writer.makeString(`${argsSerializer}Serializer.length()`),
1232
1192
  ])),
1233
1193
  new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
1234
- writer.makeReturn(hasContinuation
1194
+ writer.makeLambdaReturn(hasContinuation
1235
1195
  ? writer.makeCast(writer.language == Language.CJ ?
1236
1196
  writer.makeString(`${continuationValueName}.value`) :
1237
1197
  writer.makeString(continuationValueName), this.decl.returnType)
@@ -1248,10 +1208,6 @@ export class CallbackConvertor extends BaseArgConvertor {
1248
1208
  isPointerType() {
1249
1209
  return true;
1250
1210
  }
1251
- unionDiscriminator(value, index, writer, duplicates) {
1252
- // We serialize callbacks as table offsets, so don't need to discriminate them. Runtime type check is enough
1253
- return writer.makeUnionVariantCondition(this, value, `${value}_type`, RuntimeType[RuntimeType.FUNCTION]);
1254
- }
1255
1211
  }
1256
1212
  ////////////////////////////////////////////////////////////////////////////////
1257
1213
  // UTILS
@@ -1314,13 +1270,18 @@ class PromiseOutArgConvertor extends BaseArgConvertor {
1314
1270
  }
1315
1271
  convertorSerialize(param, value, writer) {
1316
1272
  if (writer.language == Language.CPP) {
1317
- this.callbackConvertor.convertorSerialize(param, value, writer);
1318
- return;
1273
+ return this.callbackConvertor.convertorSerialize(param, value, writer);
1274
+ }
1275
+ let serializeCallback;
1276
+ if (idl.isVoidType(this.promise.elementType[0])) {
1277
+ serializeCallback = writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromiseVoid`, []);
1278
+ }
1279
+ else {
1280
+ serializeCallback = writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromise<${writer.getNodeName(this.promise.elementType[0])}>`, []);
1319
1281
  }
1320
- const serializeCallback = idl.isVoidType(this.promise.elementType[0])
1321
- ? writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromiseVoid`, [])
1322
- : writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromise<${writer.getNodeName(this.promise.elementType[0])}>`, []);
1323
- writer.writeStatement(writer.makeAssign(value, undefined, writer.language == Language.CJ ? writer.makeString(serializeCallback.asString().concat('.promise')) : writer.makeTupleAccess(serializeCallback.asString(), 0), true));
1282
+ return writer.makeAssign(value, undefined, writer.language == Language.CJ
1283
+ ? writer.makeString(serializeCallback.asString().concat('.promise'))
1284
+ : writer.makeTupleAccess(serializeCallback.asString(), 0), true);
1324
1285
  }
1325
1286
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1326
1287
  return this.callbackConvertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);