@idlizer/core 2.1.7 → 2.1.9-arktscgen-5

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 (62) 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 -3
  5. package/build/lib/src/LanguageWriters/ArgConvertors.js +154 -23
  6. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +29 -4
  7. package/build/lib/src/LanguageWriters/LanguageWriter.js +42 -0
  8. package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +23 -10
  9. package/build/lib/src/LanguageWriters/convertors/KotlinConvertor.d.ts +24 -0
  10. package/build/lib/src/LanguageWriters/convertors/KotlinConvertor.js +69 -0
  11. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +25 -0
  12. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +128 -0
  13. package/build/lib/src/LanguageWriters/index.js +4 -0
  14. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +5 -5
  15. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +25 -23
  16. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +1 -1
  17. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +11 -2
  18. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +43 -10
  19. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +2 -2
  20. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +20 -11
  21. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +2 -2
  22. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +3 -3
  23. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +149 -0
  24. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +495 -0
  25. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +2 -2
  26. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +6 -4
  27. package/build/lib/src/LibraryInterface.d.ts +2 -0
  28. package/build/lib/src/config.d.ts +132 -66
  29. package/build/lib/src/config.js +4 -2
  30. package/build/lib/src/configDescriber.d.ts +1 -1
  31. package/build/lib/src/configDescriber.js +1 -1
  32. package/build/lib/src/from-idl/DtsPrinter.js +10 -7
  33. package/build/lib/src/from-idl/IDLLinter.d.ts +0 -1
  34. package/build/lib/src/from-idl/IDLLinter.js +0 -6
  35. package/build/lib/src/from-idl/deserialize.js +7 -21
  36. package/build/lib/src/idl.d.ts +4 -13
  37. package/build/lib/src/idl.js +24 -58
  38. package/build/lib/src/idlize.js +2 -0
  39. package/build/lib/src/index.d.ts +2 -0
  40. package/build/lib/src/index.js +2 -0
  41. package/build/lib/src/peer-generation/LayoutManager.d.ts +4 -1
  42. package/build/lib/src/peer-generation/LayoutManager.js +5 -1
  43. package/build/lib/src/peer-generation/Materialized.d.ts +7 -3
  44. package/build/lib/src/peer-generation/Materialized.js +18 -3
  45. package/build/lib/src/peer-generation/PeerLibrary.d.ts +5 -2
  46. package/build/lib/src/peer-generation/PeerLibrary.js +26 -6
  47. package/build/lib/src/peer-generation/PeerMethod.d.ts +1 -1
  48. package/build/lib/src/peer-generation/getSuperType.d.ts +5 -0
  49. package/build/lib/src/peer-generation/getSuperType.js +55 -0
  50. package/build/lib/src/peer-generation/idl/IdlNameConvertor.d.ts +4 -0
  51. package/build/lib/src/peer-generation/idl/IdlNameConvertor.js +7 -0
  52. package/build/lib/src/peer-generation/idl/common.js +1 -1
  53. package/build/lib/src/peer-generation/isExternalType.d.ts +4 -0
  54. package/build/lib/src/peer-generation/isExternalType.js +15 -0
  55. package/build/lib/src/peer-generation/isMaterialized.js +15 -7
  56. package/build/lib/src/util.d.ts +2 -0
  57. package/build/lib/src/util.js +17 -7
  58. package/build/lib/src/visitor.js +0 -1
  59. package/package.json +2 -2
  60. package/webidl2.js/LICENSE +0 -21
  61. package/webidl2.js/README.md +0 -827
  62. 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;
@@ -301,8 +302,21 @@ export declare class FunctionConvertor extends BaseArgConvertor {
301
302
  isPointerType(): boolean;
302
303
  }
303
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;
304
318
  declaration: idl.IDLInterface;
305
- constructor(param: string, declaration: idl.IDLInterface);
319
+ constructor(library: PeerLibrary, param: string, declaration: idl.IDLInterface);
306
320
  convertorArg(param: string, writer: LanguageWriter): string;
307
321
  convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
308
322
  convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
@@ -324,7 +338,8 @@ export declare class ImportTypeConvertor extends BaseArgConvertor {
324
338
  export declare class CallbackConvertor extends BaseArgConvertor {
325
339
  private readonly library;
326
340
  private readonly decl;
327
- constructor(library: LibraryInterface, param: string, decl: idl.IDLCallback);
341
+ private readonly interopModuleName;
342
+ constructor(library: LibraryInterface, param: string, decl: idl.IDLCallback, interopModuleName: NativeModuleType);
328
343
  private get isTransformed();
329
344
  private get transformedDecl();
330
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)
@@ -437,7 +441,7 @@ export class AggregateConvertor extends BaseArgConvertor {
437
441
  convertorSerialize(param, value, printer) {
438
442
  this.memberConvertors.forEach((it, index) => {
439
443
  let memberName = this.members[index][0];
440
- let memberAccess = `${value}.${memberName}`;
444
+ let memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
441
445
  printer.writeStatement(printer.makeAssign(`${value}_${memberName}`, undefined, printer.makeString(memberAccess), true));
442
446
  it.convertorSerialize(param, `${value}_${memberName}`, printer);
443
447
  });
@@ -463,9 +467,7 @@ export class AggregateConvertor extends BaseArgConvertor {
463
467
  /**
464
468
  * todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
465
469
  */
466
- const memberType = prop.isOptional
467
- ? idl.createUnionType([idl.IDLUndefinedType, prop.type])
468
- : prop.type;
470
+ const memberType = idl.maybeOptional(prop.type, prop.isOptional);
469
471
  return writer.makeAssign(`${bufferName}_${prop.name}`, memberType, expr, true, true);
470
472
  }, writer));
471
473
  }
@@ -548,10 +550,14 @@ export class InterfaceConvertor extends BaseArgConvertor {
548
550
  throw new Error("Must never be used");
549
551
  }
550
552
  convertorSerialize(param, value, printer) {
551
- 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]);
552
556
  }
553
557
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
554
- 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)]));
555
561
  }
556
562
  nativeType() {
557
563
  return this.idlType;
@@ -716,6 +722,11 @@ export class DateConvertor extends BaseArgConvertor {
716
722
  if (writer.language === Language.CPP) {
717
723
  writer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
718
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
+ }
719
730
  else {
720
731
  writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
721
732
  writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type).asString()
@@ -727,10 +738,13 @@ export class DateConvertor extends BaseArgConvertor {
727
738
  if (writer.language === Language.CPP) {
728
739
  return assigneer(deserializeTime);
729
740
  }
741
+ if (writer.language === Language.CJ) {
742
+ return assigneer(writer.makeString(`DateTime.now()`));
743
+ }
730
744
  return assigneer(writer.makeString(`new Date(${deserializeTime.asString()})`));
731
745
  }
732
746
  nativeType() {
733
- return idl.createReferenceType('Date');
747
+ return idl.IDLDate;
734
748
  }
735
749
  interopType() {
736
750
  return idl.IDLDate;
@@ -830,13 +844,13 @@ export class OptionConvertor extends BaseArgConvertor {
830
844
  const valueType = `${value}_type`.replaceAll('.', '_');
831
845
  const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
832
846
  printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
833
- if (printer.language != Language.CJ) {
847
+ if (printer.language != Language.CJ && printer.language != Language.KOTLIN) {
834
848
  printer.runtimeType(this, valueType, value);
835
849
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
836
850
  }
837
851
  printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
838
852
  printer.pushIndent();
839
- if (printer.language == Language.CJ) {
853
+ if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
840
854
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
841
855
  }
842
856
  const valueValue = `${value}_value`.replaceAll('.', '_');
@@ -844,7 +858,7 @@ export class OptionConvertor extends BaseArgConvertor {
844
858
  this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
845
859
  printer.popIndent();
846
860
  printer.print(`}`);
847
- if (printer.language == Language.CJ) {
861
+ if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
848
862
  printer.print('else {');
849
863
  printer.pushIndent();
850
864
  printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
@@ -860,7 +874,7 @@ export class OptionConvertor extends BaseArgConvertor {
860
874
  const statements = [];
861
875
  statements.push(writer.makeAssign(runtimeBufferName, undefined, writer.makeCast(writer.makeString(`${deserializerName}.readInt8()`), writer.getRuntimeType()), true));
862
876
  const bufferType = this.nativeType();
863
- 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));
864
878
  const thenStatement = new BlockStatement([
865
879
  this.typeConvertor.convertorDeserialize(`${bufferName}_`, deserializerName, (expr) => {
866
880
  const receiver = writer.language === Language.CPP
@@ -930,7 +944,7 @@ export class UnionConvertor extends BaseArgConvertor {
930
944
  statements.push(writer.makeAssign(`${bufferName}.selector`, undefined, writer.makeString(selectorBuffer), false));
931
945
  const branches = this.memberConvertors.map((it, index) => {
932
946
  const receiver = this.getObjectAccessor(writer.language, bufferName, { index: `${index}` });
933
- const expr = writer.makeString(`${selectorBuffer} == ${index}`);
947
+ const expr = writer.makeString(`${selectorBuffer} == ${writer.castToInt(index.toString(), 8)}`);
934
948
  const stmt = new BlockStatement([
935
949
  writer.makeSetUnionSelector(bufferName, `${index}`),
936
950
  it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
@@ -991,8 +1005,9 @@ export class FunctionConvertor extends BaseArgConvertor {
991
1005
  }
992
1006
  }
993
1007
  export class MaterializedClassConvertor extends BaseArgConvertor {
994
- constructor(param, declaration) {
1008
+ constructor(library, param, declaration) {
995
1009
  super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
1010
+ this.library = library;
996
1011
  this.declaration = declaration;
997
1012
  }
998
1013
  convertorArg(param, writer) {
@@ -1001,18 +1016,71 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1001
1016
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1002
1017
  case Language.JAVA:
1003
1018
  case Language.CJ:
1004
- return `MaterializedBase.toPeerPtr(${param})`;
1019
+ return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1005
1020
  default:
1006
1021
  return `toPeerPtr(${param})`;
1007
1022
  }
1008
1023
  }
1009
1024
  convertorSerialize(param, value, printer) {
1010
- 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`),
1011
1077
  printer.makeString(value)
1012
1078
  ])));
1013
1079
  }
1014
1080
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1015
- 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);
1016
1084
  return assigneer(readStatement);
1017
1085
  }
1018
1086
  nativeType() {
@@ -1063,10 +1131,11 @@ export class ImportTypeConvertor extends BaseArgConvertor {
1063
1131
  }
1064
1132
  }
1065
1133
  export class CallbackConvertor extends BaseArgConvertor {
1066
- constructor(library, param, decl) {
1134
+ constructor(library, param, decl, interopModuleName) {
1067
1135
  super(idl.createReferenceType(decl), [RuntimeType.FUNCTION], false, true, param);
1068
1136
  this.library = library;
1069
1137
  this.decl = decl;
1138
+ this.interopModuleName = interopModuleName;
1070
1139
  }
1071
1140
  get isTransformed() {
1072
1141
  return this.decl !== this.transformedDecl;
@@ -1104,10 +1173,72 @@ export class CallbackConvertor extends BaseArgConvertor {
1104
1173
  });
1105
1174
  return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
1106
1175
  }
1107
- let result = writer.makeString(`${deserializerName}.read${this.library.getInteropName(this.transformedDecl)}(${useSyncVersion ? 'true' : ''})`);
1108
- if (this.isTransformed)
1109
- result = writer.makeMethodCall(`CallbackTransformer`, `transformTo${this.library.getInteropName(this.decl)}`, [result]);
1110
- 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);
1111
1242
  }
1112
1243
  nativeType() {
1113
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;
@@ -245,7 +266,7 @@ export declare abstract class LanguageWriter {
245
266
  abstract writeFunctionDeclaration(name: string, signature: MethodSignature, generics?: string[]): void;
246
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;
@@ -73,6 +73,18 @@ export class MethodCallExpression extends FunctionCallExpression {
73
73
  return `${this.receiver}${this.nullable ? "?" : ""}.${super.asString()}`;
74
74
  }
75
75
  }
76
+ export class MethodStaticCallExpression extends MethodCallExpression {
77
+ constructor(receiver, method, params, nullable = false) {
78
+ super(receiver, method, params, nullable);
79
+ this.receiver = receiver;
80
+ this.nullable = nullable;
81
+ }
82
+ }
83
+ export class ThisCallExpression extends FunctionCallExpression {
84
+ constructor(params) {
85
+ super("this", params);
86
+ }
87
+ }
76
88
  export class FieldAccessExpression {
77
89
  constructor(receiver, field, nullable = false) {
78
90
  this.receiver = receiver;
@@ -283,6 +295,9 @@ export class LambdaExpression {
283
295
  stmt.write(writer);
284
296
  }
285
297
  }
298
+ writer.features.forEach(([feature, module]) => {
299
+ this.originalWriter.addFeature(feature, module);
300
+ });
286
301
  return (this.body ? ((_a = this.body) === null || _a === void 0 ? void 0 : _a.length) > 1 ? '\n' : '' : '').concat(writer.getOutput()
287
302
  .filter(line => line !== "")
288
303
  .map(line => indentedBy(line.endsWith('{') || line.endsWith('}') || line.endsWith(';') ? line : `${line};`, 1))
@@ -320,6 +335,7 @@ export var MethodModifier;
320
335
  MethodModifier[MethodModifier["THROWS"] = 8] = "THROWS";
321
336
  MethodModifier[MethodModifier["FREE"] = 9] = "FREE";
322
337
  MethodModifier[MethodModifier["FORCE_CONTEXT"] = 10] = "FORCE_CONTEXT";
338
+ MethodModifier[MethodModifier["OVERRIDE"] = 11] = "OVERRIDE";
323
339
  })(MethodModifier || (MethodModifier = {}));
324
340
  export var ClassModifier;
325
341
  (function (ClassModifier) {
@@ -327,6 +343,11 @@ export var ClassModifier;
327
343
  ClassModifier[ClassModifier["PRIVATE"] = 1] = "PRIVATE";
328
344
  ClassModifier[ClassModifier["PROTECTED"] = 2] = "PROTECTED";
329
345
  })(ClassModifier || (ClassModifier = {}));
346
+ export var DelegationType;
347
+ (function (DelegationType) {
348
+ DelegationType[DelegationType["THIS"] = 0] = "THIS";
349
+ DelegationType[DelegationType["SUPER"] = 1] = "SUPER";
350
+ })(DelegationType || (DelegationType = {}));
330
351
  export class Field {
331
352
  constructor(name, type, modifiers = []) {
332
353
  this.name = name;
@@ -355,6 +376,7 @@ PrintHint.AsPointer = new PrintHint('AsPointer');
355
376
  PrintHint.AsConstPointer = new PrintHint('AsConstPointer');
356
377
  PrintHint.AsValue = new PrintHint('AsValue');
357
378
  PrintHint.AsConstReference = new PrintHint('AsConstReference');
379
+ PrintHint.AsReference = new PrintHint('AsReference');
358
380
  export class MethodSignature {
359
381
  constructor(returnType, args, defaults = undefined, argsModifiers = undefined, printHints, argNames) {
360
382
  this.returnType = returnType;
@@ -410,11 +432,15 @@ export class LanguageWriter {
410
432
  this.resolver = resolver;
411
433
  this.language = language;
412
434
  this.namespaceStack = [];
435
+ this.features = [];
413
436
  }
414
437
  indentDepth() {
415
438
  return this.printer.indentDepth();
416
439
  }
417
440
  maybeSemicolon() { return ";"; }
441
+ addFeature(feature, module) {
442
+ this.features.push([feature, module]);
443
+ }
418
444
  // version of makeCast which uses TypeCheck.typeCast<T>(value) call for ETS language writer
419
445
  // Use it only if TypeChecker class is added as import to the generated file
420
446
  makeTypeCast(value, type, options) {
@@ -441,12 +467,17 @@ export class LanguageWriter {
441
467
  var _a;
442
468
  this.writeMethodImplementation(new Method(method.name, method.signature, [MethodModifier.SETTER].concat((_a = method.modifiers) !== null && _a !== void 0 ? _a : [])), op);
443
469
  }
470
+ // Deprecated
471
+ // Use instead declarationCall parameter in writeConstructorImplementation(...)
444
472
  writeSuperCall(params) {
445
473
  this.printer.print(`super(${params.join(", ")})${this.maybeSemicolon()}`);
446
474
  }
447
475
  writeMethodCall(receiver, method, params, nullable = false) {
448
476
  this.printer.print(`${receiver}${nullable ? "?" : ""}.${method}(${params.join(", ")})`);
449
477
  }
478
+ writeStaticMethodCall(receiver, method, params, nullable = false) {
479
+ this.writeMethodCall(receiver, method, params, nullable);
480
+ }
450
481
  writeStatement(stmt) {
451
482
  stmt.write(this);
452
483
  }
@@ -497,6 +528,14 @@ export class LanguageWriter {
497
528
  makeMethodCall(receiver, method, params, nullable) {
498
529
  return new MethodCallExpression(receiver, method, params, nullable);
499
530
  }
531
+ // Deprecated
532
+ // Use instead declarationCall parameter in writeConstructorImplementation(...) with DelegationType.THIS
533
+ makeThisCall(params) {
534
+ return new ThisCallExpression(params);
535
+ }
536
+ makeStaticMethodCall(receiver, method, params, nullable) {
537
+ return new MethodStaticCallExpression(receiver, method, params, nullable);
538
+ }
500
539
  makeFieldAccess(receiver, method, nullable) {
501
540
  return new FieldAccessExpression(receiver, method, nullable);
502
541
  }
@@ -678,6 +717,9 @@ export class LanguageWriter {
678
717
  makeCallIsObject(value) {
679
718
  return this.makeString(`typeof ${value} === "object"`);
680
719
  }
720
+ makeStaticBlock(op) {
721
+ op(this);
722
+ }
681
723
  instanceOf(convertor, value, _duplicateMembers) {
682
724
  return this.makeString(`${value} instanceof ${this.getNodeName(convertor.idlType)}`);
683
725
  }