@idlizer/core 2.1.10-arktscgen-3 → 2.1.10-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 (39) hide show
  1. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +14 -2
  2. package/build/lib/src/LanguageWriters/ArgConvertors.js +60 -8
  3. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +11 -3
  4. package/build/lib/src/LanguageWriters/LanguageWriter.js +11 -5
  5. package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +1 -1
  6. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +9 -1
  7. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +3 -1
  8. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +12 -16
  9. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +1 -1
  10. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +1 -1
  11. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +0 -3
  12. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +2 -2
  13. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +15 -2
  14. package/build/lib/src/config.d.ts +760 -0
  15. package/build/lib/src/config.js +7 -0
  16. package/build/lib/src/formatter.js +5 -2
  17. package/build/lib/src/from-idl/DtsPrinter.js +2 -2
  18. package/build/lib/src/from-idl/common.js +2 -2
  19. package/build/lib/src/from-idl/deserialize.d.ts +3 -7
  20. package/build/lib/src/from-idl/deserialize.js +64 -38
  21. package/build/lib/src/from-idl/parser.d.ts +1 -1
  22. package/build/lib/src/from-idl/parser.js +29 -20
  23. package/build/lib/src/idl.d.ts +9 -1
  24. package/build/lib/src/idl.js +56 -10
  25. package/build/lib/src/index.d.ts +3 -1
  26. package/build/lib/src/index.js +3 -1
  27. package/build/lib/src/languageSpecificKeywords.js +1 -1
  28. package/build/lib/src/peer-generation/PeerLibrary.js +14 -4
  29. package/build/lib/src/peer-generation/isMaterialized.js +1 -1
  30. package/build/lib/src/peer-generation/modules.d.ts +10 -0
  31. package/build/lib/src/peer-generation/modules.js +27 -2
  32. package/build/lib/src/transformers/GenericTransformer.js +70 -5
  33. package/build/lib/src/transformers/NullTransformer.d.ts +3 -0
  34. package/build/lib/src/transformers/NullTransformer.js +33 -0
  35. package/build/lib/src/transformers/OnSerializeTransformer.d.ts +3 -0
  36. package/build/lib/src/transformers/OnSerializeTransformer.js +19 -0
  37. package/build/lib/src/util.d.ts +5 -0
  38. package/build/lib/src/util.js +13 -2
  39. package/package.json +5 -5
@@ -265,9 +265,9 @@ export declare class CustomTypeConvertor extends BaseArgConvertor {
265
265
  isPointerType(): boolean;
266
266
  }
267
267
  export declare class OptionConvertor extends BaseArgConvertor {
268
- type: idl.IDLType;
268
+ type: idl.IDLOptionalType;
269
269
  private readonly typeConvertor;
270
- constructor(library: LibraryInterface, param: string, type: idl.IDLType);
270
+ constructor(library: LibraryInterface, param: string, type: idl.IDLOptionalType);
271
271
  convertorArg(param: string, writer: LanguageWriter): string;
272
272
  convertorSerialize(param: string, value: string, printer: LanguageWriter): LanguageStatement;
273
273
  convertorCArg(param: string): string;
@@ -343,5 +343,17 @@ export declare function generateCallbackKindAccess(callback: idl.IDLCallback, la
343
343
  export declare function generateCallbackKindValue(callback: idl.IDLCallback): number;
344
344
  export declare function generateCallbackAPIArguments(library: LibraryInterface, callback: idl.IDLCallback): string[];
345
345
  export declare function maybeTransformManagedCallback(callback: idl.IDLCallback, library: ReferenceResolver): idl.IDLCallback | undefined;
346
+ export declare class TransformOnSerializeConvertor extends BaseArgConvertor {
347
+ protected library: PeerLibrary;
348
+ protected managedDeclaration: idl.IDLEntry;
349
+ protected target: idl.IDLType;
350
+ private targetConvertor;
351
+ constructor(param: string, library: PeerLibrary, managedDeclaration: idl.IDLEntry, target: idl.IDLType);
352
+ isPointerType(): boolean;
353
+ nativeType(): idl.IDLType;
354
+ convertorArg(param: string, writer: LanguageWriter): string;
355
+ convertorSerialize(param: string, value: string, writer: LanguageWriter): LanguageStatement;
356
+ convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
357
+ }
346
358
  export declare function createOutArgConvertor(library: PeerLibrary, type: idl.IDLType | undefined, otherParams: string[]): ArgConvertor | undefined;
347
359
  //# sourceMappingURL=ArgConvertors.d.ts.map
@@ -17,7 +17,7 @@ import { Language } from "../Language";
17
17
  import { BlockStatement, PrintHint, StringExpression, MethodModifier, NamedMethodSignature, ProxyStatement, ExpressionStatement } from "./LanguageWriter";
18
18
  import { RuntimeType } from "./common";
19
19
  import { generatorConfiguration, generatorTypePrefix } from "../config";
20
- import { capitalize, getExtractor, hashCodeFromString, throwException, warn } from "../util";
20
+ import { capitalize, getExtractor, getTransformer, hashCodeFromString, throwException, warn } from "../util";
21
21
  import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
22
22
  import { CppConvertor, CppNameConvertor } from "./convertors/CppConvertors";
23
23
  import { createEmptyReferenceResolver } from "../peer-generation/ReferenceResolver";
@@ -579,7 +579,7 @@ export class InterfaceConvertor extends BaseArgConvertor {
579
579
  convertorSerialize(param, value, writer) {
580
580
  const accessor = getSerializerName(this.declaration);
581
581
  writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
582
- return writer.makeStatement(writer.makeStaticMethodCall(accessor, 'write', [writer.makeString(`${param}Serializer`), writer.makeString(value)]));
582
+ return writer.makeStatement(writer.makeStaticMethodCall(accessor, 'write', [writer.makeString(`${param}Serializer`), writer.makeString(writer.escapeKeyword(value))]));
583
583
  }
584
584
  convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
585
585
  const accessor = getSerializerName(this.declaration);
@@ -851,7 +851,7 @@ export class CustomTypeConvertor extends BaseArgConvertor {
851
851
  export class OptionConvertor extends BaseArgConvertor {
852
852
  // TODO: be smarter here, and for smth like Length|undefined or number|undefined pass without serializer.
853
853
  constructor(library, param, type) {
854
- let conv = library.typeConvertor(param, type);
854
+ let conv = library.typeConvertor(param, type.type);
855
855
  let currentConv = conv;
856
856
  while (currentConv instanceof ProxyConvertor) {
857
857
  currentConv = currentConv.convertor;
@@ -872,7 +872,7 @@ export class OptionConvertor extends BaseArgConvertor {
872
872
  }
873
873
  convertorSerialize(param, value, printer) {
874
874
  const valueValue = `${value}TmpValue`.replaceAll('.', '_');
875
- return printer.makeCondition(printer.makeDefinedCheck(value), new BlockStatement([
875
+ return printer.makeCondition(printer.makeDefinedCheck(value, this.type), new BlockStatement([
876
876
  printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.OBJECT)])),
877
877
  printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true),
878
878
  this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer)
@@ -886,7 +886,7 @@ export class OptionConvertor extends BaseArgConvertor {
886
886
  const statements = [];
887
887
  statements.push(writer.makeAssign(runtimeBufferName, undefined, writer.makeCast(writer.makeString(`${deserializerName}.readInt8()`), writer.getRuntimeType()), true));
888
888
  const bufferType = this.nativeType();
889
- statements.push(writer.makeAssign(bufferName, bufferType, (writer.language == Language.CJ || writer.language == Language.KOTLIN) ? writer.makeNull(bufferName) : undefined, true, false)); // maybe change to generic None
889
+ statements.push(writer.makeAssign(bufferName, bufferType, writer.language === Language.CPP ? undefined : writer.makeNull(this.type), true, false)); // maybe change to generic None
890
890
  const thenStatement = new BlockStatement([
891
891
  this.typeConvertor.convertorDeserialize(`${bufferName}_`, deserializerName, (expr) => {
892
892
  const receiver = writer.language === Language.CPP
@@ -900,10 +900,10 @@ export class OptionConvertor extends BaseArgConvertor {
900
900
  return writer.makeBlock(statements, false);
901
901
  }
902
902
  nativeType() {
903
- return idl.createOptionalType(this.type);
903
+ return this.type;
904
904
  }
905
905
  interopType() {
906
- return idl.createOptionalType(this.type);
906
+ return this.type;
907
907
  }
908
908
  isPointerType() {
909
909
  return true;
@@ -1022,7 +1022,6 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
1022
1022
  case Language.CPP:
1023
1023
  return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
1024
1024
  case Language.JAVA:
1025
- case Language.KOTLIN:
1026
1025
  case Language.CJ:
1027
1026
  return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
1028
1027
  default:
@@ -1295,6 +1294,59 @@ class PromiseOutArgConvertor extends BaseArgConvertor {
1295
1294
  return true;
1296
1295
  }
1297
1296
  }
1297
+ export class TransformOnSerializeConvertor extends BaseArgConvertor {
1298
+ constructor(param, library, managedDeclaration, target) {
1299
+ const targetConvertor = library.typeConvertor(param, target);
1300
+ super(target, targetConvertor.runtimeTypes, false, targetConvertor.useArray, param);
1301
+ this.library = library;
1302
+ this.managedDeclaration = managedDeclaration;
1303
+ this.target = target;
1304
+ this.targetConvertor = targetConvertor;
1305
+ }
1306
+ isPointerType() {
1307
+ return this.targetConvertor.isPointerType();
1308
+ }
1309
+ nativeType() {
1310
+ return this.targetConvertor.nativeType();
1311
+ }
1312
+ convertorArg(param, writer) {
1313
+ throw new Error("Method not implemented.");
1314
+ }
1315
+ convertorSerialize(param, value, writer) {
1316
+ if (writer.language === Language.CPP) {
1317
+ return this.targetConvertor.convertorSerialize(param, value, writer);
1318
+ }
1319
+ if (idl.isReferenceType(this.target)) {
1320
+ writer.addFeature(this.target);
1321
+ }
1322
+ const transformerInfo = getTransformer(this.library, this.managedDeclaration, this.target);
1323
+ const transformCallExpression = transformerInfo.receiver
1324
+ ? writer.makeMethodCall(transformerInfo.receiver, transformerInfo.method, [writer.makeString(value)])
1325
+ : writer.makeFunctionCall(transformerInfo.method, [writer.makeString(value)]);
1326
+ const statements = [
1327
+ writer.makeAssign(`${value}Transformed`, this.target, transformCallExpression, true),
1328
+ this.targetConvertor.convertorSerialize(param, `${value}Transformed`, writer)
1329
+ ];
1330
+ return writer.makeBlock(statements, false);
1331
+ }
1332
+ convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
1333
+ if (writer.language === Language.CPP) {
1334
+ return this.targetConvertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
1335
+ }
1336
+ if (idl.isReferenceType(this.target)) {
1337
+ writer.addFeature(this.target);
1338
+ }
1339
+ const targetDeserialize = this.targetConvertor.convertorDeserialize(`${bufferName}D`, deserializerName, (expr) => writer.makeAssign(`${bufferName}Deserialized`, this.target, expr, true), writer);
1340
+ const transformerInfo = getTransformer(this.library, this.target, this.managedDeclaration);
1341
+ const transformCallExpression = transformerInfo.receiver
1342
+ ? writer.makeMethodCall(transformerInfo.receiver, transformerInfo.method, [writer.makeString(`${bufferName}Deserialized`)])
1343
+ : writer.makeFunctionCall(transformerInfo.method, [writer.makeString(`${bufferName}Deserialized`)]);
1344
+ return writer.makeBlock([
1345
+ targetDeserialize,
1346
+ assigneer(transformCallExpression)
1347
+ ], false);
1348
+ }
1349
+ }
1298
1350
  export function createOutArgConvertor(library, type, otherParams) {
1299
1351
  if (type && idl.isContainerType(type) && idl.IDLContainerUtils.isPromise(type)) {
1300
1352
  const param = (entropy) => `outputArgumentForReturningPromise${entropy || ''}`;
@@ -244,7 +244,15 @@ export declare abstract class LanguageWriter {
244
244
  language: Language);
245
245
  indentDepth(): number;
246
246
  maybeSemicolon(): string;
247
- features: [string, string][];
247
+ features: ({
248
+ type: "raw";
249
+ feature: string;
250
+ module: string;
251
+ } | {
252
+ type: "idl";
253
+ node: idl.IDLEntry | idl.IDLReferenceType;
254
+ })[];
255
+ addFeature(node: idl.IDLEntry | idl.IDLReferenceType): void;
248
256
  addFeature(feature: string, module: string): void;
249
257
  abstract writeClass(name: string, op: (writer: this) => void, superClass?: string, interfaces?: string[], generics?: string[], isDeclared?: boolean, isExport?: boolean): void;
250
258
  abstract writeEnum(name: string, members: {
@@ -316,7 +324,7 @@ export declare abstract class LanguageWriter {
316
324
  writeStaticBlock(op: (writer: this) => void): void;
317
325
  makeRef(type: idl.IDLType, _options?: MakeRefOptions): idl.IDLType;
318
326
  makeThis(): LanguageExpression;
319
- makeNull(value?: string): LanguageExpression;
327
+ makeNull(type?: idl.IDLOptionalType): LanguageExpression;
320
328
  makeVoid(): LanguageExpression;
321
329
  makeLambdaReturn(expr?: LanguageExpression): LanguageStatement;
322
330
  makeRuntimeTypeCondition(typeVarName: string, equals: boolean, type: RuntimeType, varName?: string): LanguageExpression;
@@ -330,7 +338,7 @@ export declare abstract class LanguageWriter {
330
338
  makeNativeCall(nativeModule: NativeModuleType, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
331
339
  makeBlock(statements: LanguageStatement[], inScope?: boolean): BlockStatement;
332
340
  nativeReceiver(nativeModule: NativeModuleType): string;
333
- abstract makeDefinedCheck(value: string, isTag?: boolean): LanguageExpression;
341
+ abstract makeDefinedCheck(value: string, type?: idl.IDLOptionalType, isTag?: boolean): LanguageExpression;
334
342
  makeRuntimeTypeDefinedCheck(runtimeType: string): LanguageExpression;
335
343
  makeCondition(condition: LanguageExpression, thenStatement: LanguageStatement, elseStatement?: LanguageStatement, insideIfOp?: () => void, insideElseOp?: () => void): LanguageStatement;
336
344
  makeMultiBranchCondition(conditions: BranchStatement[], elseStatement?: LanguageStatement): LanguageStatement;
@@ -278,8 +278,11 @@ export class LambdaExpression {
278
278
  if (this.body) {
279
279
  writer.writeStatement(new BlockStatement(this.body, isScoped, false));
280
280
  }
281
- writer.features.forEach(([feature, module]) => {
282
- this.originalWriter.addFeature(feature, module);
281
+ writer.features.forEach((feature) => {
282
+ if (feature.type === "raw")
283
+ this.originalWriter.addFeature(feature.feature, feature.module);
284
+ else
285
+ this.originalWriter.addFeature(feature.node);
283
286
  });
284
287
  return writer.getOutput()
285
288
  .map(line => (line.endsWith('{') || line.endsWith('}') || line.endsWith(';')) ? line : `${line};`)
@@ -421,8 +424,11 @@ export class LanguageWriter {
421
424
  return this.printer.indentDepth();
422
425
  }
423
426
  maybeSemicolon() { return ";"; }
424
- addFeature(feature, module) {
425
- this.features.push([feature, module]);
427
+ addFeature(featureOrNode, module) {
428
+ if (typeof featureOrNode === "string")
429
+ this.features.push({ type: "raw", feature: featureOrNode, module: module });
430
+ else
431
+ this.features.push({ type: "idl", node: featureOrNode });
426
432
  }
427
433
  // version of makeCast which uses TypeCheck.typeCast<T>(value) call for ETS language writer
428
434
  // Use it only if TypeChecker class is added as import to the generated file
@@ -488,7 +494,7 @@ export class LanguageWriter {
488
494
  makeThis() {
489
495
  return new StringExpression("this");
490
496
  }
491
- makeNull(value) {
497
+ makeNull(type) {
492
498
  return new StringExpression("null");
493
499
  }
494
500
  makeVoid() {
@@ -149,7 +149,7 @@ export class CJTypeNameConvertor {
149
149
  throw new Error(`Unsupported IDL primitive ${idl.DebugUtils.debugPrintType(type)}`);
150
150
  }
151
151
  callbackType(decl) {
152
- const params = decl.parameters.map(it => `${CJKeywords.has(it.name) ? it.name.concat("_") : it.name}: ${this.convert(it.type)}`);
152
+ const params = decl.parameters.map(it => `${CJKeywords.has(it.name) ? it.name.concat("_") : it.name}: ${it.isOptional ? "?" : ""}${this.convert(it.type)}`);
153
153
  return `((${params.join(", ")}) -> ${this.convert(decl.returnType)})`;
154
154
  }
155
155
  productType(decl, isTuple, includeFieldNames) {
@@ -46,7 +46,15 @@ export class TSTypeNameConvertor {
46
46
  return node.name;
47
47
  }
48
48
  convertOptional(type) {
49
- return `${this.convert(type.type)} | undefined`;
49
+ if (idl.hasExtAttribute(type, idl.IDLExtendedAttributes.UnionOnlyNull)) {
50
+ return `${this.convert(type.type)} | null`;
51
+ }
52
+ else if (idl.hasExtAttribute(type, idl.IDLExtendedAttributes.UnionWithNull)) {
53
+ return `${this.convert(type.type)} | null | undefined`;
54
+ }
55
+ else {
56
+ return `${this.convert(type.type)} | undefined`;
57
+ }
50
58
  }
51
59
  convertUnion(type) {
52
60
  return type.types.
@@ -136,7 +136,7 @@ export declare class CJLanguageWriter extends LanguageWriter {
136
136
  makeRuntimeType(rt: RuntimeType): LanguageExpression;
137
137
  protected makeRuntimeTypeGetterCall(value: string): LanguageExpression;
138
138
  makeMapInsert(keyAccessor: string, key: string, valueAccessor: string, value: string): LanguageStatement;
139
- makeNull(value?: string): LanguageExpression;
139
+ makeNull(): LanguageExpression;
140
140
  getTagType(): idl.IDLType;
141
141
  getRuntimeType(): idl.IDLType;
142
142
  makeTupleAssign(receiver: string, fields: string[]): LanguageStatement;
@@ -158,6 +158,8 @@ export declare class CJLanguageWriter extends LanguageWriter {
158
158
  popNamespace(options: {
159
159
  ident: boolean;
160
160
  }): void;
161
+ instanceOf(value: string, type: idl.IDLType): LanguageExpression;
162
+ discriminate(value: string, index: number, type: idl.IDLType, runtimeTypes: RuntimeType[]): string;
161
163
  castToInt(value: string, bitness: 8 | 32): string;
162
164
  castToBoolean(value: string): string;
163
165
  }
@@ -324,21 +324,6 @@ export class CJLanguageWriter extends LanguageWriter {
324
324
  this.writeDeclaration(name, signature, modifiers);
325
325
  }
326
326
  writeConstructorImplementation(className, signature, op, delegationCall, modifiers) {
327
- var _a;
328
- let i = 1;
329
- while (signature.isArgOptional(signature.args.length - i)) {
330
- let smallerSignature = signature.args.slice(0, -i);
331
- this.printer.print(`${modifiers ? modifiers.map((it) => MethodModifier[it].toLowerCase()).join(' ') + ' ' : ''}init(${smallerSignature.map((it, index) => `${this.escapeKeyword(signature.argName(index))}: ${this.getNodeName(it)}`).join(", ")}) {`);
332
- this.pushIndent();
333
- let lessArgs = (_a = signature.args) === null || _a === void 0 ? void 0 : _a.slice(0, -i).map((_, i) => this.escapeKeyword(signature.argName(i))).join(', ');
334
- for (let idx = 0; idx < i; idx++) {
335
- lessArgs = lessArgs.concat(`${i == signature.args.length && idx == 0 ? '' : ', '}Option.None`);
336
- }
337
- this.print(`this(${lessArgs})`);
338
- this.popIndent();
339
- this.printer.print(`}`);
340
- i += 1;
341
- }
342
327
  this.printer.print(`${modifiers ? modifiers.map((it) => MethodModifier[it].toLowerCase()).join(' ') + ' ' : ''}init(${signature.args.map((it, index) => `${this.escapeKeyword(signature.argName(index))}: ${this.getNodeName(idl.maybeOptional(it, signature.isArgOptional(index)))}`).join(", ")}) {`);
343
328
  this.pushIndent();
344
329
  if (delegationCall) {
@@ -527,7 +512,7 @@ export class CJLanguageWriter extends LanguageWriter {
527
512
  makeMapInsert(keyAccessor, key, valueAccessor, value) {
528
513
  return this.makeStatement(this.makeMethodCall(keyAccessor, "add", [this.makeString(key), this.makeString(value)]));
529
514
  }
530
- makeNull(value) {
515
+ makeNull() {
531
516
  return this.makeUndefined();
532
517
  }
533
518
  getTagType() {
@@ -574,6 +559,17 @@ export class CJLanguageWriter extends LanguageWriter {
574
559
  }
575
560
  pushNamespace(namespace, options) { }
576
561
  popNamespace(options) { }
562
+ instanceOf(value, type) {
563
+ return this.makeString(`${value} is ${this.getNodeName(type)}`);
564
+ }
565
+ discriminate(value, index, type, runtimeTypes) {
566
+ if (runtimeTypes.includes(RuntimeType.UNDEFINED)) {
567
+ return `${value}.isNone()`;
568
+ }
569
+ else {
570
+ return `${value}.getSelector() == ${index}`;
571
+ }
572
+ }
577
573
  castToInt(value, bitness) {
578
574
  return `Int${bitness}(${this.escapeKeyword(value)})`;
579
575
  }
@@ -101,7 +101,7 @@ export declare class CppLanguageWriter extends CLikeLanguageWriter {
101
101
  makeCast(expr: LanguageExpression, node: IDLNode, options?: MakeCastOptions): LanguageExpression;
102
102
  makePointerPropertyAccessExpression(expression: string, name: string): CppPointerPropertyAccessExpression;
103
103
  writePrintLog(message: string): void;
104
- makeDefinedCheck(value: string, isTag?: boolean): LanguageExpression;
104
+ makeDefinedCheck(value: string, type?: idl.IDLOptionalType, isTag?: boolean): LanguageExpression;
105
105
  makeSetUnionSelector(value: string, index: string): LanguageStatement;
106
106
  makeSetOptionTag(value: string, tag: LanguageExpression): LanguageStatement;
107
107
  getObjectAccessor(convertor: BaseArgConvertor, value: string, args?: ObjectArgs): string;
@@ -347,7 +347,7 @@ export class CppLanguageWriter extends CLikeLanguageWriter {
347
347
  writePrintLog(message) {
348
348
  this.print(`printf("${message}\\n");`);
349
349
  }
350
- makeDefinedCheck(value, isTag) {
350
+ makeDefinedCheck(value, type, isTag) {
351
351
  return this.makeString(isTag ? `${value} != ${PrimitiveTypeList.UndefinedTag}`
352
352
  : `runtimeType(${value}) != ${PrimitiveTypeList.UndefinedRuntime}`);
353
353
  }
@@ -176,9 +176,6 @@ export class ETSLanguageWriter extends TSLanguageWriter {
176
176
  this.arrayConvertor = arrayConvertor;
177
177
  }
178
178
  pushNamespace(namespace, options) {
179
- if (options.isDefault) {
180
- this.print(`export default ${namespace}`);
181
- }
182
179
  super.pushNamespace(namespace, options);
183
180
  }
184
181
  fork(options) {
@@ -66,7 +66,7 @@ export declare class TSLanguageWriter extends LanguageWriter {
66
66
  writeTypeDeclaration(decl: idl.IDLTypedef): void;
67
67
  writeConstant(constName: string, constType: idl.IDLType, constVal?: string): void;
68
68
  private writeDeclaration;
69
- makeNull(): LanguageExpression;
69
+ makeNull(type?: idl.IDLOptionalType): LanguageExpression;
70
70
  makeAssign(variableName: string, type: idl.IDLType | undefined, expr: LanguageExpression | undefined, isDeclared?: boolean, isConst?: boolean, options?: MakeAssignOptions): LanguageStatement;
71
71
  makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
72
72
  makeThrowError(message: string): LanguageStatement;
@@ -80,7 +80,7 @@ export declare class TSLanguageWriter extends LanguageWriter {
80
80
  getObjectAccessor(convertor: ArgConvertor, value: string, args?: ObjectArgs): string;
81
81
  makeUndefined(): LanguageExpression;
82
82
  makeRuntimeType(rt: RuntimeType): LanguageExpression;
83
- makeDefinedCheck(value: string): LanguageExpression;
83
+ makeDefinedCheck(value: string, type?: idl.IDLOptionalType): LanguageExpression;
84
84
  makeTupleAlloc(option: string): LanguageStatement;
85
85
  makeArrayInit(type: idl.IDLContainerType, size?: number): LanguageExpression;
86
86
  makeClassInit(type: idl.IDLType, paramenters: LanguageExpression[]): LanguageExpression;
@@ -127,6 +127,9 @@ export class TSLanguageWriter extends LanguageWriter {
127
127
  pushNamespace(namespace, options) {
128
128
  this.namespaceStack.push(namespace);
129
129
  const declaredPrefix = options.isDeclared ? "declare " : "";
130
+ if (options.isDefault) {
131
+ this.print(`export default ${namespace}`);
132
+ }
130
133
  this.print(`export ${declaredPrefix}namespace ${namespace} {`);
131
134
  if (options.ident)
132
135
  this.pushIndent();
@@ -295,7 +298,9 @@ export class TSLanguageWriter extends LanguageWriter {
295
298
  const normalizedArgs = signature.args.map((it, i) => idl.isOptionalType(it) && signature.isArgOptional(i) ? idl.maybeUnwrapOptionalType(it) : it);
296
299
  this.printer.print(`${prefix}${name}${typeParams}(${normalizedArgs.map((it, index) => `${this.escapeKeyword(signature.argName(index))}${signature.isArgOptional(index) ? "?" : ``}: ${this.getNodeName(it)}${signature.argDefault(index) ? ' = ' + signature.argDefault(index) : ""}`).join(", ")})${needReturn ? ": " + this.getNodeName(signature.returnType) : ""}${needBracket ? " {" : ""}`);
297
300
  }
298
- makeNull() {
301
+ makeNull(type) {
302
+ if (type && idl.hasExtAttribute(type, idl.IDLExtendedAttributes.UnionOnlyNull))
303
+ return new StringExpression("null");
299
304
  return new StringExpression("undefined");
300
305
  }
301
306
  makeAssign(variableName, type, expr, isDeclared = true, isConst = true, options) {
@@ -352,7 +357,15 @@ export class TSLanguageWriter extends LanguageWriter {
352
357
  makeRuntimeType(rt) {
353
358
  return this.makeString(`RuntimeType.${RuntimeType[rt]}`);
354
359
  }
355
- makeDefinedCheck(value) {
360
+ makeDefinedCheck(value, type) {
361
+ if (type) {
362
+ if (idl.hasExtAttribute(type, idl.IDLExtendedAttributes.UnionWithNull)) {
363
+ return this.makeString(`${value} !== undefined && ${value} !== null`);
364
+ }
365
+ else if (idl.hasExtAttribute(type, idl.IDLExtendedAttributes.UnionOnlyNull)) {
366
+ return this.makeString(`${value} !== null`);
367
+ }
368
+ }
356
369
  return this.makeString(`${value} !== undefined`);
357
370
  }
358
371
  makeTupleAlloc(option) {