@idlizer/core 2.1.9-arktscgen-6 → 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 +1 -14
  4. package/build/lib/src/LanguageWriters/ArgConvertors.js +54 -101
  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/KotlinConvertor.d.ts +24 -0
  9. package/build/lib/src/LanguageWriters/convertors/KotlinConvertor.js +69 -0
  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 +1 -2
  14. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +3 -19
  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 +3 -5
  18. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +9 -22
  19. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +6 -9
  20. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +23 -66
  21. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +1 -7
  22. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +4 -14
  23. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +11 -8
  24. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +116 -27
  25. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +4 -5
  26. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +10 -26
  27. package/build/lib/src/config.d.ts +336 -1
  28. package/build/lib/src/config.js +11 -3
  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 +7 -0
  38. package/build/lib/src/idl.js +15 -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 +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
@@ -47,7 +47,7 @@ export declare abstract class BaseArgConvertor implements ArgConvertor {
47
47
  unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
48
48
  getMembers(): string[];
49
49
  getObjectAccessor(language: Language, value: string, args?: Record<string, string>, writer?: LanguageWriter): string;
50
- 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;
51
51
  }
52
52
  export declare class BooleanConvertor extends BaseArgConvertor {
53
53
  constructor(param: string);
@@ -314,18 +314,6 @@ export declare class MaterializedClassConvertor extends BaseArgConvertor {
314
314
  isPointerType(): boolean;
315
315
  unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
316
316
  }
317
- export declare class ExternalTypeConvertor extends BaseArgConvertor {
318
- private library;
319
- declaration: idl.IDLInterface;
320
- constructor(library: PeerLibrary, param: string, declaration: idl.IDLInterface);
321
- convertorArg(param: string, writer: LanguageWriter): string;
322
- convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
323
- convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
324
- nativeType(): idl.IDLType;
325
- interopType(): idl.IDLType;
326
- isPointerType(): boolean;
327
- unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
328
- }
329
317
  export declare class ImportTypeConvertor extends BaseArgConvertor {
330
318
  protected importedName: string;
331
319
  constructor(param: string, importedName: string);
@@ -348,7 +336,6 @@ export declare class CallbackConvertor extends BaseArgConvertor {
348
336
  convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter, useSyncVersion?: boolean): LanguageStatement;
349
337
  nativeType(): idl.IDLType;
350
338
  isPointerType(): boolean;
351
- unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
352
339
  }
353
340
  export declare const CallbackKind = "CallbackKind";
354
341
  export declare function generateCallbackKindName(callback: idl.IDLCallback): string;
@@ -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 { 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 {
@@ -251,7 +251,21 @@ export class EnumConvertor extends BaseArgConvertor {
251
251
  return writer.getNodeName(this.idlType); // this.enumTypeName(writer.language)
252
252
  }
253
253
  unionDiscriminator(value, index, writer, duplicates) {
254
- 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
+ ]);
255
269
  }
256
270
  }
257
271
  export class NumberConvertor extends BaseArgConvertor {
@@ -419,7 +433,7 @@ export class BufferConvertor extends BaseArgConvertor {
419
433
  return true;
420
434
  }
421
435
  unionDiscriminator(value, index, writer, duplicates) {
422
- return writer.instanceOf(this, value);
436
+ return writer.instanceOf(value, this.idlType);
423
437
  }
424
438
  }
425
439
  export class AggregateConvertor extends BaseArgConvertor {
@@ -480,6 +494,12 @@ export class AggregateConvertor extends BaseArgConvertor {
480
494
  const resultExpression = writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(", ")})`);
481
495
  statements.push(assigneer(resultExpression));
482
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
+ }
483
503
  else {
484
504
  const resultExpression = this.makeAssigneeExpression(this.decl.properties.map(prop => {
485
505
  return [prop.name, writer.makeString(`${bufferName}_${prop.name}`)];
@@ -506,7 +526,7 @@ export class AggregateConvertor extends BaseArgConvertor {
506
526
  }
507
527
  unionDiscriminator(value, index, writer, duplicates) {
508
528
  const uniqueFields = this.members.filter(it => !duplicates.has(it[0]));
509
- 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]);
510
530
  }
511
531
  }
512
532
  export class TupleConvertor extends AggregateConvertor {
@@ -580,7 +600,7 @@ export class InterfaceConvertor extends BaseArgConvertor {
580
600
  var _a;
581
601
  // Try to figure out interface by examining field sets
582
602
  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);
603
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
584
604
  }
585
605
  }
586
606
  export class ClassConvertor extends InterfaceConvertor {
@@ -588,7 +608,7 @@ export class ClassConvertor extends InterfaceConvertor {
588
608
  super(library, name, param, declaration);
589
609
  }
590
610
  unionDiscriminator(value, index, writer, duplicateMembers) {
591
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicateMembers)]);
611
+ return writer.instanceOf(value, this.idlType);
592
612
  }
593
613
  }
594
614
  export class ArrayConvertor extends BaseArgConvertor {
@@ -605,7 +625,7 @@ export class ArrayConvertor extends BaseArgConvertor {
605
625
  convertorSerialize(param, value, printer) {
606
626
  // Array length.
607
627
  const valueLength = printer.makeArrayLength(value).asString();
608
- const loopCounter = "i";
628
+ const loopCounter = `${value}_counter_i`;
609
629
  printer.writeMethodCall(`${param}Serializer`, "writeInt32", [printer.castToInt(valueLength, 32)]);
610
630
  printer.writeStatement(printer.makeLoop(loopCounter, valueLength));
611
631
  printer.pushIndent();
@@ -638,7 +658,7 @@ export class ArrayConvertor extends BaseArgConvertor {
638
658
  return true;
639
659
  }
640
660
  unionDiscriminator(value, index, writer, duplicates) {
641
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
661
+ return writer.instanceOf(value, this.idlType);
642
662
  }
643
663
  getObjectAccessor(language, value, args) {
644
664
  const array = language === Language.CPP ? ".array" : "";
@@ -702,7 +722,7 @@ export class MapConvertor extends BaseArgConvertor {
702
722
  return true;
703
723
  }
704
724
  unionDiscriminator(value, index, writer, duplicates) {
705
- return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.makeString(`${value} instanceof Map`)]);
725
+ return writer.makeString(`${value} instanceof Map`);
706
726
  }
707
727
  getObjectAccessor(language, value, args) {
708
728
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) && (args === null || args === void 0 ? void 0 : args.field)
@@ -712,7 +732,7 @@ export class MapConvertor extends BaseArgConvertor {
712
732
  }
713
733
  export class DateConvertor extends BaseArgConvertor {
714
734
  constructor(param) {
715
- super(idl.IDLBigintType, [RuntimeType.NUMBER], false, false, param);
735
+ super(idl.IDLDate, [RuntimeType.NUMBER], false, false, param);
716
736
  }
717
737
  convertorArg(param, writer) {
718
738
  if (writer.language === Language.CPP) {
@@ -843,30 +863,18 @@ export class OptionConvertor extends BaseArgConvertor {
843
863
  throw new Error("Must never be used");
844
864
  }
845
865
  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()}) {`);
866
+ printer.print(`if (${printer.makeDefinedCheck(value).asString()}) {`);
854
867
  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
- }
868
+ printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.OBJECT).asString()]);
858
869
  const valueValue = `${value}_value`.replaceAll('.', '_');
859
870
  printer.writeStatement(printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true));
860
871
  this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
861
872
  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
- }
873
+ printer.print('} else {');
874
+ printer.pushIndent();
875
+ printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.UNDEFINED).asString()]);
876
+ printer.popIndent();
877
+ printer.print('}');
870
878
  }
871
879
  convertorCArg(param) {
872
880
  throw new Error("Must never be used");
@@ -916,13 +924,10 @@ export class UnionConvertor extends BaseArgConvertor {
916
924
  throw new Error("Do not use for union");
917
925
  }
918
926
  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
927
  this.memberConvertors.forEach((it, index) => {
923
928
  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()}) {`);
929
+ const discriminator = this.unionChecker.makeDiscriminator(value, index, printer).asString();
930
+ printer.print(`${maybeElse}if (${discriminator}) {`);
926
931
  printer.pushIndent();
927
932
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(index.toString(), 8)]);
928
933
  if (!(it instanceof UndefinedConvertor)) {
@@ -932,7 +937,6 @@ export class UnionConvertor extends BaseArgConvertor {
932
937
  printer.popIndent();
933
938
  printer.print(`}`);
934
939
  });
935
- this.unionChecker.reportConflicts((_a = this.library.getCurrentContext()) !== null && _a !== void 0 ? _a : "<unknown context>", printer);
936
940
  }
937
941
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
938
942
  const statements = [];
@@ -950,7 +954,7 @@ export class UnionConvertor extends BaseArgConvertor {
950
954
  const stmt = new BlockStatement([
951
955
  writer.makeSetUnionSelector(bufferName, `${index}`),
952
956
  it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
953
- if (writer.language == Language.CJ) {
957
+ if (writer.language == Language.CJ || writer.language == Language.KOTLIN) {
954
958
  return writer.makeAssign(receiver, undefined, writer.makeFunctionCall(writer.getNodeName(this.type), [expr]), false);
955
959
  }
956
960
  else {
@@ -977,8 +981,7 @@ export class UnionConvertor extends BaseArgConvertor {
977
981
  return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) ? `${value}.value${args.index}` : value;
978
982
  }
979
983
  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)));
984
+ return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => this.unionChecker.makeDiscriminator(value, n, writer)));
982
985
  }
983
986
  }
984
987
  export class FunctionConvertor extends BaseArgConvertor {
@@ -1017,9 +1020,14 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1017
1020
  case Language.CPP:
1018
1021
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1019
1022
  case Language.JAVA:
1023
+ case Language.KOTLIN:
1020
1024
  case Language.CJ:
1021
1025
  return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1022
1026
  default:
1027
+ if (isInExternalModule(this.declaration)) {
1028
+ const extractor = getExtractor(this.declaration, writer.language, true);
1029
+ return `${extractor.receiver}.${extractor.method}(${param})`;
1030
+ }
1023
1031
  return `toPeerPtr(${param})`;
1024
1032
  }
1025
1033
  }
@@ -1046,62 +1054,11 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1046
1054
  unionDiscriminator(value, index, writer, duplicates) {
1047
1055
  if (idl.isInterface(this.declaration)) {
1048
1056
  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)]);
1057
+ return writer.instanceOf(value, this.idlType);
1101
1058
  }
1102
1059
  if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1103
1060
  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);
1061
+ return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
1105
1062
  }
1106
1063
  }
1107
1064
  }
@@ -1196,7 +1153,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1196
1153
  continuation = [
1197
1154
  writer.language == Language.CJ ?
1198
1155
  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),
1156
+ writer.makeAssign(continuationValueName, optionalReturnType, writer.language == Language.KOTLIN ? writer.makeNull() : undefined, true, false),
1200
1157
  writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
1201
1158
  writer.language == Language.CJ ?
1202
1159
  writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
@@ -1231,7 +1188,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1231
1188
  writer.makeString(`${argsSerializer}Serializer.length()`),
1232
1189
  ])),
1233
1190
  new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
1234
- writer.makeReturn(hasContinuation
1191
+ writer.makeLambdaReturn(hasContinuation
1235
1192
  ? writer.makeCast(writer.language == Language.CJ ?
1236
1193
  writer.makeString(`${continuationValueName}.value`) :
1237
1194
  writer.makeString(continuationValueName), this.decl.returnType)
@@ -1248,10 +1205,6 @@ export class CallbackConvertor extends BaseArgConvertor {
1248
1205
  isPointerType() {
1249
1206
  return true;
1250
1207
  }
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
1208
  }
1256
1209
  ////////////////////////////////////////////////////////////////////////////////
1257
1210
  // UTILS
@@ -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