@idlizer/core 2.1.10-arktscgen-7 → 2.1.10-arktscgen-10

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 (77) hide show
  1. package/build/lib/src/IndentedPrinter.js +2 -2
  2. package/build/lib/src/Language.d.ts +1 -0
  3. package/build/lib/src/Language.js +8 -0
  4. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +47 -3
  5. package/build/lib/src/LanguageWriters/ArgConvertors.js +216 -19
  6. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +12 -4
  7. package/build/lib/src/LanguageWriters/LanguageWriter.js +28 -3
  8. package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +6 -2
  9. package/build/lib/src/LanguageWriters/convertors/CppConvertors.js +7 -1
  10. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +3 -0
  11. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.js +4 -0
  12. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +10 -5
  13. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +138 -51
  14. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +5 -1
  15. package/build/lib/src/LanguageWriters/index.d.ts +1 -2
  16. package/build/lib/src/LanguageWriters/index.js +17 -3
  17. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +1 -1
  18. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +5 -3
  19. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +1 -1
  20. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +5 -3
  21. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +2 -1
  22. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +8 -3
  23. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +4 -10
  24. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +6 -4
  25. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +59 -42
  26. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +1 -1
  27. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +5 -3
  28. package/build/lib/src/LibraryInterface.d.ts +6 -0
  29. package/build/lib/src/LibraryInterface.js +22 -1
  30. package/build/lib/src/from-idl/DtsPrinter.d.ts +3 -2
  31. package/build/lib/src/from-idl/DtsPrinter.js +9 -6
  32. package/build/lib/src/from-idl/parser.d.ts +1 -1
  33. package/build/lib/src/from-idl/parser.js +3 -3
  34. package/build/lib/src/idl/builders.d.ts +36 -1
  35. package/build/lib/src/idl/builders.js +62 -2
  36. package/build/lib/src/idl/dump.d.ts +3 -0
  37. package/build/lib/src/idl/dump.js +22 -4
  38. package/build/lib/src/idl/index.d.ts +0 -1
  39. package/build/lib/src/idl/index.js +0 -1
  40. package/build/lib/src/idl/node.d.ts +1 -0
  41. package/build/lib/src/idl/node.js +1 -0
  42. package/build/lib/src/idl/stdlib.d.ts +1 -0
  43. package/build/lib/src/idl/stdlib.js +1 -0
  44. package/build/lib/src/idl/utils.d.ts +4 -3
  45. package/build/lib/src/idl/utils.js +26 -13
  46. package/build/lib/src/idl/visitors.js +24 -104
  47. package/build/lib/src/index.d.ts +4 -1
  48. package/build/lib/src/index.js +4 -1
  49. package/build/lib/src/peer-generation/Extractors.d.ts +7 -0
  50. package/build/lib/src/peer-generation/Extractors.js +40 -0
  51. package/build/lib/src/peer-generation/Initializers.d.ts +5 -0
  52. package/build/lib/src/peer-generation/Initializers.js +28 -0
  53. package/build/lib/src/peer-generation/Materialized.d.ts +0 -4
  54. package/build/lib/src/peer-generation/Materialized.js +13 -24
  55. package/build/lib/src/peer-generation/PeerLibrary.d.ts +1 -0
  56. package/build/lib/src/peer-generation/PeerLibrary.js +54 -3
  57. package/build/lib/src/peer-generation/PeerMethod.d.ts +1 -0
  58. package/build/lib/src/peer-generation/PeerMethod.js +1 -0
  59. package/build/lib/src/peer-generation/idl/common.d.ts +0 -2
  60. package/build/lib/src/peer-generation/idl/common.js +3 -25
  61. package/build/lib/src/peer-generation/isMaterialized.d.ts +4 -0
  62. package/build/lib/src/peer-generation/isMaterialized.js +12 -0
  63. package/build/lib/src/peer-generation/unions.d.ts +1 -27
  64. package/build/lib/src/peer-generation/unions.js +1 -99
  65. package/build/lib/src/transformers/FqnTransformer.js +26 -2
  66. package/build/lib/src/transformers/GenericTransformer.d.ts +0 -2
  67. package/build/lib/src/transformers/GenericTransformer.js +20 -20
  68. package/build/lib/src/transformers/IdlTransformer.js +14 -0
  69. package/build/lib/src/transformers/NullTransformer.js +16 -3
  70. package/build/lib/src/transformers/OnSerializeTransformer.js +14 -0
  71. package/build/lib/src/transformers/ThrowsTransformer.d.ts +3 -0
  72. package/build/lib/src/transformers/ThrowsTransformer.js +51 -0
  73. package/build/lib/src/transformers/transformUtils.d.ts +7 -0
  74. package/build/lib/src/transformers/transformUtils.js +55 -0
  75. package/build/lib/src/util.d.ts +0 -15
  76. package/build/lib/src/util.js +2 -73
  77. package/package.json +11 -5
@@ -12,9 +12,9 @@
12
12
  * See the License for the specific language governing permissions and
13
13
  * limitations under the License.
14
14
  */
15
- import * as fs from "fs";
15
+ import * as fs from "node:fs";
16
16
  import { indentedBy } from "./util";
17
- import path from "path";
17
+ import path from "node:path";
18
18
  export class IndentedPrinter {
19
19
  constructor(output = [], indent = 0) {
20
20
  this.output = output;
@@ -10,5 +10,6 @@ export declare class Language {
10
10
  toString(): string;
11
11
  get directory(): string;
12
12
  static fromString(name: string): Language;
13
+ static supportNS(lang: Language): boolean;
13
14
  }
14
15
  //# sourceMappingURL=Language.d.ts.map
@@ -33,6 +33,14 @@ export class Language {
33
33
  default: throw new Error(`Unsupported language ${name}`);
34
34
  }
35
35
  }
36
+ static supportNS(lang) {
37
+ switch (lang.name) {
38
+ case "ArkTS": return true;
39
+ case "TS": return true;
40
+ case "C++": return true;
41
+ default: return false;
42
+ }
43
+ }
36
44
  }
37
45
  Language.TS = new Language("TS", ".ts");
38
46
  Language.ARKTS = new Language("ArkTS", ".ts"); // using .ts for ArkTS until we get rit of tsc preprocessing
@@ -3,9 +3,13 @@ import { Language } from "../Language";
3
3
  import { BranchStatement, ExpressionAssigner, LanguageExpression, LanguageStatement, LanguageWriter } from "./LanguageWriter";
4
4
  import { NativeModuleType, RuntimeType } from "./common";
5
5
  import { LibraryInterface } from "../LibraryInterface";
6
- import { ReferenceResolver } from "../peer-generation/ReferenceResolver";
7
6
  import { PeerLibrary } from "../peer-generation/PeerLibrary";
7
+ import { TypeConvertor } from "./nameConvertor";
8
+ import { ReferenceResolver } from "../peer-generation/ReferenceResolver";
8
9
  export declare function getSerializerName(_library: LibraryInterface, _language: Language, declaration: idl.IDLEntry): string;
10
+ export declare function makeETSDiscriminatorFromFields(self: LanguageWriter, convertor: {
11
+ targetType: (writer: LanguageWriter) => string;
12
+ }, value: string, accessors: string[], duplicates: Set<string>): LanguageExpression;
9
13
  export interface ArgConvertor {
10
14
  param: string;
11
15
  idlType: idl.IDLType;
@@ -302,6 +306,18 @@ export declare class UnionConvertor extends BaseArgConvertor {
302
306
  getObjectAccessor(language: Language, value: string, args?: Record<string, string>): string;
303
307
  unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
304
308
  }
309
+ export declare class ThrowsConvertor extends BaseArgConvertor {
310
+ private library;
311
+ private decl;
312
+ private convertor;
313
+ constructor(library: LibraryInterface, param: string, decl: idl.IDLInterface);
314
+ convertorArg(param: string, writer: LanguageWriter): string;
315
+ convertorSerialize(param: string, value: string, writer: LanguageWriter): LanguageStatement;
316
+ convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
317
+ nativeType(): idl.IDLType;
318
+ interopType(): idl.IDLType;
319
+ isPointerType(): boolean;
320
+ }
305
321
  export declare class FunctionConvertor extends BaseArgConvertor {
306
322
  private library;
307
323
  constructor(library: LibraryInterface, param: string);
@@ -352,19 +368,47 @@ export declare function generateCallbackKindName(callback: idl.IDLCallback): str
352
368
  export declare function generateCallbackKindAccess(callback: idl.IDLCallback, language: Language): string;
353
369
  export declare function generateCallbackKindValue(callback: idl.IDLCallback): number;
354
370
  export declare function generateCallbackAPIArguments(library: LibraryInterface, callback: idl.IDLCallback): string[];
355
- export declare function maybeTransformManagedCallback(callback: idl.IDLCallback, library: ReferenceResolver): idl.IDLCallback | undefined;
356
371
  export declare class TransformOnSerializeConvertor extends BaseArgConvertor {
357
372
  protected library: PeerLibrary;
358
373
  protected managedDeclaration: idl.IDLEntry;
374
+ protected source: idl.IDLType;
359
375
  protected target: idl.IDLType;
360
376
  private targetConvertor;
361
- constructor(param: string, library: PeerLibrary, managedDeclaration: idl.IDLEntry, target: idl.IDLType);
377
+ constructor(param: string, library: PeerLibrary, managedDeclaration: idl.IDLEntry, source: idl.IDLType, target: idl.IDLType);
378
+ getSourceType(): idl.IDLType;
379
+ getTargetType(): idl.IDLType;
362
380
  isPointerType(): boolean;
363
381
  nativeType(): idl.IDLType;
364
382
  convertorArg(param: string, writer: LanguageWriter): string;
383
+ addImport(transformerInfo: {
384
+ module: string;
385
+ ns?: string;
386
+ method: string;
387
+ }, writer: LanguageWriter): void;
365
388
  convertorSerialize(param: string, value: string, writer: LanguageWriter): LanguageStatement;
366
389
  convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
367
390
  }
368
391
  export declare function createOutArgConvertor(library: PeerLibrary, type: idl.IDLType | undefined, otherParams: string[]): ArgConvertor | undefined;
392
+ export declare class UnionFlattener implements TypeConvertor<idl.IDLType[]> {
393
+ private resolver;
394
+ constructor(resolver: ReferenceResolver);
395
+ convertImport(type: idl.IDLImport): idl.IDLType[];
396
+ convertUnion(type: idl.IDLUnionType): idl.IDLType[];
397
+ convertTypeReference(type: idl.IDLReferenceType): idl.IDLType[];
398
+ convertOptional(type: idl.IDLOptionalType): idl.IDLType[];
399
+ convertContainer(type: idl.IDLContainerType): idl.IDLType[];
400
+ convertTypeReferenceAsImport(type: idl.IDLReferenceType, importClause: string): idl.IDLType[];
401
+ convertPrimitiveType(type: idl.IDLPrimitiveType): idl.IDLType[];
402
+ convertTypeParameter(type: idl.IDLTypeParameterType): idl.IDLType[];
403
+ }
404
+ export declare class UnionRuntimeTypeChecker {
405
+ private convertors;
406
+ private conflictingConvertors;
407
+ private duplicateMembers;
408
+ constructor(convertors: ArgConvertor[]);
409
+ private checkConflicts;
410
+ makeDiscriminator(value: string, convertorIndex: number, writer: LanguageWriter, library: LibraryInterface, type?: idl.IDLType): LanguageExpression;
411
+ }
412
+ export declare function flattenUnionType(library: LibraryInterface, type: idl.IDLType): idl.IDLType;
369
413
  export {};
370
414
  //# sourceMappingURL=ArgConvertors.d.ts.map
@@ -17,14 +17,27 @@ import { Language } from "../Language";
17
17
  import { BlockStatement, PrintHint, StringExpression, NamedMethodSignature, ProxyStatement, ExpressionStatement } from "./LanguageWriter";
18
18
  import { RuntimeType } from "./common";
19
19
  import { generatorConfiguration, generatorTypePrefix } from "../config";
20
- import { capitalize, getExtractor, getTransformer, hashCodeFromString, throwException, warn } from "../util";
21
- import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
20
+ import { getTransformer } from "../LibraryInterface";
21
+ import { capitalize, hashCodeFromString, throwException, warn } from "../util";
22
22
  import { CppConvertor, CppNameConvertor } from "./convertors/CppConvertors";
23
23
  import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
24
24
  import { LayoutNodeRole } from "../peer-generation/LayoutManager";
25
25
  import { isInExternalModule } from "../peer-generation/modules";
26
+ import { getExtractor } from "../peer-generation/Extractors";
27
+ import { maybeRestoreGenerics, maybeRestoreThrows, maybeTransformManagedCallback } from "../transformers/transformUtils";
28
+ import { convertType, withInsideInstanceof } from "./nameConvertor";
29
+ import { collapseTypes } from "../peer-generation/idl/common";
26
30
  export function getSerializerName(_library, _language, declaration) {
27
- return `${idl.getQualifiedName(declaration, "package.namespace.name").split('.').map(capitalize).join('')}SerializerImpl`;
31
+ return idl.entryToFunctionName(_language, declaration, "", "SerializerImpl");
32
+ }
33
+ export function makeETSDiscriminatorFromFields(self, convertor, value, accessors, duplicates) {
34
+ if (convertor instanceof AggregateConvertor
35
+ || convertor instanceof InterfaceConvertor
36
+ || convertor instanceof MaterializedClassConvertor
37
+ || convertor instanceof CustomTypeConvertor) {
38
+ return self.instanceOf(value, convertor.idlType);
39
+ }
40
+ return self.makeString(`${value} instanceof ${withInsideInstanceof(true, () => convertor.targetType(self))}`);
28
41
  }
29
42
  export class BaseArgConvertor {
30
43
  constructor(idlType, runtimeTypes, isScoped, useArray, param) {
@@ -607,7 +620,7 @@ export class ArrayConvertor extends BaseArgConvertor {
607
620
  }
608
621
  export class MapConvertor extends BaseArgConvertor {
609
622
  constructor(library, param, type, keyType, valueType) {
610
- super(idl.createContainerType('record', [keyType, valueType]), [RuntimeType.OBJECT], false, true, param);
623
+ super(idl.createContainerType('record', [keyType, valueType], { extendedAttributes: type.extendedAttributes }), [RuntimeType.OBJECT], false, true, param);
611
624
  this.library = library;
612
625
  this.keyType = keyType;
613
626
  this.valueType = valueType;
@@ -878,7 +891,7 @@ export class UnionConvertor extends BaseArgConvertor {
878
891
  return false;
879
892
  }
880
893
  convertorSerialize(param, value, printer) {
881
- const convertorItems = this.memberConvertors.map((it, index) => new ConvertorItem(it, index, it.idlType));
894
+ const convertorItems = this.memberConvertors.map((it, index) => new ConvertorItem(it, index, getSourceType(it)));
882
895
  if (this.isIndexedDiscriminator(printer))
883
896
  return printer.makeMultiBranchCondition(convertorItems.map(it => this.makeBranch(param, value, printer, it)));
884
897
  // Make arrays type descrimination
@@ -897,11 +910,12 @@ export class UnionConvertor extends BaseArgConvertor {
897
910
  statements.push(this.makeStoreSelector(param, index, printer));
898
911
  if (!(convertor instanceof UndefinedConvertor)) {
899
912
  const varName = `${value}ForIdx${index}`;
900
- statements.push(printer.makeAssign(varName, undefined, printer.makeUnionVariantCast(convertor.getObjectAccessor(printer.language, value), printer.getNodeName(convertor.idlType), convertor, index), true));
913
+ statements.push(printer.makeAssign(varName, undefined, printer.makeUnionVariantCast(convertor.getObjectAccessor(printer.language, value), printer.getNodeName(getSourceType(convertor)), convertor, index), true));
901
914
  statements.push(convertor.convertorSerialize(param, varName, printer));
902
915
  }
916
+ const genericDiscriminator = withGenericDiscriminator(this.library, this.memberConvertors, value, discriminator, type, printer);
903
917
  const stmt = new BlockStatement(statements, false);
904
- return { expr: discriminator, stmt };
918
+ return { expr: genericDiscriminator, stmt };
905
919
  }
906
920
  makeArrayBranch(param, value, printer, arrayConvertorItems) {
907
921
  if (arrayConvertorItems.length == 0)
@@ -976,6 +990,55 @@ export class UnionConvertor extends BaseArgConvertor {
976
990
  return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => this.unionChecker.makeDiscriminator(value, n, writer, this.library)));
977
991
  }
978
992
  }
993
+ export class ThrowsConvertor extends BaseArgConvertor {
994
+ constructor(library, param, decl) {
995
+ super(idl.createReferenceType(decl), [RuntimeType.OBJECT], false, true, param);
996
+ this.library = library;
997
+ this.decl = decl;
998
+ const restoredThrow = maybeRestoreThrows(decl, library);
999
+ this.convertor = restoredThrow !== idl.IDLVoidType && restoredThrow !== idl.IDLThisType ? library.typeConvertor(param, restoredThrow) : undefined;
1000
+ }
1001
+ convertorArg(param, writer) {
1002
+ throw new Error("Method not implemented.");
1003
+ }
1004
+ convertorSerialize(param, value, writer) {
1005
+ var _a;
1006
+ if (writer.language === Language.CPP) {
1007
+ return writer.makeBlock([
1008
+ writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, 'writeBoolean', [writer.makeString(`${value}.hasException`)])),
1009
+ writer.makeCondition(writer.makeString(`${value}.hasException`), writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, 'writeException', [writer.makeString(`${value}.exception`)])), !this.convertor ? undefined : writer.makeBlock([
1010
+ writer.makeAssign(`${value}Value`, undefined, writer.makeString(`${value}.value`), true),
1011
+ (_a = this.convertor) === null || _a === void 0 ? void 0 : _a.convertorSerialize(param, `${value}Value`, writer),
1012
+ ]))
1013
+ ]);
1014
+ }
1015
+ else {
1016
+ throw new Error("Not expected to serialize exceptions in managed, currently they're only one directional from native to managed");
1017
+ }
1018
+ }
1019
+ convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1020
+ var _a;
1021
+ if (writer.language === Language.CPP) {
1022
+ throw new Error("Not expected to deserialize exceptions in CPP, currently they're only one directional from native to managed");
1023
+ }
1024
+ else {
1025
+ return writer.makeCondition(writer.makeMethodCall(deserializerName, 'readBoolean', []), writer.makeBlock([
1026
+ writer.makeThrowError(writer.makeMethodCall(deserializerName, 'readException', [])),
1027
+ ]), !this.convertor ? undefined : writer.makeBlock([
1028
+ (_a = this.convertor) === null || _a === void 0 ? void 0 : _a.convertorDeserialize(bufferName, deserializerName, assigneer, writer),
1029
+ ]));
1030
+ }
1031
+ }
1032
+ nativeType() {
1033
+ return idl.createReferenceType(this.decl);
1034
+ }
1035
+ interopType() {
1036
+ throw new Error("ThrowsConvertor");
1037
+ }
1038
+ isPointerType() {
1039
+ return true;
1040
+ }
1041
+ }
979
1042
  export class FunctionConvertor extends BaseArgConvertor {
980
1043
  constructor(library, param) {
981
1044
  // TODO: pass functions as integers to native side.
@@ -1158,7 +1221,7 @@ export class CallbackConvertor extends BaseArgConvertor {
1158
1221
  }),
1159
1222
  ];
1160
1223
  }
1161
- const result = writer.makeLambda(callbackSignature, [
1224
+ const closure = writer.makeLambda(callbackSignature, [
1162
1225
  writer.makeAssign(`${argsSerializer}Serializer`, idl.createReferenceType('idlize.internal.SerializerBase'), writer.makeMethodCall('SerializerBase', 'hold', []), true),
1163
1226
  new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writeInt32`, [writer.makeString(`${resourceName}.resourceId`)])),
1164
1227
  new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writePointer`, [writer.makeString(callName)])),
@@ -1190,9 +1253,14 @@ export class CallbackConvertor extends BaseArgConvertor {
1190
1253
  writer.makeString(continuationValueName), this.decl.returnType)
1191
1254
  : undefined),
1192
1255
  ]);
1256
+ writer.addFeature(idl.createReferenceType('idlize.internal.resourceFinalizerRegister'));
1257
+ statements.push(writer.makeAssign(`${bufferName}Closure`, undefined, closure, true), writer.makeStatement(writer.makeFunctionCall(`resourceFinalizerRegister`, [
1258
+ writer.makeString(`${bufferName}Closure`),
1259
+ writer.makeString(resourceName)
1260
+ ])));
1193
1261
  return writer.makeBlock([
1194
1262
  ...statements,
1195
- assigneer(result)
1263
+ assigneer(writer.makeString(`${bufferName}Closure`))
1196
1264
  ], false);
1197
1265
  }
1198
1266
  nativeType() {
@@ -1240,11 +1308,6 @@ export function generateCallbackAPIArguments(library, callback) {
1240
1308
  }
1241
1309
  return args;
1242
1310
  }
1243
- export function maybeTransformManagedCallback(callback, library) {
1244
- if (callback.name === "CustomBuilder")
1245
- return library.resolveTypeReference(idl.createReferenceType("arkui.component.idlize.CustomNodeBuilder"));
1246
- return undefined;
1247
- }
1248
1311
  class PromiseOutArgConvertor extends BaseArgConvertor {
1249
1312
  constructor(library, param, promise) {
1250
1313
  super(library.createContinuationCallbackReference(promise), [RuntimeType.FUNCTION], false, true, param);
@@ -1287,14 +1350,21 @@ class PromiseOutArgConvertor extends BaseArgConvertor {
1287
1350
  }
1288
1351
  }
1289
1352
  export class TransformOnSerializeConvertor extends BaseArgConvertor {
1290
- constructor(param, library, managedDeclaration, target) {
1353
+ constructor(param, library, managedDeclaration, source, target) {
1291
1354
  const targetConvertor = library.typeConvertor(param, target);
1292
1355
  super(target, targetConvertor.runtimeTypes, false, targetConvertor.useArray, param);
1293
1356
  this.library = library;
1294
1357
  this.managedDeclaration = managedDeclaration;
1358
+ this.source = source;
1295
1359
  this.target = target;
1296
1360
  this.targetConvertor = targetConvertor;
1297
1361
  }
1362
+ getSourceType() {
1363
+ return this.source;
1364
+ }
1365
+ getTargetType() {
1366
+ return this.target;
1367
+ }
1298
1368
  isPointerType() {
1299
1369
  return this.targetConvertor.isPointerType();
1300
1370
  }
@@ -1304,6 +1374,11 @@ export class TransformOnSerializeConvertor extends BaseArgConvertor {
1304
1374
  convertorArg(param, writer) {
1305
1375
  throw new Error("Method not implemented.");
1306
1376
  }
1377
+ addImport(transformerInfo, writer) {
1378
+ transformerInfo.ns
1379
+ ? writer.addFeature(transformerInfo.ns, transformerInfo.module)
1380
+ : writer.addFeature(transformerInfo.method, transformerInfo.module);
1381
+ }
1307
1382
  convertorSerialize(param, value, writer) {
1308
1383
  if (writer.language === Language.CPP) {
1309
1384
  return this.targetConvertor.convertorSerialize(param, value, writer);
@@ -1312,8 +1387,9 @@ export class TransformOnSerializeConvertor extends BaseArgConvertor {
1312
1387
  writer.addFeature(this.target);
1313
1388
  }
1314
1389
  const transformerInfo = getTransformer(this.library, this.managedDeclaration, this.target);
1315
- const transformCallExpression = transformerInfo.receiver
1316
- ? writer.makeMethodCall(transformerInfo.receiver, transformerInfo.method, [writer.makeString(value)])
1390
+ this.addImport(transformerInfo, writer);
1391
+ const transformCallExpression = transformerInfo.ns
1392
+ ? writer.makeMethodCall(transformerInfo.ns, transformerInfo.method, [writer.makeString(value)])
1317
1393
  : writer.makeFunctionCall(transformerInfo.method, [writer.makeString(value)]);
1318
1394
  const statements = [
1319
1395
  writer.makeAssign(`${value}Transformed`, this.target, transformCallExpression, true),
@@ -1330,8 +1406,9 @@ export class TransformOnSerializeConvertor extends BaseArgConvertor {
1330
1406
  }
1331
1407
  const targetDeserialize = this.targetConvertor.convertorDeserialize(`${bufferName}D`, deserializerName, (expr) => writer.makeAssign(`${bufferName}Deserialized`, this.target, expr, true), writer);
1332
1408
  const transformerInfo = getTransformer(this.library, this.target, this.managedDeclaration);
1333
- const transformCallExpression = transformerInfo.receiver
1334
- ? writer.makeMethodCall(transformerInfo.receiver, transformerInfo.method, [writer.makeString(`${bufferName}Deserialized`)])
1409
+ this.addImport(transformerInfo, writer);
1410
+ const transformCallExpression = transformerInfo.ns
1411
+ ? writer.makeMethodCall(transformerInfo.ns, transformerInfo.method, [writer.makeString(`${bufferName}Deserialized`)])
1335
1412
  : writer.makeFunctionCall(transformerInfo.method, [writer.makeString(`${bufferName}Deserialized`)]);
1336
1413
  return writer.makeBlock([
1337
1414
  targetDeserialize,
@@ -1349,4 +1426,124 @@ export function createOutArgConvertor(library, type, otherParams) {
1349
1426
  }
1350
1427
  return undefined;
1351
1428
  }
1429
+ function withGenericDiscriminator(library, convertors, value, discriminator, type, writer) {
1430
+ if (writer.language == Language.CPP)
1431
+ return discriminator;
1432
+ if (!idl.isReferenceType(type))
1433
+ return discriminator;
1434
+ const mayBeGeneric = maybeRestoreGenerics(type, writer.resolver);
1435
+ if (mayBeGeneric == undefined)
1436
+ return discriminator;
1437
+ const count = convertors
1438
+ .map(it => it.idlType)
1439
+ .filter(it => idl.isReferenceType(it))
1440
+ .map(it => idl.isReferenceType(it) ? maybeRestoreGenerics(it, writer.resolver) : undefined)
1441
+ .filter(it => it && idl.isReferenceType(it) && it.name == mayBeGeneric.name)
1442
+ .length;
1443
+ if (count < 2)
1444
+ return discriminator;
1445
+ writer.addFeature("typechecks", library.layout.handwrittenPackage());
1446
+ const decl = writer.resolver.resolveTypeReference(type);
1447
+ const checkGenericFunc = idl.entryToFunctionName(writer.language, decl, "isGeneric_", "");
1448
+ return writer.makeAnd(discriminator, writer.makeFunctionCall(`typechecks.${checkGenericFunc}`, [writer.makeString(value)]));
1449
+ }
1450
+ export class UnionFlattener {
1451
+ constructor(resolver) {
1452
+ this.resolver = resolver;
1453
+ }
1454
+ convertImport(type) {
1455
+ console.warn("Imports are not implemented yet");
1456
+ return [];
1457
+ }
1458
+ convertUnion(type) {
1459
+ return type.types.flatMap(it => convertType(this, it));
1460
+ }
1461
+ convertTypeReference(type) {
1462
+ const decl = this.resolver.toDeclaration(type);
1463
+ return idl.isType(decl) && decl !== idl.IDLCustomObjectType ? convertType(this, decl) : [type];
1464
+ }
1465
+ convertOptional(type) {
1466
+ return [type.type, idl.IDLUndefinedType];
1467
+ }
1468
+ convertContainer(type) {
1469
+ return [type];
1470
+ }
1471
+ convertTypeReferenceAsImport(type, importClause) {
1472
+ return [type];
1473
+ }
1474
+ convertPrimitiveType(type) {
1475
+ return [type];
1476
+ }
1477
+ convertTypeParameter(type) {
1478
+ return [type];
1479
+ }
1480
+ }
1481
+ export class UnionRuntimeTypeChecker {
1482
+ constructor(convertors) {
1483
+ this.convertors = convertors;
1484
+ this.conflictingConvertors = new Set();
1485
+ this.duplicateMembers = new Set();
1486
+ this.checkConflicts();
1487
+ }
1488
+ checkConflicts() {
1489
+ const runtimeTypeConflicts = new Map();
1490
+ this.convertors.forEach(conv => {
1491
+ conv.runtimeTypes.forEach(rtType => {
1492
+ const convertors = runtimeTypeConflicts.get(rtType);
1493
+ if (convertors)
1494
+ convertors.push(conv);
1495
+ else
1496
+ runtimeTypeConflicts.set(rtType, [conv]);
1497
+ });
1498
+ });
1499
+ runtimeTypeConflicts.forEach((convertors, rtType) => {
1500
+ if (convertors.length > 1) {
1501
+ const allMembers = new Set();
1502
+ if (rtType === RuntimeType.OBJECT) {
1503
+ convertors.forEach(convertor => {
1504
+ convertor.getMembers().forEach(member => {
1505
+ if (allMembers.has(member))
1506
+ this.duplicateMembers.add(member);
1507
+ allMembers.add(member);
1508
+ });
1509
+ });
1510
+ }
1511
+ convertors.forEach(convertor => {
1512
+ this.conflictingConvertors.add(convertor);
1513
+ });
1514
+ }
1515
+ });
1516
+ }
1517
+ makeDiscriminator(value, convertorIndex, writer, library, type) {
1518
+ let convertor = this.convertors[convertorIndex];
1519
+ if (writer.language === Language.TS) {
1520
+ const isArray = idl.IDLContainerUtils.isSequence(convertor.idlType);
1521
+ if (isArray || this.conflictingConvertors.has(convertor)) {
1522
+ // Check elements inside array
1523
+ if (type && convertor.idlType != type) {
1524
+ convertor = library.typeConvertor("", type);
1525
+ }
1526
+ const discriminator = convertor.unionDiscriminator(value, convertorIndex, writer, this.duplicateMembers);
1527
+ if (discriminator)
1528
+ return discriminator;
1529
+ }
1530
+ }
1531
+ return writer.makeString(writer.discriminate(value, convertorIndex, type !== null && type !== void 0 ? type : convertor.idlType, convertor.runtimeTypes));
1532
+ }
1533
+ }
1534
+ export function flattenUnionType(library, type) {
1535
+ if (idl.isUnionType(type)) {
1536
+ const unionFlattener = new UnionFlattener(library);
1537
+ const allTypes = type.types.flatMap(it => convertType(unionFlattener, it));
1538
+ const uniqueTypes = new Set(allTypes);
1539
+ return uniqueTypes.size === allTypes.length ? type : collapseTypes(Array.from(uniqueTypes));
1540
+ }
1541
+ return type;
1542
+ }
1543
+ function getSourceType(convertor) {
1544
+ if (convertor instanceof TransformOnSerializeConvertor) {
1545
+ return convertor.getSourceType();
1546
+ }
1547
+ return convertor.idlType;
1548
+ }
1352
1549
  //# sourceMappingURL=ArgConvertors.js.map
@@ -168,8 +168,10 @@ export declare enum MethodModifier {
168
168
  THROWS = 8,
169
169
  FREE = 9,
170
170
  FORCE_CONTEXT = 10,
171
- OVERRIDE = 11
171
+ OVERRIDE = 11,
172
+ OPEN = 12
172
173
  }
174
+ export declare const METHOD_ACCESS_MODIFIERS: Set<MethodModifier>;
173
175
  export declare enum ClassModifier {
174
176
  PUBLIC = 0,
175
177
  PRIVATE = 1,
@@ -287,7 +289,7 @@ export declare abstract class LanguageWriter {
287
289
  abstract writeImports(moduleName: string, importedFeatures: string[], aliases: string[]): void;
288
290
  abstract makeAssign(variableName: string, type: idl.IDLType | undefined, expr: LanguageExpression | undefined, isDeclared: boolean, isConst?: boolean, options?: MakeAssignOptions): LanguageStatement;
289
291
  abstract makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
290
- abstract makeThrowError(message: string): LanguageStatement;
292
+ abstract makeThrowError(message: string | LanguageExpression): LanguageStatement;
291
293
  abstract makeReturn(expr?: LanguageExpression): LanguageStatement;
292
294
  abstract makeRuntimeType(rt: RuntimeType): LanguageExpression;
293
295
  abstract getObjectAccessor(convertor: ArgConvertor, value: string, args?: ObjectArgs): string;
@@ -326,7 +328,8 @@ export declare abstract class LanguageWriter {
326
328
  writeStatements(...statements: LanguageStatement[]): void;
327
329
  writeExpressionStatement(smth: LanguageExpression): void;
328
330
  writeExpressionStatements(...statements: LanguageExpression[]): void;
329
- writeStaticBlock(op: (writer: this) => void): void;
331
+ writePrefixedBlock(prefix: string, op: (writer: this) => void): void;
332
+ writeStaticInitBlock(op: (writer: this) => void): void;
330
333
  makeRef(type: idl.IDLType, _options?: MakeRefOptions): idl.IDLType;
331
334
  makeThis(): LanguageExpression;
332
335
  makeNull(type?: idl.IDLOptionalType): LanguageExpression;
@@ -337,6 +340,8 @@ export declare abstract class LanguageWriter {
337
340
  makeNewObject(objectName: string, params?: LanguageExpression[]): LanguageExpression;
338
341
  makeFunctionCall(name: string | LanguageExpression, params: LanguageExpression[]): LanguageExpression;
339
342
  makeMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
343
+ makeFunctionReference(name: string): LanguageExpression;
344
+ makeMethodReference(receiver: string, method: string): LanguageExpression;
340
345
  makeThisCall(params: LanguageExpression[]): LanguageExpression;
341
346
  makeStaticMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
342
347
  makeFieldAccess(receiver: string, method: string, nullable?: boolean): LanguageExpression;
@@ -387,12 +392,14 @@ export declare abstract class LanguageWriter {
387
392
  makeHasOwnProperty(value: string, property: string, propertyTypeName?: string): LanguageExpression;
388
393
  discriminate(value: string, index: number, type: idl.IDLType, runtimeTypes: RuntimeType[]): string;
389
394
  makeNot(expr: LanguageExpression): LanguageExpression;
395
+ makeAnd(...args: LanguageExpression[]): LanguageExpression;
396
+ makeOr(...args: LanguageExpression[]): LanguageExpression;
390
397
  makeSerializedBufferGetter(serializer: string): LanguageExpression;
391
398
  makeEquals(args: LanguageExpression[]): LanguageExpression;
392
399
  castToInt(value: string, bitness: 8 | 32): string;
393
400
  castToBoolean(value: string): string;
394
401
  makeCallIsObject(value: string): LanguageExpression;
395
- makeStaticBlock(op: (writer: LanguageWriter) => void): void;
402
+ writeStaticEntitiesBlock(op: (writer: LanguageWriter) => void): void;
396
403
  instanceOf(value: string, type: idl.IDLType): LanguageExpression;
397
404
  typeInstanceOf(type: idl.IDLEntry, value: string, members?: string[]): LanguageExpression;
398
405
  /**
@@ -434,5 +441,6 @@ export type MakeAssignOptions = {
434
441
  overrideTypeName?: string;
435
442
  };
436
443
  export type ExpressionAssigner = (expression: LanguageExpression) => LanguageStatement;
444
+ export declare function hasAccessModifier(modifiers: MethodModifier[] | undefined): boolean;
437
445
  export {};
438
446
  //# sourceMappingURL=LanguageWriter.d.ts.map
@@ -337,7 +337,13 @@ export var MethodModifier;
337
337
  MethodModifier[MethodModifier["FREE"] = 9] = "FREE";
338
338
  MethodModifier[MethodModifier["FORCE_CONTEXT"] = 10] = "FORCE_CONTEXT";
339
339
  MethodModifier[MethodModifier["OVERRIDE"] = 11] = "OVERRIDE";
340
+ MethodModifier[MethodModifier["OPEN"] = 12] = "OPEN";
340
341
  })(MethodModifier || (MethodModifier = {}));
342
+ export const METHOD_ACCESS_MODIFIERS = new Set([
343
+ MethodModifier.PUBLIC,
344
+ MethodModifier.PRIVATE,
345
+ MethodModifier.PROTECTED
346
+ ]);
341
347
  export var ClassModifier;
342
348
  (function (ClassModifier) {
343
349
  ClassModifier[ClassModifier["PUBLIC"] = 0] = "PUBLIC";
@@ -496,13 +502,16 @@ export class LanguageWriter {
496
502
  writeExpressionStatements(...statements) {
497
503
  statements.forEach(it => this.writeExpressionStatement(it));
498
504
  }
499
- writeStaticBlock(op) {
500
- this.print("static {");
505
+ writePrefixedBlock(prefix, op) {
506
+ this.print(`${prefix} {`);
501
507
  this.pushIndent();
502
508
  op(this);
503
509
  this.popIndent();
504
510
  this.print("}");
505
511
  }
512
+ writeStaticInitBlock(op) {
513
+ this.writePrefixedBlock("static", op);
514
+ }
506
515
  makeRef(type, _options) {
507
516
  return type;
508
517
  }
@@ -537,6 +546,12 @@ export class LanguageWriter {
537
546
  makeMethodCall(receiver, method, params, nullable) {
538
547
  return new MethodCallExpression(receiver, method, params, nullable);
539
548
  }
549
+ makeFunctionReference(name) {
550
+ return this.makeString(name);
551
+ }
552
+ makeMethodReference(receiver, method) {
553
+ return this.makeString(`${receiver}.${method}`);
554
+ }
540
555
  // Deprecated
541
556
  // Use instead declarationCall parameter in writeConstructorImplementation(...) with DelegationType.THIS
542
557
  makeThisCall(params) {
@@ -683,6 +698,12 @@ export class LanguageWriter {
683
698
  makeNot(expr) {
684
699
  return this.makeString(`!(${expr.asString()})`);
685
700
  }
701
+ makeAnd(...args) {
702
+ return this.makeNaryOp("&&", args);
703
+ }
704
+ makeOr(...args) {
705
+ return this.makeNaryOp("||", args);
706
+ }
686
707
  makeSerializedBufferGetter(serializer) {
687
708
  return this.makeMethodCall(serializer, `asBuffer`, []);
688
709
  }
@@ -694,7 +715,7 @@ export class LanguageWriter {
694
715
  makeCallIsObject(value) {
695
716
  return this.makeString(`typeof ${value} === "object"`);
696
717
  }
697
- makeStaticBlock(op) {
718
+ writeStaticEntitiesBlock(op) {
698
719
  op(this);
699
720
  }
700
721
  instanceOf(value, type) {
@@ -753,4 +774,8 @@ export function copyMethod(method, overrides) {
753
774
  var _a, _b, _c, _d;
754
775
  return new Method((_a = overrides.name) !== null && _a !== void 0 ? _a : method.name, (_b = overrides.signature) !== null && _b !== void 0 ? _b : method.signature, (_c = overrides.modifiers) !== null && _c !== void 0 ? _c : method.modifiers, (_d = overrides.generics) !== null && _d !== void 0 ? _d : method.generics);
755
776
  }
777
+ export function hasAccessModifier(modifiers) {
778
+ const modifier = modifiers === null || modifiers === void 0 ? void 0 : modifiers.find(value => METHOD_ACCESS_MODIFIERS.has(value));
779
+ return modifier !== undefined;
780
+ }
756
781
  //# sourceMappingURL=LanguageWriter.js.map
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import * as idl from '../../idl';
16
16
  import { CJKeywords } from '../../languageSpecificKeywords';
17
- import { generateSyntheticIdlNodeName } from '../../peer-generation/idl/common';
17
+ import { maybeRestoreThrows } from '../../transformers/transformUtils';
18
18
  import { removePoints } from '../../util';
19
19
  import { convertNode, convertType } from '../nameConvertor';
20
20
  import { InteropArgConvertor } from './InteropConvertors';
@@ -35,7 +35,7 @@ export class CJTypeNameConvertor {
35
35
  return `Option<${this.convert(type.type)}>`;
36
36
  }
37
37
  convertUnion(type) {
38
- return "Union_" + type.types.map(it => generateSyntheticIdlNodeName(it)).join("_");
38
+ return "Union_" + type.types.map(it => idl.generateSyntheticIdlNodeName(it)).join("_");
39
39
  }
40
40
  convertContainer(type) {
41
41
  if (idl.IDLContainerUtils.isSequence(type)) {
@@ -96,6 +96,10 @@ export class CJTypeNameConvertor {
96
96
  return "KPointer";
97
97
  // resolve synthetic types
98
98
  const decl = this.resolver.resolveTypeReference(type);
99
+ let restoredThrow;
100
+ if (restoredThrow = maybeRestoreThrows(decl, this.resolver)) {
101
+ return this.convert(restoredThrow);
102
+ }
99
103
  if (decl && idl.isSyntheticEntry(decl)) {
100
104
  if (idl.isCallback(decl)) {
101
105
  return this.callbackType(decl);
@@ -17,11 +17,11 @@ import { generatorConfiguration } from "../../config";
17
17
  import { convertNode, convertType } from "../nameConvertor";
18
18
  import { PrimitiveTypesInstance } from '../../peer-generation/PrimitiveType';
19
19
  import { InteropArgConvertor } from './InteropConvertors';
20
- import { maybeTransformManagedCallback } from '../ArgConvertors';
21
20
  import { qualifiedName } from '../../peer-generation/idl/common';
22
21
  import { isInIdlizeInternal } from '../../idl';
23
22
  import { isTopLevelConflicted } from '../../peer-generation/ConflictingDeclarations';
24
23
  import { Language } from '../../Language';
24
+ import { maybeRestoreThrows, maybeTransformManagedCallback } from '../../transformers/transformUtils';
25
25
  function isSubtypeTopLevelConflicted(library, node) {
26
26
  let hasConflicts = false;
27
27
  idl.forEachChild(node, (child) => {
@@ -49,6 +49,12 @@ export class GenericCppConvertor {
49
49
  throw new Error("Internal error: namespaces are not allowed on the interop layer");
50
50
  }
51
51
  convertInterface(node) {
52
+ let restoredThrow;
53
+ if (restoredThrow = maybeRestoreThrows(node, this.library)) {
54
+ if (restoredThrow === idl.IDLThisType)
55
+ restoredThrow = idl.IDLVoidType;
56
+ return this.make(`Throws_${this.convertNode(restoredThrow).text}`, idl.createReferenceType(node), true);
57
+ }
52
58
  switch (node.subkind) {
53
59
  case idl.IDLInterfaceSubkind.AnonymousInterface:
54
60
  return node.name
@@ -34,6 +34,9 @@ export class ETSTypeNameConvertor extends TSTypeNameConvertor {
34
34
  if (idl.IDLContainerUtils.isSequence(type)) {
35
35
  return isInsideInstanceof() ? `Array` : `Array<${this.convert(type.elementType[0])}>`;
36
36
  }
37
+ if (idl.IDLContainerUtils.isRecord(type) && idl.hasExtAttribute(type, idl.IDLExtendedAttributes.AsRecord)) {
38
+ return isInsideInstanceof() ? 'Record' : `Record<${this.convert(type.elementType[0])}, ${this.convert(type.elementType[1])}>`;
39
+ }
37
40
  return super.convertContainer(type);
38
41
  }
39
42
  convertPrimitiveType(type) {