@idlizer/core 2.1.5 → 2.1.9-arktscgen-4

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 (75) hide show
  1. package/build/lib/src/IndentedPrinter.js +2 -0
  2. package/build/lib/src/Language.d.ts +1 -0
  3. package/build/lib/src/Language.js +3 -0
  4. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +18 -4
  5. package/build/lib/src/LanguageWriters/ArgConvertors.js +162 -26
  6. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +38 -8
  7. package/build/lib/src/LanguageWriters/LanguageWriter.js +46 -4
  8. package/build/lib/src/LanguageWriters/convertors/CJConvertors.d.ts +1 -0
  9. package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +37 -14
  10. package/build/lib/src/LanguageWriters/convertors/CppConvertors.d.ts +1 -0
  11. package/build/lib/src/LanguageWriters/convertors/CppConvertors.js +55 -54
  12. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.d.ts +1 -1
  13. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +2 -2
  14. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.js +1 -0
  15. package/build/lib/src/LanguageWriters/convertors/KotlinConvertor.d.ts +24 -0
  16. package/build/lib/src/LanguageWriters/convertors/KotlinConvertor.js +69 -0
  17. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +25 -0
  18. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +128 -0
  19. package/build/lib/src/LanguageWriters/convertors/TSConvertors.d.ts +4 -2
  20. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +44 -9
  21. package/build/lib/src/LanguageWriters/index.js +4 -0
  22. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +12 -7
  23. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +43 -27
  24. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +1 -1
  25. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +11 -2
  26. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +43 -10
  27. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +5 -2
  28. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +45 -11
  29. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +2 -2
  30. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +3 -3
  31. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +149 -0
  32. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +495 -0
  33. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +8 -5
  34. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +17 -13
  35. package/build/lib/src/LibraryInterface.d.ts +2 -0
  36. package/build/lib/src/config.d.ts +673 -44
  37. package/build/lib/src/config.js +20 -0
  38. package/build/lib/src/configDescriber.d.ts +2 -2
  39. package/build/lib/src/configDescriber.js +3 -3
  40. package/build/lib/src/from-idl/DtsPrinter.js +12 -8
  41. package/build/lib/src/from-idl/IDLLinter.d.ts +0 -1
  42. package/build/lib/src/from-idl/IDLLinter.js +1 -7
  43. package/build/lib/src/from-idl/deserialize.d.ts +7 -1
  44. package/build/lib/src/from-idl/deserialize.js +72 -40
  45. package/build/lib/src/idl.d.ts +8 -15
  46. package/build/lib/src/idl.js +69 -72
  47. package/build/lib/src/idlize.js +2 -0
  48. package/build/lib/src/index.d.ts +2 -0
  49. package/build/lib/src/index.js +2 -0
  50. package/build/lib/src/peer-generation/LayoutManager.d.ts +4 -1
  51. package/build/lib/src/peer-generation/LayoutManager.js +5 -1
  52. package/build/lib/src/peer-generation/Materialized.d.ts +7 -3
  53. package/build/lib/src/peer-generation/Materialized.js +18 -4
  54. package/build/lib/src/peer-generation/PeerLibrary.d.ts +5 -2
  55. package/build/lib/src/peer-generation/PeerLibrary.js +30 -10
  56. package/build/lib/src/peer-generation/PeerMethod.d.ts +1 -1
  57. package/build/lib/src/peer-generation/getSuperType.d.ts +5 -0
  58. package/build/lib/src/peer-generation/getSuperType.js +55 -0
  59. package/build/lib/src/peer-generation/idl/IdlNameConvertor.d.ts +4 -0
  60. package/build/lib/src/peer-generation/idl/IdlNameConvertor.js +7 -0
  61. package/build/lib/src/peer-generation/idl/common.d.ts +1 -0
  62. package/build/lib/src/peer-generation/idl/common.js +9 -3
  63. package/build/lib/src/peer-generation/isExternalType.d.ts +4 -0
  64. package/build/lib/src/peer-generation/isExternalType.js +15 -0
  65. package/build/lib/src/peer-generation/isMaterialized.js +18 -6
  66. package/build/lib/src/peer-generation/unions.js +1 -1
  67. package/build/lib/src/util.d.ts +4 -1
  68. package/build/lib/src/util.js +25 -10
  69. package/build/lib/src/visitor.d.ts +2 -0
  70. package/build/lib/src/visitor.js +108 -1
  71. package/package.json +2 -2
  72. package/webidl2.js/dist/webidl2.js +62 -16
  73. package/webidl2.js/LICENSE +0 -21
  74. package/webidl2.js/README.md +0 -827
  75. package/webidl2.js/dist/package.json +0 -3
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import * as fs from "fs";
16
16
  import { indentedBy } from "./util";
17
+ import path from "path";
17
18
  export class IndentedPrinter {
18
19
  constructor(output = []) {
19
20
  this.output = output;
@@ -42,6 +43,7 @@ export class IndentedPrinter {
42
43
  return this.output;
43
44
  }
44
45
  printTo(file) {
46
+ fs.mkdirSync(path.dirname(file), { recursive: true });
45
47
  fs.writeFileSync(file, this.getOutput().join("\n"));
46
48
  }
47
49
  withIndent(prints) {
@@ -7,6 +7,7 @@ export declare class Language {
7
7
  static JAVA: Language;
8
8
  static CPP: Language;
9
9
  static CJ: Language;
10
+ static KOTLIN: Language;
10
11
  private constructor();
11
12
  toString(): string;
12
13
  get directory(): string;
@@ -30,6 +30,8 @@ export class Language {
30
30
  case "java": return Language.JAVA;
31
31
  case "ts": return Language.TS;
32
32
  case "cangjie": return Language.CJ;
33
+ case "cpp": return Language.CPP;
34
+ case "kotlin": return Language.KOTLIN;
33
35
  default: throw new Error(`Unsupported language ${name}`);
34
36
  }
35
37
  }
@@ -39,4 +41,5 @@ Language.ARKTS = new Language("ArkTS", ".ts", true); // using .ts for ArkTS unti
39
41
  Language.JAVA = new Language("Java", ".java", false);
40
42
  Language.CPP = new Language("C++", ".cc", false);
41
43
  Language.CJ = new Language("CangJie", ".cj", false);
44
+ Language.KOTLIN = new Language("Kotlin", ".kt", false);
42
45
  //# sourceMappingURL=Language.js.map
@@ -1,10 +1,11 @@
1
1
  import * as idl from "../idl";
2
2
  import { Language } from "../Language";
3
3
  import { ExpressionAssigner, LanguageExpression, LanguageStatement, LanguageWriter, Method } from "./LanguageWriter";
4
- import { RuntimeType } from "./common";
4
+ 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
+ export declare function getSerializerName(declaration: idl.IDLEntry): string;
8
9
  export interface ArgConvertor {
9
10
  param: string;
10
11
  idlType: idl.IDLType;
@@ -263,7 +264,6 @@ export declare class CustomTypeConvertor extends BaseArgConvertor {
263
264
  isPointerType(): boolean;
264
265
  }
265
266
  export declare class OptionConvertor extends BaseArgConvertor {
266
- private library;
267
267
  type: idl.IDLType;
268
268
  private readonly typeConvertor;
269
269
  constructor(library: LibraryInterface, param: string, type: idl.IDLType);
@@ -302,8 +302,21 @@ export declare class FunctionConvertor extends BaseArgConvertor {
302
302
  isPointerType(): boolean;
303
303
  }
304
304
  export declare class MaterializedClassConvertor extends BaseArgConvertor {
305
+ private library;
306
+ declaration: idl.IDLInterface;
307
+ constructor(library: LibraryInterface, param: string, declaration: idl.IDLInterface);
308
+ convertorArg(param: string, writer: LanguageWriter): string;
309
+ convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
310
+ convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
311
+ nativeType(): idl.IDLType;
312
+ interopType(): idl.IDLType;
313
+ isPointerType(): boolean;
314
+ unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
315
+ }
316
+ export declare class ExternalTypeConvertor extends BaseArgConvertor {
317
+ private library;
305
318
  declaration: idl.IDLInterface;
306
- constructor(param: string, declaration: idl.IDLInterface);
319
+ constructor(library: PeerLibrary, param: string, declaration: idl.IDLInterface);
307
320
  convertorArg(param: string, writer: LanguageWriter): string;
308
321
  convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
309
322
  convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
@@ -325,7 +338,8 @@ export declare class ImportTypeConvertor extends BaseArgConvertor {
325
338
  export declare class CallbackConvertor extends BaseArgConvertor {
326
339
  private readonly library;
327
340
  private readonly decl;
328
- constructor(library: LibraryInterface, param: string, decl: idl.IDLCallback);
341
+ private readonly interopModuleName;
342
+ constructor(library: LibraryInterface, param: string, decl: idl.IDLCallback, interopModuleName: NativeModuleType);
329
343
  private get isTransformed();
330
344
  private get transformedDecl();
331
345
  convertorArg(param: string, writer: LanguageWriter): string;
@@ -14,15 +14,19 @@
14
14
  */
15
15
  import * as idl from "../idl";
16
16
  import { Language } from "../Language";
17
- import { BlockStatement, PrintHint, StringExpression, MethodModifier } from "./LanguageWriter";
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 { hashCodeFromString, warn } from "../util";
20
+ import { getExtractorName, hashCodeFromString, 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
+ import { LayoutNodeRole } from "../peer-generation/LayoutManager";
27
+ export function getSerializerName(declaration) {
28
+ return `${idl.getQualifiedName(declaration, "namespace.name").split('.').join('_')}_serializer`;
29
+ }
26
30
  export function isDirectConvertedType(originalType, library) {
27
31
  const debug = false;
28
32
  if (originalType == undefined)
@@ -47,7 +51,6 @@ export function isDirectConvertedType(originalType, library) {
47
51
  convertor instanceof MapConvertor ||
48
52
  convertor instanceof TupleConvertor ||
49
53
  convertor instanceof AggregateConvertor ||
50
- convertor instanceof UnionConvertor ||
51
54
  convertor instanceof OptionConvertor ||
52
55
  convertor instanceof ImportTypeConvertor) {
53
56
  // try { console.log(`convertor is ${convertor.constructor.name} for ${JSON.stringify(originalType)}`) } catch (e) {}
@@ -438,7 +441,7 @@ export class AggregateConvertor extends BaseArgConvertor {
438
441
  convertorSerialize(param, value, printer) {
439
442
  this.memberConvertors.forEach((it, index) => {
440
443
  let memberName = this.members[index][0];
441
- let memberAccess = `${value}.${memberName}`;
444
+ let memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
442
445
  printer.writeStatement(printer.makeAssign(`${value}_${memberName}`, undefined, printer.makeString(memberAccess), true));
443
446
  it.convertorSerialize(param, `${value}_${memberName}`, printer);
444
447
  });
@@ -464,9 +467,7 @@ export class AggregateConvertor extends BaseArgConvertor {
464
467
  /**
465
468
  * todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
466
469
  */
467
- const memberType = prop.isOptional
468
- ? idl.createUnionType([idl.IDLUndefinedType, prop.type])
469
- : prop.type;
470
+ const memberType = idl.maybeOptional(prop.type, prop.isOptional);
470
471
  return writer.makeAssign(`${bufferName}_${prop.name}`, memberType, expr, true, true);
471
472
  }, writer));
472
473
  }
@@ -549,10 +550,14 @@ export class InterfaceConvertor extends BaseArgConvertor {
549
550
  throw new Error("Must never be used");
550
551
  }
551
552
  convertorSerialize(param, value, printer) {
552
- printer.writeMethodCall(`${param}Serializer`, `write${this.library.getInteropName(this.idlType)}`, [value]);
553
+ const accessor = getSerializerName(this.declaration);
554
+ printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
555
+ printer.writeStaticMethodCall(accessor, 'write', [`${param}Serializer`, value]);
553
556
  }
554
557
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
555
- return assigneer(writer.makeMethodCall(`${deserializerName}`, `read${this.library.getInteropName(this.idlType)}`, []));
558
+ const accessor = getSerializerName(this.declaration);
559
+ writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
560
+ return assigneer(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]));
556
561
  }
557
562
  nativeType() {
558
563
  return this.idlType;
@@ -717,6 +722,11 @@ export class DateConvertor extends BaseArgConvertor {
717
722
  if (writer.language === Language.CPP) {
718
723
  writer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
719
724
  }
725
+ else if (writer.language === Language.CJ) {
726
+ writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
727
+ writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type).asString()
728
+ ]);
729
+ }
720
730
  else {
721
731
  writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
722
732
  writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type).asString()
@@ -728,10 +738,13 @@ export class DateConvertor extends BaseArgConvertor {
728
738
  if (writer.language === Language.CPP) {
729
739
  return assigneer(deserializeTime);
730
740
  }
741
+ if (writer.language === Language.CJ) {
742
+ return assigneer(writer.makeString(`DateTime.now()`));
743
+ }
731
744
  return assigneer(writer.makeString(`new Date(${deserializeTime.asString()})`));
732
745
  }
733
746
  nativeType() {
734
- return idl.createReferenceType('Date');
747
+ return idl.IDLDate;
735
748
  }
736
749
  interopType() {
737
750
  return idl.IDLDate;
@@ -809,12 +822,18 @@ export class OptionConvertor extends BaseArgConvertor {
809
822
  // TODO: be smarter here, and for smth like Length|undefined or number|undefined pass without serializer.
810
823
  constructor(library, param, type) {
811
824
  let conv = library.typeConvertor(param, type);
825
+ let currentConv = conv;
826
+ while (currentConv instanceof ProxyConvertor) {
827
+ currentConv = currentConv.convertor;
828
+ }
829
+ if (currentConv instanceof OptionConvertor) {
830
+ conv = currentConv.typeConvertor;
831
+ }
812
832
  let runtimeTypes = conv.runtimeTypes;
813
833
  if (!runtimeTypes.includes(RuntimeType.UNDEFINED)) {
814
834
  runtimeTypes.push(RuntimeType.UNDEFINED);
815
835
  }
816
836
  super(idl.createOptionalType(conv.idlType), runtimeTypes, conv.isScoped, true, param);
817
- this.library = library;
818
837
  this.type = type;
819
838
  this.typeConvertor = conv;
820
839
  }
@@ -825,13 +844,13 @@ export class OptionConvertor extends BaseArgConvertor {
825
844
  const valueType = `${value}_type`.replaceAll('.', '_');
826
845
  const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
827
846
  printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
828
- if (printer.language != Language.CJ) {
847
+ if (printer.language != Language.CJ && printer.language != Language.KOTLIN) {
829
848
  printer.runtimeType(this, valueType, value);
830
849
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
831
850
  }
832
851
  printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
833
852
  printer.pushIndent();
834
- if (printer.language == Language.CJ) {
853
+ if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
835
854
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
836
855
  }
837
856
  const valueValue = `${value}_value`.replaceAll('.', '_');
@@ -839,7 +858,7 @@ export class OptionConvertor extends BaseArgConvertor {
839
858
  this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
840
859
  printer.popIndent();
841
860
  printer.print(`}`);
842
- if (printer.language == Language.CJ) {
861
+ if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
843
862
  printer.print('else {');
844
863
  printer.pushIndent();
845
864
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
@@ -855,7 +874,7 @@ export class OptionConvertor extends BaseArgConvertor {
855
874
  const statements = [];
856
875
  statements.push(writer.makeAssign(runtimeBufferName, undefined, writer.makeCast(writer.makeString(`${deserializerName}.readInt8()`), writer.getRuntimeType()), true));
857
876
  const bufferType = this.nativeType();
858
- statements.push(writer.makeAssign(bufferName, bufferType, writer.language == Language.CJ ? writer.makeNull() : undefined, true, false));
877
+ statements.push(writer.makeAssign(bufferName, bufferType, (writer.language == Language.CJ || writer.language == Language.KOTLIN) ? writer.makeNull() : undefined, true, false));
859
878
  const thenStatement = new BlockStatement([
860
879
  this.typeConvertor.convertorDeserialize(`${bufferName}_`, deserializerName, (expr) => {
861
880
  const receiver = writer.language === Language.CPP
@@ -925,7 +944,7 @@ export class UnionConvertor extends BaseArgConvertor {
925
944
  statements.push(writer.makeAssign(`${bufferName}.selector`, undefined, writer.makeString(selectorBuffer), false));
926
945
  const branches = this.memberConvertors.map((it, index) => {
927
946
  const receiver = this.getObjectAccessor(writer.language, bufferName, { index: `${index}` });
928
- const expr = writer.makeString(`${selectorBuffer} == ${index}`);
947
+ const expr = writer.makeString(`${selectorBuffer} == ${writer.castToInt(index.toString(), 8)}`);
929
948
  const stmt = new BlockStatement([
930
949
  writer.makeSetUnionSelector(bufferName, `${index}`),
931
950
  it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
@@ -940,7 +959,7 @@ export class UnionConvertor extends BaseArgConvertor {
940
959
  return { expr, stmt };
941
960
  });
942
961
  statements.push(writer.makeMultiBranchCondition(branches, writer.makeThrowError(`One of the branches for ${bufferName} has to be chosen through deserialisation.`)));
943
- statements.push(assigneer(writer.makeCast(writer.makeString(bufferName), this.type)));
962
+ statements.push(assigneer(writer.makeCast(writer.makeString(bufferName), this.nativeType())));
944
963
  return new BlockStatement(statements, false);
945
964
  }
946
965
  nativeType() {
@@ -986,8 +1005,9 @@ export class FunctionConvertor extends BaseArgConvertor {
986
1005
  }
987
1006
  }
988
1007
  export class MaterializedClassConvertor extends BaseArgConvertor {
989
- constructor(param, declaration) {
1008
+ constructor(library, param, declaration) {
990
1009
  super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
1010
+ this.library = library;
991
1011
  this.declaration = declaration;
992
1012
  }
993
1013
  convertorArg(param, writer) {
@@ -996,18 +1016,71 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
996
1016
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
997
1017
  case Language.JAVA:
998
1018
  case Language.CJ:
999
- return `MaterializedBase.toPeerPtr(${param})`;
1019
+ return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1000
1020
  default:
1001
1021
  return `toPeerPtr(${param})`;
1002
1022
  }
1003
1023
  }
1004
1024
  convertorSerialize(param, value, printer) {
1005
- printer.writeStatement(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, `write${qualifiedName(this.declaration, "_", "namespace.name")}`, [
1025
+ const accessorRoot = getSerializerName(this.declaration);
1026
+ printer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1027
+ printer.writeStaticMethodCall(accessorRoot, 'write', [`${param}Serializer`, value]);
1028
+ }
1029
+ convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1030
+ const accessorRoot = getSerializerName(this.declaration);
1031
+ writer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
1032
+ const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessorRoot, "read", [writer.makeString(deserializerName)]), this.declaration);
1033
+ return assigneer(readStatement);
1034
+ }
1035
+ nativeType() {
1036
+ return idl.createReferenceType(this.declaration);
1037
+ }
1038
+ interopType() {
1039
+ return idl.IDLPointerType;
1040
+ }
1041
+ isPointerType() {
1042
+ return false;
1043
+ }
1044
+ unionDiscriminator(value, index, writer, duplicates) {
1045
+ if (idl.isInterface(this.declaration)) {
1046
+ if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
1047
+ return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
1048
+ }
1049
+ if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
1050
+ 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`),
1006
1077
  printer.makeString(value)
1007
1078
  ])));
1008
1079
  }
1009
1080
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1010
- const readStatement = writer.makeCast(writer.makeMethodCall(`${deserializerName}`, `read${qualifiedName(this.declaration, "_", "namespace.name")}`, []), this.declaration);
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);
1011
1084
  return assigneer(readStatement);
1012
1085
  }
1013
1086
  nativeType() {
@@ -1058,10 +1131,11 @@ export class ImportTypeConvertor extends BaseArgConvertor {
1058
1131
  }
1059
1132
  }
1060
1133
  export class CallbackConvertor extends BaseArgConvertor {
1061
- constructor(library, param, decl) {
1134
+ constructor(library, param, decl, interopModuleName) {
1062
1135
  super(idl.createReferenceType(decl), [RuntimeType.FUNCTION], false, true, param);
1063
1136
  this.library = library;
1064
1137
  this.decl = decl;
1138
+ this.interopModuleName = interopModuleName;
1065
1139
  }
1066
1140
  get isTransformed() {
1067
1141
  return this.decl !== this.transformedDecl;
@@ -1099,10 +1173,72 @@ export class CallbackConvertor extends BaseArgConvertor {
1099
1173
  });
1100
1174
  return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
1101
1175
  }
1102
- let result = writer.makeString(`${deserializerName}.read${this.library.getInteropName(this.transformedDecl)}(${useSyncVersion ? 'true' : ''})`);
1103
- if (this.isTransformed)
1104
- result = writer.makeMethodCall(`CallbackTransformer`, `transformTo${this.library.getInteropName(this.decl)}`, [result]);
1105
- return assigneer(result);
1176
+ const resourceName = bufferName + "_resource";
1177
+ const callName = bufferName + "_call";
1178
+ const callSyncName = bufferName + '_callSync';
1179
+ const argsSerializer = bufferName + "_args";
1180
+ const continuationValueName = bufferName + "_continuationValue";
1181
+ const continuationCallbackName = bufferName + "_continuationCallback";
1182
+ const statements = [];
1183
+ statements.push(writer.makeAssign(resourceName, idl.createReferenceType("CallbackResource"), writer.makeMethodCall(deserializerName, 'readCallbackResource', []), true));
1184
+ statements.push(writer.makeAssign(callName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, `readPointer`, []), true));
1185
+ statements.push(writer.makeAssign(callSyncName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, 'readPointer', []), true));
1186
+ const callbackSignature = new NamedMethodSignature(this.decl.returnType, this.decl.parameters.map(it => idl.maybeOptional(it.type, it.isOptional)), this.decl.parameters.map(it => it.name));
1187
+ const hasContinuation = !idl.isVoidType(this.decl.returnType);
1188
+ let continuation = [];
1189
+ if (hasContinuation) {
1190
+ const continuationReference = this.library.createContinuationCallbackReference(this.decl.returnType);
1191
+ const continuationConvertor = this.library.typeConvertor(continuationCallbackName, continuationReference);
1192
+ const returnType = this.decl.returnType;
1193
+ const optionalReturnType = idl.createOptionalType(this.decl.returnType);
1194
+ continuation = [
1195
+ writer.language == Language.CJ ?
1196
+ 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),
1198
+ writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
1199
+ writer.language == Language.CJ ?
1200
+ writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
1201
+ writer.makeAssign(continuationValueName, undefined, writer.makeString(`value`), false)
1202
+ ]), true),
1203
+ new ProxyStatement(writer => {
1204
+ continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer);
1205
+ }),
1206
+ ];
1207
+ }
1208
+ const result = writer.makeLambda(callbackSignature, [
1209
+ writer.makeAssign(`${argsSerializer}Serializer`, idl.createReferenceType('SerializerBase'), writer.makeMethodCall('SerializerBase', 'hold', []), true),
1210
+ new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writeInt32`, [writer.makeString(`${resourceName}.resourceId`)])),
1211
+ new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writePointer`, [writer.makeString(callName)])),
1212
+ new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writePointer`, [writer.makeString(callSyncName)])),
1213
+ ...this.decl.parameters.map(it => {
1214
+ const convertor = this.library.typeConvertor(it.name, it.type, it.isOptional);
1215
+ return new ProxyStatement((writer) => {
1216
+ convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer);
1217
+ });
1218
+ }),
1219
+ ...continuation,
1220
+ new ExpressionStatement(useSyncVersion
1221
+ ? writer.makeNativeCall(this.interopModuleName, `_CallCallbackSync`, [
1222
+ writer.makeString(generateCallbackKindValue(this.decl).toString()),
1223
+ writer.makeSerializedBufferGetter(`${argsSerializer}Serializer`),
1224
+ writer.makeString(`${argsSerializer}Serializer.length()`),
1225
+ ])
1226
+ : writer.makeNativeCall(this.interopModuleName, `_CallCallback`, [
1227
+ writer.makeString(generateCallbackKindValue(this.decl).toString()),
1228
+ writer.makeSerializedBufferGetter(`${argsSerializer}Serializer`),
1229
+ writer.makeString(`${argsSerializer}Serializer.length()`),
1230
+ ])),
1231
+ new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
1232
+ writer.makeReturn(hasContinuation
1233
+ ? writer.makeCast(writer.language == Language.CJ ?
1234
+ writer.makeString(`${continuationValueName}.value`) :
1235
+ writer.makeString(continuationValueName), this.decl.returnType)
1236
+ : undefined),
1237
+ ]);
1238
+ return writer.makeBlock([
1239
+ ...statements,
1240
+ assigneer(result)
1241
+ ], false);
1106
1242
  }
1107
1243
  nativeType() {
1108
1244
  return idl.createReferenceType(this.decl);
@@ -33,8 +33,8 @@ export declare class NewObjectExpression implements LanguageExpression {
33
33
  asString(): string;
34
34
  }
35
35
  export declare class FunctionCallExpression implements LanguageExpression {
36
- private name;
37
- private params;
36
+ protected name: string;
37
+ protected params: LanguageExpression[];
38
38
  constructor(name: string, params: LanguageExpression[]);
39
39
  asString(): string;
40
40
  }
@@ -44,6 +44,14 @@ export declare class MethodCallExpression extends FunctionCallExpression {
44
44
  constructor(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean);
45
45
  asString(): string;
46
46
  }
47
+ export declare class MethodStaticCallExpression extends MethodCallExpression {
48
+ receiver: string;
49
+ nullable: boolean;
50
+ constructor(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean);
51
+ }
52
+ export declare class ThisCallExpression extends FunctionCallExpression {
53
+ constructor(params: LanguageExpression[]);
54
+ }
47
55
  export declare class FieldAccessExpression {
48
56
  receiver: string;
49
57
  field: string;
@@ -161,13 +169,23 @@ export declare enum MethodModifier {
161
169
  SETTER = 7,
162
170
  THROWS = 8,
163
171
  FREE = 9,
164
- FORCE_CONTEXT = 10
172
+ FORCE_CONTEXT = 10,
173
+ OVERRIDE = 11
165
174
  }
166
175
  export declare enum ClassModifier {
167
176
  PUBLIC = 0,
168
177
  PRIVATE = 1,
169
178
  PROTECTED = 2
170
179
  }
180
+ export declare enum DelegationType {
181
+ THIS = 0,
182
+ SUPER = 1
183
+ }
184
+ export interface DelegationCall {
185
+ delegationType?: DelegationType;
186
+ delegationName?: string;
187
+ delegationArgs: LanguageExpression[];
188
+ }
171
189
  export declare class Field {
172
190
  name: string;
173
191
  type: idl.IDLType;
@@ -189,6 +207,7 @@ export declare class PrintHint {
189
207
  static AsConstPointer: PrintHint;
190
208
  static AsValue: PrintHint;
191
209
  static AsConstReference: PrintHint;
210
+ static AsReference: PrintHint;
192
211
  }
193
212
  type MethodArgPrintHintOrNone = PrintHint | undefined;
194
213
  export declare class MethodSignature {
@@ -230,6 +249,8 @@ export declare abstract class LanguageWriter {
230
249
  language: Language);
231
250
  indentDepth(): number;
232
251
  maybeSemicolon(): string;
252
+ features: [string, string][];
253
+ addFeature(feature: string, module: string): void;
233
254
  abstract writeClass(name: string, op: (writer: this) => void, superClass?: string, interfaces?: string[], generics?: string[], isDeclared?: boolean, isExport?: boolean): void;
234
255
  abstract writeEnum(name: string, members: {
235
256
  name: string;
@@ -242,10 +263,10 @@ export declare abstract class LanguageWriter {
242
263
  }, op?: (writer: this) => void): void;
243
264
  abstract writeInterface(name: string, op: (writer: this) => void, superInterfaces?: string[], generics?: string[], isDeclared?: boolean): void;
244
265
  abstract writeFieldDeclaration(name: string, type: idl.IDLType, modifiers: FieldModifier[] | undefined, optional: boolean, initExpr?: LanguageExpression): void;
245
- abstract writeFunctionDeclaration(name: string, signature: MethodSignature): void;
246
- abstract writeFunctionImplementation(name: string, signature: MethodSignature, op: (writer: this) => void): void;
266
+ abstract writeFunctionDeclaration(name: string, signature: MethodSignature, generics?: string[]): void;
267
+ abstract writeFunctionImplementation(name: string, signature: MethodSignature, op: (writer: this) => void, generics?: string[]): void;
247
268
  abstract writeMethodDeclaration(name: string, signature: MethodSignature, modifiers?: MethodModifier[]): void;
248
- abstract writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, superCall?: Method, modifiers?: MethodModifier[]): void;
269
+ abstract writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, delegationCall?: DelegationCall, modifiers?: MethodModifier[]): void;
249
270
  abstract writeMethodImplementation(method: Method, op: (writer: this) => void): void;
250
271
  abstract writeProperty(propName: string, propType: idl.IDLType, modifiers: FieldModifier[], getter?: {
251
272
  method: Method;
@@ -293,6 +314,7 @@ export declare abstract class LanguageWriter {
293
314
  writeSetterImplementation(method: Method, op: (writer: this) => void): void;
294
315
  writeSuperCall(params: string[]): void;
295
316
  writeMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
317
+ writeStaticMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
296
318
  writeStatement(stmt: LanguageStatement): void;
297
319
  writeStatements(...statements: LanguageStatement[]): void;
298
320
  writeExpressionStatement(smth: LanguageExpression): void;
@@ -307,6 +329,8 @@ export declare abstract class LanguageWriter {
307
329
  makeNewObject(objectName: string, params?: LanguageExpression[]): LanguageExpression;
308
330
  makeFunctionCall(name: string | LanguageExpression, params: LanguageExpression[]): LanguageExpression;
309
331
  makeMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
332
+ makeThisCall(params: LanguageExpression[]): LanguageExpression;
333
+ makeStaticMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
310
334
  makeFieldAccess(receiver: string, method: string, nullable?: boolean): LanguageExpression;
311
335
  makeNativeCall(nativeModule: NativeModuleType, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
312
336
  makeBlock(statements: LanguageStatement[], inScope?: boolean): BlockStatement;
@@ -370,6 +394,7 @@ export declare abstract class LanguageWriter {
370
394
  castToInt(value: string, bitness: 8 | 32): string;
371
395
  castToBoolean(value: string): string;
372
396
  makeCallIsObject(value: string): LanguageExpression;
397
+ makeStaticBlock(op: (writer: LanguageWriter) => void): void;
373
398
  instanceOf(convertor: ArgConvertor, value: string, _duplicateMembers?: Set<string>): LanguageExpression;
374
399
  typeInstanceOf(type: idl.IDLEntry, value: string, members?: string[]): LanguageExpression;
375
400
  stringifyTypeOrEmpty(type: idl.IDLType | undefined): string;
@@ -377,11 +402,16 @@ export declare abstract class LanguageWriter {
377
402
  * Writes `namespace <namespace> {` and adds extra indent
378
403
  * @param namespace Namespace to begin
379
404
  */
380
- pushNamespace(namespace: string, ident?: boolean): void;
405
+ pushNamespace(namespace: string, options: {
406
+ ident: boolean;
407
+ isDeclared?: boolean;
408
+ }): void;
381
409
  /**
382
410
  * Writes closing brace of namespace block and removes one level of indent
383
411
  */
384
- popNamespace(ident?: boolean): void;
412
+ popNamespace(options: {
413
+ ident: boolean;
414
+ }): void;
385
415
  static _isReferenceRelativeToNamespaces: boolean;
386
416
  static get isReferenceRelativeToNamespaces(): boolean;
387
417
  static relativeReferences<T>(isRelative: boolean, op: () => T): T;