@idlizer/core 2.1.9-arktscgen-5 → 2.1.9-arktscgen-8

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 (58) hide show
  1. package/build/lib/src/Language.d.ts +0 -1
  2. package/build/lib/src/Language.js +7 -8
  3. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +4 -15
  4. package/build/lib/src/LanguageWriters/ArgConvertors.js +103 -102
  5. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +8 -30
  6. package/build/lib/src/LanguageWriters/LanguageWriter.js +15 -67
  7. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +2 -2
  8. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +17 -1
  9. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +121 -6
  10. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +6 -0
  11. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +1 -2
  12. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +3 -19
  13. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +0 -5
  14. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +0 -9
  15. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +3 -5
  16. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +9 -22
  17. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +6 -9
  18. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +23 -66
  19. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +1 -7
  20. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +4 -14
  21. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +11 -8
  22. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +116 -27
  23. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +4 -5
  24. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +10 -26
  25. package/build/lib/src/config.d.ts +336 -1
  26. package/build/lib/src/config.js +11 -3
  27. package/build/lib/src/diagnosticmessages.d.ts +45 -0
  28. package/build/lib/src/diagnosticmessages.js +66 -0
  29. package/build/lib/src/diagnostictypes.d.ts +140 -0
  30. package/build/lib/src/diagnostictypes.js +72 -0
  31. package/build/lib/src/formatter.d.ts +3 -0
  32. package/build/lib/src/formatter.js +98 -0
  33. package/build/lib/src/from-idl/deserialize.d.ts +1 -0
  34. package/build/lib/src/from-idl/deserialize.js +107 -5
  35. package/build/lib/src/idl.d.ts +7 -0
  36. package/build/lib/src/idl.js +15 -3
  37. package/build/lib/src/index.d.ts +7 -1
  38. package/build/lib/src/index.js +7 -1
  39. package/build/lib/src/peer-generation/Materialized.d.ts +4 -20
  40. package/build/lib/src/peer-generation/Materialized.js +9 -62
  41. package/build/lib/src/peer-generation/PeerClass.d.ts +0 -2
  42. package/build/lib/src/peer-generation/PeerClass.js +4 -6
  43. package/build/lib/src/peer-generation/PeerLibrary.js +1 -5
  44. package/build/lib/src/peer-generation/PeerMethod.d.ts +25 -27
  45. package/build/lib/src/peer-generation/PeerMethod.js +83 -93
  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 +4 -0
  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 +4 -2
  57. package/build/lib/src/util.js +21 -12
  58. package/package.json +2 -2
@@ -1,7 +1,6 @@
1
1
  export declare class Language {
2
2
  name: string;
3
3
  extension: string;
4
- needsUnionDiscrimination: boolean;
5
4
  static TS: Language;
6
5
  static ARKTS: Language;
7
6
  static JAVA: Language;
@@ -13,10 +13,9 @@
13
13
  * limitations under the License.
14
14
  */
15
15
  export class Language {
16
- constructor(name, extension, needsUnionDiscrimination) {
16
+ constructor(name, extension) {
17
17
  this.name = name;
18
18
  this.extension = extension;
19
- this.needsUnionDiscrimination = needsUnionDiscrimination;
20
19
  }
21
20
  toString() {
22
21
  return this.name;
@@ -36,10 +35,10 @@ export class Language {
36
35
  }
37
36
  }
38
37
  }
39
- Language.TS = new Language("TS", ".ts", true);
40
- Language.ARKTS = new Language("ArkTS", ".ts", true); // using .ts for ArkTS until we get rit of tsc preprocessing
41
- Language.JAVA = new Language("Java", ".java", false);
42
- Language.CPP = new Language("C++", ".cc", false);
43
- Language.CJ = new Language("CangJie", ".cj", false);
44
- Language.KOTLIN = new Language("Kotlin", ".kt", false);
38
+ Language.TS = new Language("TS", ".ts");
39
+ Language.ARKTS = new Language("ArkTS", ".ts"); // using .ts for ArkTS until we get rit of tsc preprocessing
40
+ Language.JAVA = new Language("Java", ".java");
41
+ Language.CPP = new Language("C++", ".cc");
42
+ Language.CJ = new Language("CangJie", ".cj");
43
+ Language.KOTLIN = new Language("Kotlin", ".kt");
45
44
  //# sourceMappingURL=Language.js.map
@@ -5,6 +5,7 @@ import { NativeModuleType, RuntimeType } from "./common";
5
5
  import { LibraryInterface } from "../LibraryInterface";
6
6
  import { ReferenceResolver } from "../peer-generation/ReferenceResolver";
7
7
  import { PeerLibrary } from "../peer-generation/PeerLibrary";
8
+ import { PeerMethodSignature } from "../peer-generation/PeerMethod";
8
9
  export declare function getSerializerName(declaration: idl.IDLEntry): string;
9
10
  export interface ArgConvertor {
10
11
  param: string;
@@ -26,7 +27,7 @@ export interface ArgConvertor {
26
27
  getObjectAccessor(languge: Language, value: string, args?: Record<string, string>, writer?: LanguageWriter): string;
27
28
  }
28
29
  export declare function isDirectConvertedType(originalType: idl.IDLType | undefined, library: PeerLibrary): boolean;
29
- export declare function isVMContextMethod(method: Method): boolean;
30
+ export declare function isVMContextMethod(method: Method | PeerMethodSignature): boolean;
30
31
  export declare function isDirectMethod(method: Method, library: PeerLibrary): boolean;
31
32
  export declare abstract class BaseArgConvertor implements ArgConvertor {
32
33
  idlType: idl.IDLType;
@@ -46,7 +47,7 @@ export declare abstract class BaseArgConvertor implements ArgConvertor {
46
47
  unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
47
48
  getMembers(): string[];
48
49
  getObjectAccessor(language: Language, value: string, args?: Record<string, string>, writer?: LanguageWriter): string;
49
- protected discriminatorFromFields<T>(value: string, writer: LanguageWriter, uniqueFields: T[] | undefined, nameAccessor: (field: T) => string, optionalAccessor: (field: T) => boolean, duplicates: Set<string>): LanguageExpression | undefined;
50
+ protected discriminatorFromFields<T>(value: string, writer: LanguageWriter, uniqueFields: T[] | undefined, nameAccessor: (field: T) => string, optionalAccessor: (field: T) => boolean): LanguageExpression | undefined;
50
51
  }
51
52
  export declare class BooleanConvertor extends BaseArgConvertor {
52
53
  constructor(param: string);
@@ -313,18 +314,6 @@ export declare class MaterializedClassConvertor extends BaseArgConvertor {
313
314
  isPointerType(): boolean;
314
315
  unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
315
316
  }
316
- export declare class ExternalTypeConvertor extends BaseArgConvertor {
317
- private library;
318
- declaration: idl.IDLInterface;
319
- constructor(library: PeerLibrary, param: string, declaration: idl.IDLInterface);
320
- convertorArg(param: string, writer: LanguageWriter): string;
321
- convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
322
- convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
323
- nativeType(): idl.IDLType;
324
- interopType(): idl.IDLType;
325
- isPointerType(): boolean;
326
- unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
327
- }
328
317
  export declare class ImportTypeConvertor extends BaseArgConvertor {
329
318
  protected importedName: string;
330
319
  constructor(param: string, importedName: string);
@@ -347,7 +336,6 @@ export declare class CallbackConvertor extends BaseArgConvertor {
347
336
  convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter, useSyncVersion?: boolean): LanguageStatement;
348
337
  nativeType(): idl.IDLType;
349
338
  isPointerType(): boolean;
350
- unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
351
339
  }
352
340
  export declare const CallbackKind = "CallbackKind";
353
341
  export declare function generateCallbackKindName(callback: idl.IDLCallback): string;
@@ -355,4 +343,5 @@ export declare function generateCallbackKindAccess(callback: idl.IDLCallback, la
355
343
  export declare function generateCallbackKindValue(callback: idl.IDLCallback): number;
356
344
  export declare function generateCallbackAPIArguments(library: LibraryInterface, callback: idl.IDLCallback): string[];
357
345
  export declare function maybeTransformManagedCallback(callback: idl.IDLCallback, library: ReferenceResolver): idl.IDLCallback | undefined;
346
+ export declare function createOutArgConvertor(library: PeerLibrary, type: idl.IDLType | undefined, otherParams: string[]): ArgConvertor | undefined;
358
347
  //# sourceMappingURL=ArgConvertors.d.ts.map
@@ -17,13 +17,15 @@ 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 { 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";
24
24
  import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
25
25
  import { qualifiedName } from "../peer-generation/idl/common";
26
26
  import { LayoutNodeRole } from "../peer-generation/LayoutManager";
27
+ import { PeerMethodSignature } from "../peer-generation/PeerMethod";
28
+ import { isInExternalModule } from "../peer-generation/modules";
27
29
  export function getSerializerName(declaration) {
28
30
  return `${idl.getQualifiedName(declaration, "namespace.name").split('.').join('_')}_serializer`;
29
31
  }
@@ -76,7 +78,8 @@ export function isDirectConvertedType(originalType, library) {
76
78
  }
77
79
  export function isVMContextMethod(method) {
78
80
  var _a, _b;
79
- return !!idl.asPromise(method.signature.returnType) ||
81
+ const isPromise = !!idl.asPromise(method instanceof PeerMethodSignature ? method.returnType : method.signature.returnType);
82
+ return isPromise ||
80
83
  !!((_a = method.modifiers) === null || _a === void 0 ? void 0 : _a.includes(MethodModifier.THROWS)) ||
81
84
  !!((_b = method.modifiers) === null || _b === void 0 ? void 0 : _b.includes(MethodModifier.FORCE_CONTEXT)) ||
82
85
  generatorConfiguration().forceContext.includes(method.name);
@@ -120,13 +123,12 @@ export class BaseArgConvertor {
120
123
  return writer.getObjectAccessor(this, value, args);
121
124
  return this.useArray && (args === null || args === void 0 ? void 0 : args.index) ? `${value}[${args.index}]` : value;
122
125
  }
123
- discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor, duplicates) {
126
+ discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor) {
124
127
  if (!uniqueFields || uniqueFields.length === 0)
125
128
  return undefined;
126
129
  const firstNonOptional = uniqueFields.find(it => !optionalAccessor(it));
127
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [
128
- writer.makeDiscriminatorFromFields(this, value, firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it)), duplicates)
129
- ]);
130
+ const accessors = firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it));
131
+ return writer.makeNaryOp("||", accessors.map(it => writer.makeHasOwnProperty(value + "!", it)));
130
132
  }
131
133
  }
132
134
  export class BooleanConvertor extends BaseArgConvertor {
@@ -249,7 +251,21 @@ export class EnumConvertor extends BaseArgConvertor {
249
251
  return writer.getNodeName(this.idlType); // this.enumTypeName(writer.language)
250
252
  }
251
253
  unionDiscriminator(value, index, writer, duplicates) {
252
- return writer.makeDiscriminatorConvertor(this, value, index);
254
+ const convertorNativeType = this.nativeType();
255
+ const decl = writer.resolver.resolveTypeReference(idl.isReferenceType(convertorNativeType)
256
+ ? convertorNativeType
257
+ : idl.createReferenceType(this.targetType(writer)));
258
+ if (decl === undefined || !idl.isEnum(decl)) {
259
+ throwException(`The type reference ${decl === null || decl === void 0 ? void 0 : decl.name} must be Enum`);
260
+ }
261
+ const ordinal = idl.isStringEnum(decl)
262
+ ? writer.i32FromEnum(writer.makeCast(writer.makeString(writer.getObjectAccessor(this, value)), this.idlType), decl)
263
+ : writer.makeUnionVariantCast(writer.getObjectAccessor(this, value), writer.getNodeName(idl.IDLI32Type), this, index);
264
+ const { low, high } = idl.extremumOfOrdinals(decl);
265
+ return writer.makeNaryOp("&&", [
266
+ writer.makeNaryOp(">=", [ordinal, writer.makeString(low.toString())]),
267
+ writer.makeNaryOp("<=", [ordinal, writer.makeString(high.toString())])
268
+ ]);
253
269
  }
254
270
  }
255
271
  export class NumberConvertor extends BaseArgConvertor {
@@ -417,7 +433,7 @@ export class BufferConvertor extends BaseArgConvertor {
417
433
  return true;
418
434
  }
419
435
  unionDiscriminator(value, index, writer, duplicates) {
420
- return writer.instanceOf(this, value);
436
+ return writer.instanceOf(value, this.idlType);
421
437
  }
422
438
  }
423
439
  export class AggregateConvertor extends BaseArgConvertor {
@@ -478,6 +494,12 @@ export class AggregateConvertor extends BaseArgConvertor {
478
494
  const resultExpression = writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(", ")})`);
479
495
  statements.push(assigneer(resultExpression));
480
496
  }
497
+ else if (writer.language == Language.KOTLIN) {
498
+ const resultExpression = this.decl.subkind === idl.IDLInterfaceSubkind.Tuple ?
499
+ writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(', ')})`) :
500
+ writer.makeString(`object: ${writer.getNodeName(this.idlType)} { ${this.decl.properties.map(prop => `override var ${prop.name} = ${bufferName}_${prop.name}`).join("; ")} }`);
501
+ statements.push(assigneer(resultExpression));
502
+ }
481
503
  else {
482
504
  const resultExpression = this.makeAssigneeExpression(this.decl.properties.map(prop => {
483
505
  return [prop.name, writer.makeString(`${bufferName}_${prop.name}`)];
@@ -504,7 +526,7 @@ export class AggregateConvertor extends BaseArgConvertor {
504
526
  }
505
527
  unionDiscriminator(value, index, writer, duplicates) {
506
528
  const uniqueFields = this.members.filter(it => !duplicates.has(it[0]));
507
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1], duplicates);
529
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1]);
508
530
  }
509
531
  }
510
532
  export class TupleConvertor extends AggregateConvertor {
@@ -578,7 +600,7 @@ export class InterfaceConvertor extends BaseArgConvertor {
578
600
  var _a;
579
601
  // Try to figure out interface by examining field sets
580
602
  const uniqueFields = (_a = this.declaration) === null || _a === void 0 ? void 0 : _a.properties.filter(it => !duplicates.has(it.name));
581
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
603
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
582
604
  }
583
605
  }
584
606
  export class ClassConvertor extends InterfaceConvertor {
@@ -586,7 +608,7 @@ export class ClassConvertor extends InterfaceConvertor {
586
608
  super(library, name, param, declaration);
587
609
  }
588
610
  unionDiscriminator(value, index, writer, duplicateMembers) {
589
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicateMembers)]);
611
+ return writer.instanceOf(value, this.idlType);
590
612
  }
591
613
  }
592
614
  export class ArrayConvertor extends BaseArgConvertor {
@@ -603,7 +625,7 @@ export class ArrayConvertor extends BaseArgConvertor {
603
625
  convertorSerialize(param, value, printer) {
604
626
  // Array length.
605
627
  const valueLength = printer.makeArrayLength(value).asString();
606
- const loopCounter = "i";
628
+ const loopCounter = `${value}_counter_i`;
607
629
  printer.writeMethodCall(`${param}Serializer`, "writeInt32", [printer.castToInt(valueLength, 32)]);
608
630
  printer.writeStatement(printer.makeLoop(loopCounter, valueLength));
609
631
  printer.pushIndent();
@@ -636,7 +658,7 @@ export class ArrayConvertor extends BaseArgConvertor {
636
658
  return true;
637
659
  }
638
660
  unionDiscriminator(value, index, writer, duplicates) {
639
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
661
+ return writer.instanceOf(value, this.idlType);
640
662
  }
641
663
  getObjectAccessor(language, value, args) {
642
664
  const array = language === Language.CPP ? ".array" : "";
@@ -700,7 +722,7 @@ export class MapConvertor extends BaseArgConvertor {
700
722
  return true;
701
723
  }
702
724
  unionDiscriminator(value, index, writer, duplicates) {
703
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.makeString(`${value} instanceof Map`)]);
725
+ return writer.makeString(`${value} instanceof Map`);
704
726
  }
705
727
  getObjectAccessor(language, value, args) {
706
728
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) && (args === null || args === void 0 ? void 0 : args.field)
@@ -710,7 +732,7 @@ export class MapConvertor extends BaseArgConvertor {
710
732
  }
711
733
  export class DateConvertor extends BaseArgConvertor {
712
734
  constructor(param) {
713
- super(idl.IDLBigintType, [RuntimeType.NUMBER], false, false, param);
735
+ super(idl.IDLDate, [RuntimeType.NUMBER], false, false, param);
714
736
  }
715
737
  convertorArg(param, writer) {
716
738
  if (writer.language === Language.CPP) {
@@ -841,30 +863,18 @@ export class OptionConvertor extends BaseArgConvertor {
841
863
  throw new Error("Must never be used");
842
864
  }
843
865
  convertorSerialize(param, value, printer) {
844
- const valueType = `${value}_type`.replaceAll('.', '_');
845
- const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
846
- printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
847
- if (printer.language != Language.CJ && printer.language != Language.KOTLIN) {
848
- printer.runtimeType(this, valueType, value);
849
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
850
- }
851
- printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
866
+ printer.print(`if (${printer.makeDefinedCheck(value).asString()}) {`);
852
867
  printer.pushIndent();
853
- if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
854
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
855
- }
868
+ printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.OBJECT).asString()]);
856
869
  const valueValue = `${value}_value`.replaceAll('.', '_');
857
870
  printer.writeStatement(printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true));
858
871
  this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
859
872
  printer.popIndent();
860
- printer.print(`}`);
861
- if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
862
- printer.print('else {');
863
- printer.pushIndent();
864
- printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
865
- printer.popIndent();
866
- printer.print('}');
867
- }
873
+ printer.print('} else {');
874
+ printer.pushIndent();
875
+ printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.UNDEFINED).asString()]);
876
+ printer.popIndent();
877
+ printer.print('}');
868
878
  }
869
879
  convertorCArg(param) {
870
880
  throw new Error("Must never be used");
@@ -914,13 +924,10 @@ export class UnionConvertor extends BaseArgConvertor {
914
924
  throw new Error("Do not use for union");
915
925
  }
916
926
  convertorSerialize(param, value, printer) {
917
- var _a;
918
- printer.writeStatement(printer.makeAssign(`${value}_type`, idl.IDLI32Type, printer.makeUnionTypeDefaultInitializer(), true, false));
919
- printer.writeStatement(printer.makeUnionSelector(value, `${value}_type`));
920
927
  this.memberConvertors.forEach((it, index) => {
921
928
  const maybeElse = (index > 0 && this.memberConvertors[index - 1].runtimeTypes.length > 0) ? "else " : "";
922
- const conditions = this.unionChecker.makeDiscriminator(value, index, printer);
923
- printer.print(`${maybeElse}if (${conditions.asString()}) {`);
929
+ const discriminator = this.unionChecker.makeDiscriminator(value, index, printer).asString();
930
+ printer.print(`${maybeElse}if (${discriminator}) {`);
924
931
  printer.pushIndent();
925
932
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(index.toString(), 8)]);
926
933
  if (!(it instanceof UndefinedConvertor)) {
@@ -930,7 +937,6 @@ export class UnionConvertor extends BaseArgConvertor {
930
937
  printer.popIndent();
931
938
  printer.print(`}`);
932
939
  });
933
- this.unionChecker.reportConflicts((_a = this.library.getCurrentContext()) !== null && _a !== void 0 ? _a : "<unknown context>", printer);
934
940
  }
935
941
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
936
942
  const statements = [];
@@ -948,7 +954,7 @@ export class UnionConvertor extends BaseArgConvertor {
948
954
  const stmt = new BlockStatement([
949
955
  writer.makeSetUnionSelector(bufferName, `${index}`),
950
956
  it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
951
- if (writer.language == Language.CJ) {
957
+ if (writer.language == Language.CJ || writer.language == Language.KOTLIN) {
952
958
  return writer.makeAssign(receiver, undefined, writer.makeFunctionCall(writer.getNodeName(this.type), [expr]), false);
953
959
  }
954
960
  else {
@@ -975,8 +981,7 @@ export class UnionConvertor extends BaseArgConvertor {
975
981
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) ? `${value}.value${args.index}` : value;
976
982
  }
977
983
  unionDiscriminator(value, index, writer, duplicates) {
978
- const checker = new UnionRuntimeTypeChecker(this.memberConvertors);
979
- return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => checker.makeDiscriminator(value, n, writer)));
984
+ return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => this.unionChecker.makeDiscriminator(value, n, writer)));
980
985
  }
981
986
  }
982
987
  export class FunctionConvertor extends BaseArgConvertor {
@@ -1015,9 +1020,14 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1015
1020
  case Language.CPP:
1016
1021
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1017
1022
  case Language.JAVA:
1023
+ case Language.KOTLIN:
1018
1024
  case Language.CJ:
1019
1025
  return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1020
1026
  default:
1027
+ if (isInExternalModule(this.declaration)) {
1028
+ const extractor = getExtractor(this.declaration, writer.language, true);
1029
+ return `${extractor.receiver}.${extractor.method}(${param})`;
1030
+ }
1021
1031
  return `toPeerPtr(${param})`;
1022
1032
  }
1023
1033
  }
@@ -1044,62 +1054,11 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1044
1054
  unionDiscriminator(value, index, writer, duplicates) {
1045
1055
  if (idl.isInterface(this.declaration)) {
1046
1056
  if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
1047
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
1057
+ return writer.instanceOf(value, this.idlType);
1048
1058
  }
1049
1059
  if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1050
1060
  const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
1051
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
1052
- }
1053
- }
1054
- }
1055
- }
1056
- export class ExternalTypeConvertor extends BaseArgConvertor {
1057
- constructor(library, param, declaration) {
1058
- super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
1059
- this.library = library;
1060
- this.declaration = declaration;
1061
- console.log(`ExternalType convertor for type: ${declaration.name}`);
1062
- }
1063
- convertorArg(param, writer) {
1064
- const lang = writer.language;
1065
- switch (lang) {
1066
- case Language.CPP:
1067
- return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1068
- default:
1069
- return `extractors.${getExtractorName(this.declaration, lang, true)}(${param})`;
1070
- }
1071
- }
1072
- convertorSerialize(param, value, printer) {
1073
- const accessor = getSerializerName(this.declaration);
1074
- printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1075
- printer.writeStatement(printer.makeStatement(printer.makeStaticMethodCall(accessor, 'write', [
1076
- printer.makeString(`${param}Serializer`),
1077
- printer.makeString(value)
1078
- ])));
1079
- }
1080
- convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1081
- const accessor = getSerializerName(this.declaration);
1082
- writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1083
- const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]), this.declaration);
1084
- return assigneer(readStatement);
1085
- }
1086
- nativeType() {
1087
- return idl.createReferenceType(this.declaration);
1088
- }
1089
- interopType() {
1090
- return idl.IDLPointerType;
1091
- }
1092
- isPointerType() {
1093
- return false;
1094
- }
1095
- unionDiscriminator(value, index, writer, duplicates) {
1096
- if (idl.isInterface(this.declaration)) {
1097
- if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
1098
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
1099
- }
1100
- if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1101
- const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
1102
- return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
1061
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
1103
1062
  }
1104
1063
  }
1105
1064
  }
@@ -1194,7 +1153,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1194
1153
  continuation = [
1195
1154
  writer.language == Language.CJ ?
1196
1155
  writer.makeAssign(continuationValueName, undefined, writer.makeString(`${writer.getNodeName(this.decl.returnType).replace(/[\<\>]/g, '')}Holder(None<${writer.getNodeName(this.decl.returnType)}>)`), true, true) :
1197
- writer.makeAssign(continuationValueName, optionalReturnType, undefined, true, false),
1156
+ writer.makeAssign(continuationValueName, optionalReturnType, writer.language == Language.KOTLIN ? writer.makeNull() : undefined, true, false),
1198
1157
  writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
1199
1158
  writer.language == Language.CJ ?
1200
1159
  writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
@@ -1229,7 +1188,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1229
1188
  writer.makeString(`${argsSerializer}Serializer.length()`),
1230
1189
  ])),
1231
1190
  new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
1232
- writer.makeReturn(hasContinuation
1191
+ writer.makeLambdaReturn(hasContinuation
1233
1192
  ? writer.makeCast(writer.language == Language.CJ ?
1234
1193
  writer.makeString(`${continuationValueName}.value`) :
1235
1194
  writer.makeString(continuationValueName), this.decl.returnType)
@@ -1246,10 +1205,6 @@ export class CallbackConvertor extends BaseArgConvertor {
1246
1205
  isPointerType() {
1247
1206
  return true;
1248
1207
  }
1249
- unionDiscriminator(value, index, writer, duplicates) {
1250
- // We serialize callbacks as table offsets, so don't need to discriminate them. Runtime type check is enough
1251
- return writer.makeUnionVariantCondition(this, value, `${value}_type`, RuntimeType[RuntimeType.FUNCTION]);
1252
- }
1253
1208
  }
1254
1209
  ////////////////////////////////////////////////////////////////////////////////
1255
1210
  // UTILS
@@ -1294,4 +1249,50 @@ export function maybeTransformManagedCallback(callback, library) {
1294
1249
  return library.resolveTypeReference(idl.createReferenceType("CustomNodeBuilder"));
1295
1250
  return undefined;
1296
1251
  }
1252
+ class PromiseOutArgConvertor extends BaseArgConvertor {
1253
+ constructor(library, param, promise) {
1254
+ super(library.createContinuationCallbackReference(promise), [RuntimeType.FUNCTION], false, true, param);
1255
+ this.library = library;
1256
+ this.promise = promise;
1257
+ this.isOut = true;
1258
+ const type = this.idlType;
1259
+ const callbackEntry = library.resolveTypeReference(type);
1260
+ if (!callbackEntry)
1261
+ throw new Error(`Internal error: no callback for ${type.name} resolved`);
1262
+ this.callback = callbackEntry;
1263
+ this.callbackConvertor = new CallbackConvertor(library, param, this.callback, this.library.interopNativeModule);
1264
+ }
1265
+ convertorArg(param, writer) {
1266
+ return this.callbackConvertor.convertorArg(param, writer);
1267
+ }
1268
+ convertorSerialize(param, value, writer) {
1269
+ if (writer.language == Language.CPP) {
1270
+ this.callbackConvertor.convertorSerialize(param, value, writer);
1271
+ return;
1272
+ }
1273
+ const serializeCallback = idl.isVoidType(this.promise.elementType[0])
1274
+ ? writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromiseVoid`, [])
1275
+ : writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromise<${writer.getNodeName(this.promise.elementType[0])}>`, []);
1276
+ writer.writeStatement(writer.makeAssign(value, undefined, writer.language == Language.CJ ? writer.makeString(serializeCallback.asString().concat('.promise')) : writer.makeTupleAccess(serializeCallback.asString(), 0), true));
1277
+ }
1278
+ convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1279
+ return this.callbackConvertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
1280
+ }
1281
+ nativeType() {
1282
+ return this.idlType;
1283
+ }
1284
+ isPointerType() {
1285
+ return true;
1286
+ }
1287
+ }
1288
+ export function createOutArgConvertor(library, type, otherParams) {
1289
+ if (type && idl.isContainerType(type) && idl.IDLContainerUtils.isPromise(type)) {
1290
+ const param = (entropy) => `outputArgumentForReturningPromise${entropy || ''}`;
1291
+ let paramEntropy = 0;
1292
+ while (otherParams === null || otherParams === void 0 ? void 0 : otherParams.includes(param(paramEntropy)))
1293
+ ++paramEntropy;
1294
+ return new PromiseOutArgConvertor(library, param(paramEntropy), type);
1295
+ }
1296
+ return undefined;
1297
+ }
1297
1298
  //# sourceMappingURL=ArgConvertors.js.map
@@ -59,11 +59,6 @@ export declare class FieldAccessExpression {
59
59
  constructor(receiver: string, field: string, nullable?: boolean);
60
60
  asString(): string;
61
61
  }
62
- export declare class CheckDefinedExpression implements LanguageExpression {
63
- private value;
64
- constructor(value: string);
65
- asString(): string;
66
- }
67
62
  export interface LanguageStatement {
68
63
  write(writer: LanguageWriter): void;
69
64
  }
@@ -113,13 +108,6 @@ export declare class MultiBranchIfStatement implements LanguageStatement {
113
108
  constructor(statements: BranchStatement[], elseStatement: LanguageStatement | undefined);
114
109
  write(writer: LanguageWriter): void;
115
110
  }
116
- export declare class CheckOptionalStatement implements LanguageStatement {
117
- undefinedValue: string;
118
- optionalExpression: LanguageExpression;
119
- doStatement: LanguageStatement;
120
- constructor(undefinedValue: string, optionalExpression: LanguageExpression, doStatement: LanguageStatement);
121
- write(writer: LanguageWriter): void;
122
- }
123
111
  export declare class TsEnumEntityStatement implements LanguageStatement {
124
112
  private readonly enumEntity;
125
113
  private readonly options;
@@ -156,7 +144,8 @@ export declare enum FieldModifier {
156
144
  PROTECTED = 4,
157
145
  FINAL = 5,
158
146
  VOLATILE = 6,
159
- INTERNAL = 7
147
+ INTERNAL = 7,
148
+ OVERRIDE = 8
160
149
  }
161
150
  export declare enum MethodModifier {
162
151
  PUBLIC = 0,
@@ -274,14 +263,13 @@ export declare abstract class LanguageWriter {
274
263
  }, setter?: {
275
264
  method: Method;
276
265
  op: () => void;
277
- }): void;
266
+ }, initExpr?: LanguageExpression): void;
278
267
  abstract writeTypeDeclaration(decl: idl.IDLTypedef): void;
279
268
  abstract writeConstant(constName: string, constType: idl.IDLType, constVal?: string): void;
280
269
  abstract makeAssign(variableName: string, type: idl.IDLType | undefined, expr: LanguageExpression | undefined, isDeclared: boolean, isConst?: boolean, options?: MakeAssignOptions): LanguageStatement;
281
270
  abstract makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
282
271
  abstract makeThrowError(message: string): LanguageStatement;
283
272
  abstract makeReturn(expr?: LanguageExpression): LanguageStatement;
284
- abstract makeCheckOptional(optional: LanguageExpression, doStatement: LanguageStatement): LanguageStatement;
285
273
  abstract makeRuntimeType(rt: RuntimeType): LanguageExpression;
286
274
  abstract getObjectAccessor(convertor: ArgConvertor, value: string, args?: ObjectArgs): string;
287
275
  abstract makeCast(value: LanguageExpression, node: idl.IDLNode, options?: MakeCastOptions): LanguageExpression;
@@ -324,6 +312,7 @@ export declare abstract class LanguageWriter {
324
312
  makeThis(): LanguageExpression;
325
313
  makeNull(value?: string): LanguageExpression;
326
314
  makeVoid(): LanguageExpression;
315
+ makeLambdaReturn(expr?: LanguageExpression): LanguageStatement;
327
316
  makeRuntimeTypeCondition(typeVarName: string, equals: boolean, type: RuntimeType, varName?: string): LanguageExpression;
328
317
  makeValueFromOption(value: string, destinationConvertor: ArgConvertor): LanguageExpression;
329
318
  makeNewObject(objectName: string, params?: LanguageExpression[]): LanguageExpression;
@@ -335,7 +324,7 @@ export declare abstract class LanguageWriter {
335
324
  makeNativeCall(nativeModule: NativeModuleType, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
336
325
  makeBlock(statements: LanguageStatement[], inScope?: boolean): BlockStatement;
337
326
  nativeReceiver(nativeModule: NativeModuleType): string;
338
- makeDefinedCheck(value: string): LanguageExpression;
327
+ abstract makeDefinedCheck(value: string, isTag?: boolean): LanguageExpression;
339
328
  makeRuntimeTypeDefinedCheck(runtimeType: string): LanguageExpression;
340
329
  makeCondition(condition: LanguageExpression, thenStatement: LanguageStatement, elseStatement?: LanguageStatement, insideIfOp?: () => void, insideElseOp?: () => void): LanguageStatement;
341
330
  makeMultiBranchCondition(conditions: BranchStatement[], elseStatement?: LanguageStatement): LanguageStatement;
@@ -344,7 +333,6 @@ export declare abstract class LanguageWriter {
344
333
  makeArrayAccess(value: string, indexVar: string): LanguageExpression;
345
334
  makeTupleAccess(value: string, index: number): LanguageExpression;
346
335
  makeUnionSelector(value: string, valueType: string): LanguageStatement;
347
- makeUnionVariantCondition(_convertor: ArgConvertor, _valueName: string, valueType: string, type: string, _convertorIndex?: number, _runtimeTypeIndex?: number): LanguageExpression;
348
336
  makeUnionVariantCast(value: string, type: string, convertor: ArgConvertor, index?: number): LanguageExpression;
349
337
  makeUnionTypeDefaultInitializer(): LanguageExpression;
350
338
  makeArrayResize(array: string, arrayType: string, length: string, deserializer: string): LanguageStatement;
@@ -357,15 +345,11 @@ export declare abstract class LanguageWriter {
357
345
  makeNaryOp(op: string, args: LanguageExpression[]): LanguageExpression;
358
346
  makeStatement(expr: LanguageExpression): LanguageStatement;
359
347
  writeNativeMethodDeclaration(method: Method): void;
360
- writeUnsafeNativeMethodDeclaration(name: string, signature: MethodSignature): void;
361
348
  pushIndent(): void;
362
349
  popIndent(): void;
363
350
  print(string: stringOrNone): void;
364
351
  getOutput(): string[];
365
352
  makeSignature(returnType: idl.IDLType, parameters: idl.IDLParameter[]): MethodSignature;
366
- makeNamedSignature(returnType: idl.IDLType, parameters: idl.IDLParameter[]): NamedMethodSignature;
367
- makeNativeMethodNamedSignature(returnType: idl.IDLType, parameters: idl.IDLParameter[]): NamedMethodSignature;
368
- makeSerializerConstructorSignatures(): NamedMethodSignature[] | undefined;
369
353
  mapFieldModifier(modifier: FieldModifier): string;
370
354
  mapMethodModifier(modifier: MethodModifier): string;
371
355
  /**
@@ -374,10 +358,6 @@ export declare abstract class LanguageWriter {
374
358
  makeUnsafeCast(param: string): string;
375
359
  makeUnsafeCast_(value: LanguageExpression, type: idl.IDLType, typeOptions?: PrintHint): string;
376
360
  runtimeType(param: ArgConvertor, valueType: string, value: string): void;
377
- makeDiscriminatorFromFields(convertor: {
378
- targetType: (writer: LanguageWriter) => string;
379
- }, value: string, accessors: string[], duplicates: Set<string>): LanguageExpression;
380
- makeIsTypeCall(value: string, decl: idl.IDLInterface): LanguageExpression;
381
361
  makeEnumEntity(enumEntity: idl.IDLEnum, options: {
382
362
  isExport: boolean;
383
363
  isDeclare?: boolean;
@@ -385,9 +365,8 @@ export declare abstract class LanguageWriter {
385
365
  makeFieldModifiersList(modifiers: FieldModifier[] | undefined, customFieldFilter?: (field: FieldModifier) => boolean): string;
386
366
  escapeKeyword(keyword: string): string;
387
367
  makeCastCustomObject(customName: string, _isGenericType: boolean): LanguageExpression;
388
- makeHasOwnProperty(value: string, _valueTypeName: string, property: string, propertyTypeName?: string): LanguageExpression;
389
- discriminatorFromExpressions(value: string, runtimeType: RuntimeType, exprs: LanguageExpression[]): LanguageExpression;
390
- makeDiscriminatorConvertor(_convertor: ArgConvertor, _value: string, _index: number): LanguageExpression | undefined;
368
+ makeHasOwnProperty(value: string, property: string, propertyTypeName?: string): LanguageExpression;
369
+ discriminate(value: string, index: number, type: idl.IDLType, runtimeTypes: RuntimeType[]): string;
391
370
  makeNot(expr: LanguageExpression): LanguageExpression;
392
371
  makeSerializedBufferGetter(serializer: string): LanguageExpression;
393
372
  makeEquals(args: LanguageExpression[]): LanguageExpression;
@@ -395,9 +374,8 @@ export declare abstract class LanguageWriter {
395
374
  castToBoolean(value: string): string;
396
375
  makeCallIsObject(value: string): LanguageExpression;
397
376
  makeStaticBlock(op: (writer: LanguageWriter) => void): void;
398
- instanceOf(convertor: ArgConvertor, value: string, _duplicateMembers?: Set<string>): LanguageExpression;
377
+ instanceOf(value: string, type: idl.IDLType): LanguageExpression;
399
378
  typeInstanceOf(type: idl.IDLEntry, value: string, members?: string[]): LanguageExpression;
400
- stringifyTypeOrEmpty(type: idl.IDLType | undefined): string;
401
379
  /**
402
380
  * Writes `namespace <namespace> {` and adds extra indent
403
381
  * @param namespace Namespace to begin