@idlizer/core 2.1.9-arktscgen-6 → 2.1.9-arktscgen-9
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.
- package/build/lib/src/IndentedPrinter.d.ts +2 -1
- package/build/lib/src/IndentedPrinter.js +9 -2
- package/build/lib/src/Language.d.ts +0 -1
- package/build/lib/src/Language.js +7 -8
- package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +27 -40
- package/build/lib/src/LanguageWriters/ArgConvertors.js +167 -206
- package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +13 -34
- package/build/lib/src/LanguageWriters/LanguageWriter.js +31 -82
- package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +2 -2
- package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +17 -1
- package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +121 -6
- package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +6 -0
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +2 -3
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +9 -25
- package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +0 -5
- package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +0 -9
- package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +4 -6
- package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +15 -28
- package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +14 -10
- package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +51 -74
- package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +2 -8
- package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +11 -21
- package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +12 -9
- package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +121 -32
- package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +5 -6
- package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +17 -33
- package/build/lib/src/config.d.ts +402 -133
- package/build/lib/src/config.js +13 -7
- package/build/lib/src/diagnosticmessages.d.ts +45 -0
- package/build/lib/src/diagnosticmessages.js +66 -0
- package/build/lib/src/diagnostictypes.d.ts +140 -0
- package/build/lib/src/diagnostictypes.js +72 -0
- package/build/lib/src/formatter.d.ts +3 -0
- package/build/lib/src/formatter.js +98 -0
- package/build/lib/src/from-idl/deserialize.d.ts +1 -0
- package/build/lib/src/from-idl/deserialize.js +107 -5
- package/build/lib/src/idl.d.ts +8 -0
- package/build/lib/src/idl.js +16 -3
- package/build/lib/src/index.d.ts +7 -1
- package/build/lib/src/index.js +7 -1
- package/build/lib/src/peer-generation/Materialized.d.ts +2 -2
- package/build/lib/src/peer-generation/Materialized.js +4 -9
- package/build/lib/src/peer-generation/PeerLibrary.js +1 -5
- package/build/lib/src/peer-generation/PeerMethod.d.ts +0 -4
- package/build/lib/src/peer-generation/PeerMethod.js +18 -36
- package/build/lib/src/peer-generation/idl/common.js +1 -1
- package/build/lib/src/peer-generation/isMaterialized.js +0 -4
- package/build/lib/src/peer-generation/modules.d.ts +1 -0
- package/build/lib/src/peer-generation/modules.js +25 -6
- package/build/lib/src/peer-generation/unions.d.ts +0 -2
- package/build/lib/src/peer-generation/unions.js +3 -23
- package/build/lib/src/transformers/FqnTransformer.d.ts +4 -0
- package/build/lib/src/transformers/FqnTransformer.js +17 -0
- package/build/lib/src/transformers/GenericTransformer.d.ts +8 -0
- package/build/lib/src/transformers/GenericTransformer.js +141 -0
- package/build/lib/src/util.d.ts +5 -2
- package/build/lib/src/util.js +26 -12
- package/package.json +2 -2
- package/build/lib/src/peer-generation/isExternalType.d.ts +0 -4
- package/build/lib/src/peer-generation/isExternalType.js +0 -15
|
@@ -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 {
|
|
20
|
+
import { capitalize, getExtractor, hashCodeFromString, throwException, warn } from "../util";
|
|
21
21
|
import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
|
|
22
22
|
import { CppConvertor, CppNameConvertor } from "./convertors/CppConvertors";
|
|
23
23
|
import { createEmptyReferenceResolver } from "../peer-generation/ReferenceResolver";
|
|
@@ -25,6 +25,7 @@ import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
|
|
|
25
25
|
import { qualifiedName } from "../peer-generation/idl/common";
|
|
26
26
|
import { LayoutNodeRole } from "../peer-generation/LayoutManager";
|
|
27
27
|
import { PeerMethodSignature } from "../peer-generation/PeerMethod";
|
|
28
|
+
import { isInExternalModule } from "../peer-generation/modules";
|
|
28
29
|
export function getSerializerName(declaration) {
|
|
29
30
|
return `${idl.getQualifiedName(declaration, "namespace.name").split('.').join('_')}_serializer`;
|
|
30
31
|
}
|
|
@@ -122,13 +123,12 @@ export class BaseArgConvertor {
|
|
|
122
123
|
return writer.getObjectAccessor(this, value, args);
|
|
123
124
|
return this.useArray && (args === null || args === void 0 ? void 0 : args.index) ? `${value}[${args.index}]` : value;
|
|
124
125
|
}
|
|
125
|
-
discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor
|
|
126
|
+
discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor) {
|
|
126
127
|
if (!uniqueFields || uniqueFields.length === 0)
|
|
127
128
|
return undefined;
|
|
128
129
|
const firstNonOptional = uniqueFields.find(it => !optionalAccessor(it));
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
]);
|
|
130
|
+
const accessors = firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it));
|
|
131
|
+
return writer.makeNaryOp("||", accessors.map(it => writer.makeHasOwnProperty(value + "!", it)));
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
export class BooleanConvertor extends BaseArgConvertor {
|
|
@@ -139,7 +139,7 @@ export class BooleanConvertor extends BaseArgConvertor {
|
|
|
139
139
|
return writer.castToBoolean(param);
|
|
140
140
|
}
|
|
141
141
|
convertorSerialize(param, value, printer) {
|
|
142
|
-
printer.
|
|
142
|
+
return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeBoolean", [printer.makeString(value)]));
|
|
143
143
|
}
|
|
144
144
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
145
145
|
return assigneer(writer.makeString(`${deserializerName}.readBoolean()`));
|
|
@@ -161,7 +161,9 @@ export class UndefinedConvertor extends BaseArgConvertor {
|
|
|
161
161
|
convertorArg(param, writer) {
|
|
162
162
|
return writer.makeUndefined().asString();
|
|
163
163
|
}
|
|
164
|
-
convertorSerialize(param, value, printer) {
|
|
164
|
+
convertorSerialize(param, value, printer) {
|
|
165
|
+
return printer.makeStatement(printer.makeString(""));
|
|
166
|
+
}
|
|
165
167
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
166
168
|
return assigneer(writer.makeUndefined());
|
|
167
169
|
}
|
|
@@ -196,7 +198,7 @@ export class StringConvertor extends BaseArgConvertor {
|
|
|
196
198
|
: writer.escapeKeyword(param);
|
|
197
199
|
}
|
|
198
200
|
convertorSerialize(param, value, writer) {
|
|
199
|
-
writer.
|
|
201
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeString", [writer.makeString(value)]));
|
|
200
202
|
}
|
|
201
203
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
202
204
|
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readString()`), this.idlType, { optional: false }));
|
|
@@ -231,7 +233,7 @@ export class EnumConvertor extends BaseArgConvertor {
|
|
|
231
233
|
return writer.i32FromEnum(writer.makeString(writer.escapeKeyword(param)), this.enumEntry).asString();
|
|
232
234
|
}
|
|
233
235
|
convertorSerialize(param, value, writer) {
|
|
234
|
-
writer.
|
|
236
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt32", [writer.i32FromEnum(writer.makeString(value), this.enumEntry)]));
|
|
235
237
|
}
|
|
236
238
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
237
239
|
const readExpr = writer.makeMethodCall(`${deserializerName}`, "readInt32", []);
|
|
@@ -251,7 +253,21 @@ export class EnumConvertor extends BaseArgConvertor {
|
|
|
251
253
|
return writer.getNodeName(this.idlType); // this.enumTypeName(writer.language)
|
|
252
254
|
}
|
|
253
255
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
254
|
-
|
|
256
|
+
const convertorNativeType = this.nativeType();
|
|
257
|
+
const decl = writer.resolver.resolveTypeReference(idl.isReferenceType(convertorNativeType)
|
|
258
|
+
? convertorNativeType
|
|
259
|
+
: idl.createReferenceType(this.targetType(writer)));
|
|
260
|
+
if (decl === undefined || !idl.isEnum(decl)) {
|
|
261
|
+
throwException(`The type reference ${decl === null || decl === void 0 ? void 0 : decl.name} must be Enum`);
|
|
262
|
+
}
|
|
263
|
+
const ordinal = idl.isStringEnum(decl)
|
|
264
|
+
? writer.i32FromEnum(writer.makeCast(writer.makeString(writer.getObjectAccessor(this, value)), this.idlType), decl)
|
|
265
|
+
: writer.makeUnionVariantCast(writer.getObjectAccessor(this, value), writer.getNodeName(idl.IDLI32Type), this, index);
|
|
266
|
+
const { low, high } = idl.extremumOfOrdinals(decl);
|
|
267
|
+
return writer.makeNaryOp("&&", [
|
|
268
|
+
writer.makeNaryOp(">=", [ordinal, writer.makeString(low.toString())]),
|
|
269
|
+
writer.makeNaryOp("<=", [ordinal, writer.makeString(high.toString())])
|
|
270
|
+
]);
|
|
255
271
|
}
|
|
256
272
|
}
|
|
257
273
|
export class NumberConvertor extends BaseArgConvertor {
|
|
@@ -265,8 +281,8 @@ export class NumberConvertor extends BaseArgConvertor {
|
|
|
265
281
|
? writer.makeUnsafeCast_(writer.makeString(`&${param}`), this.idlType, PrintHint.AsConstPointer)
|
|
266
282
|
: writer.escapeKeyword(param);
|
|
267
283
|
}
|
|
268
|
-
convertorSerialize(param, value,
|
|
269
|
-
|
|
284
|
+
convertorSerialize(param, value, writer) {
|
|
285
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeNumber", [writer.makeString(value)]));
|
|
270
286
|
}
|
|
271
287
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
272
288
|
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readNumber()`), this.idlType, { optional: false }));
|
|
@@ -290,8 +306,8 @@ export class NumericConvertor extends BaseArgConvertor {
|
|
|
290
306
|
convertorArg(param, writer) {
|
|
291
307
|
return param;
|
|
292
308
|
}
|
|
293
|
-
convertorSerialize(param, value,
|
|
294
|
-
|
|
309
|
+
convertorSerialize(param, value, writer) {
|
|
310
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `write${this.interopNameConvertor.convert(this.idlType)}`, [writer.makeString(value)]));
|
|
295
311
|
}
|
|
296
312
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
297
313
|
return assigneer(writer.makeString(`${deserializerName}.read${this.interopNameConvertor.convert(this.idlType)}()`));
|
|
@@ -313,8 +329,8 @@ export class BigIntToU64Convertor extends BaseArgConvertor {
|
|
|
313
329
|
convertorArg(param, writer) {
|
|
314
330
|
return writer.escapeKeyword(param);
|
|
315
331
|
}
|
|
316
|
-
convertorSerialize(param, value,
|
|
317
|
-
|
|
332
|
+
convertorSerialize(param, value, writer) {
|
|
333
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `writeInt64`, [writer.makeString(value)]));
|
|
318
334
|
}
|
|
319
335
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
320
336
|
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readInt64()`), this.idlType, { optional: false }));
|
|
@@ -345,13 +361,8 @@ export class ObjectConvertor extends BaseArgConvertor {
|
|
|
345
361
|
convertorArg(param, writer) {
|
|
346
362
|
return writer.escapeKeyword(param);
|
|
347
363
|
}
|
|
348
|
-
convertorSerialize(param, value,
|
|
349
|
-
|
|
350
|
-
printer.writeMethodCall(`${param}Serializer`, "writeObject", [value]);
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
printer.writeMethodCall(`${param}Serializer`, "holdAndWriteObject", [value]);
|
|
354
|
-
}
|
|
364
|
+
convertorSerialize(param, value, writer) {
|
|
365
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, writer.language === Language.CPP ? `writeObject` : "holdAndWriteObject", [writer.makeString(value)]));
|
|
355
366
|
}
|
|
356
367
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
357
368
|
return assigneer(writer.makeCast(writer.makeMethodCall(deserializerName, 'readObject', []), this.idlType, { optional: false }));
|
|
@@ -380,8 +391,8 @@ export class PointerConvertor extends BaseArgConvertor {
|
|
|
380
391
|
convertorArg(param, writer) {
|
|
381
392
|
return param;
|
|
382
393
|
}
|
|
383
|
-
convertorSerialize(param, value,
|
|
384
|
-
|
|
394
|
+
convertorSerialize(param, value, writer) {
|
|
395
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeString(value)]));
|
|
385
396
|
}
|
|
386
397
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
387
398
|
return assigneer(writer.makeString(`${deserializerName}.readPointer()`));
|
|
@@ -403,8 +414,8 @@ export class BufferConvertor extends BaseArgConvertor {
|
|
|
403
414
|
convertorArg(param, _) {
|
|
404
415
|
return param;
|
|
405
416
|
}
|
|
406
|
-
convertorSerialize(param, value,
|
|
407
|
-
|
|
417
|
+
convertorSerialize(param, value, writer) {
|
|
418
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeBuffer", [writer.makeString(value)]));
|
|
408
419
|
}
|
|
409
420
|
convertorDeserialize(_, deserializerName, assigneer, writer) {
|
|
410
421
|
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readBuffer()`), this.idlType, { optional: false }));
|
|
@@ -419,7 +430,7 @@ export class BufferConvertor extends BaseArgConvertor {
|
|
|
419
430
|
return true;
|
|
420
431
|
}
|
|
421
432
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
422
|
-
return writer.instanceOf(
|
|
433
|
+
return writer.instanceOf(value, this.idlType);
|
|
423
434
|
}
|
|
424
435
|
}
|
|
425
436
|
export class AggregateConvertor extends BaseArgConvertor {
|
|
@@ -441,12 +452,16 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
441
452
|
throw new Error("Do not use for aggregates");
|
|
442
453
|
}
|
|
443
454
|
convertorSerialize(param, value, printer) {
|
|
444
|
-
this.memberConvertors.
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
455
|
+
const stmts = this.memberConvertors.flatMap((it, index) => {
|
|
456
|
+
const memberName = this.members[index][0];
|
|
457
|
+
const memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
|
|
458
|
+
const memberMangledName = `${value}${capitalize(memberName)}`;
|
|
459
|
+
return [
|
|
460
|
+
printer.makeAssign(memberMangledName, undefined, printer.makeString(memberAccess), true),
|
|
461
|
+
it.convertorSerialize(param, memberMangledName, printer)
|
|
462
|
+
];
|
|
449
463
|
});
|
|
464
|
+
return printer.makeBlock(stmts, false);
|
|
450
465
|
}
|
|
451
466
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
452
467
|
const statements = [];
|
|
@@ -461,7 +476,8 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
461
476
|
for (let i = 0; i < this.decl.properties.length; i++) {
|
|
462
477
|
const prop = this.decl.properties[i];
|
|
463
478
|
const propConvertor = this.memberConvertors[i];
|
|
464
|
-
|
|
479
|
+
const propName = `${bufferName}${capitalize(prop.name)}`;
|
|
480
|
+
statements.push(propConvertor.convertorDeserialize(`${propName}TempBuf`, deserializerName, (expr) => {
|
|
465
481
|
if (writer.language === Language.CPP) {
|
|
466
482
|
// prefix initialization for CPP, just easier. Waiting for easy work with nullables
|
|
467
483
|
return writer.makeAssign(`${bufferName}.${writer.escapeKeyword(prop.name)}`, undefined, expr, false);
|
|
@@ -470,7 +486,7 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
470
486
|
* todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
|
|
471
487
|
*/
|
|
472
488
|
const memberType = idl.maybeOptional(prop.type, prop.isOptional);
|
|
473
|
-
return writer.makeAssign(
|
|
489
|
+
return writer.makeAssign(propName, memberType, expr, true, true);
|
|
474
490
|
}, writer));
|
|
475
491
|
}
|
|
476
492
|
if (writer.language === Language.CPP) {
|
|
@@ -480,9 +496,15 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
480
496
|
const resultExpression = writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(", ")})`);
|
|
481
497
|
statements.push(assigneer(resultExpression));
|
|
482
498
|
}
|
|
499
|
+
else if (writer.language == Language.KOTLIN) {
|
|
500
|
+
const resultExpression = this.decl.subkind === idl.IDLInterfaceSubkind.Tuple ?
|
|
501
|
+
writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(', ')})`) :
|
|
502
|
+
writer.makeString(`object: ${writer.getNodeName(this.idlType)} { ${this.decl.properties.map(prop => `override var ${prop.name} = ${bufferName}_${prop.name}`).join("; ")} }`);
|
|
503
|
+
statements.push(assigneer(resultExpression));
|
|
504
|
+
}
|
|
483
505
|
else {
|
|
484
506
|
const resultExpression = this.makeAssigneeExpression(this.decl.properties.map(prop => {
|
|
485
|
-
return [prop.name, writer.makeString(`${bufferName}
|
|
507
|
+
return [prop.name, writer.makeString(`${bufferName}${capitalize(prop.name)}`)];
|
|
486
508
|
}), writer);
|
|
487
509
|
statements.push(assigneer(resultExpression));
|
|
488
510
|
}
|
|
@@ -506,7 +528,7 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
506
528
|
}
|
|
507
529
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
508
530
|
const uniqueFields = this.members.filter(it => !duplicates.has(it[0]));
|
|
509
|
-
return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1]
|
|
531
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1]);
|
|
510
532
|
}
|
|
511
533
|
}
|
|
512
534
|
export class TupleConvertor extends AggregateConvertor {
|
|
@@ -517,10 +539,13 @@ export class TupleConvertor extends AggregateConvertor {
|
|
|
517
539
|
throw new Error("Must never be used");
|
|
518
540
|
}
|
|
519
541
|
convertorSerialize(param, value, printer) {
|
|
520
|
-
this.memberConvertors.
|
|
521
|
-
|
|
522
|
-
|
|
542
|
+
const stmts = this.memberConvertors.flatMap((it, index) => {
|
|
543
|
+
return [
|
|
544
|
+
printer.makeAssign(`${value}_${index}`, undefined, printer.makeTupleAccess(value, index), true),
|
|
545
|
+
it.convertorSerialize(param, `${value}_${index}`, printer)
|
|
546
|
+
];
|
|
523
547
|
});
|
|
548
|
+
return printer.makeBlock(stmts, false);
|
|
524
549
|
}
|
|
525
550
|
makeAssigneeExpression(fields, writer) {
|
|
526
551
|
return writer.makeCast(writer.makeString(`[${fields.map(it => it[1].asString()).join(', ')}]`), this.idlType);
|
|
@@ -551,10 +576,10 @@ export class InterfaceConvertor extends BaseArgConvertor {
|
|
|
551
576
|
convertorArg(param, writer) {
|
|
552
577
|
throw new Error("Must never be used");
|
|
553
578
|
}
|
|
554
|
-
convertorSerialize(param, value,
|
|
579
|
+
convertorSerialize(param, value, writer) {
|
|
555
580
|
const accessor = getSerializerName(this.declaration);
|
|
556
|
-
|
|
557
|
-
|
|
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)]));
|
|
558
583
|
}
|
|
559
584
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
560
585
|
const accessor = getSerializerName(this.declaration);
|
|
@@ -580,7 +605,7 @@ export class InterfaceConvertor extends BaseArgConvertor {
|
|
|
580
605
|
var _a;
|
|
581
606
|
// Try to figure out interface by examining field sets
|
|
582
607
|
const uniqueFields = (_a = this.declaration) === null || _a === void 0 ? void 0 : _a.properties.filter(it => !duplicates.has(it.name));
|
|
583
|
-
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional
|
|
608
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
|
|
584
609
|
}
|
|
585
610
|
}
|
|
586
611
|
export class ClassConvertor extends InterfaceConvertor {
|
|
@@ -588,7 +613,7 @@ export class ClassConvertor extends InterfaceConvertor {
|
|
|
588
613
|
super(library, name, param, declaration);
|
|
589
614
|
}
|
|
590
615
|
unionDiscriminator(value, index, writer, duplicateMembers) {
|
|
591
|
-
return writer.
|
|
616
|
+
return writer.instanceOf(value, this.idlType);
|
|
592
617
|
}
|
|
593
618
|
}
|
|
594
619
|
export class ArrayConvertor extends BaseArgConvertor {
|
|
@@ -603,26 +628,27 @@ export class ArrayConvertor extends BaseArgConvertor {
|
|
|
603
628
|
throw new Error("Must never be used");
|
|
604
629
|
}
|
|
605
630
|
convertorSerialize(param, value, printer) {
|
|
631
|
+
const statements = [];
|
|
606
632
|
// Array length.
|
|
607
633
|
const valueLength = printer.makeArrayLength(value).asString();
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
printer.
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
printer.
|
|
634
|
+
statements.push(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt32", [printer.makeString(printer.castToInt(valueLength, 32))])));
|
|
635
|
+
const loopCounter = `${value}CounterI`;
|
|
636
|
+
const elementName = `${value}TmpElement`;
|
|
637
|
+
statements.push(printer.makeLoop(loopCounter, valueLength, printer.makeBlock([
|
|
638
|
+
printer.makeAssign(elementName, this.elementType, printer.makeArrayAccess(value, loopCounter), true),
|
|
639
|
+
this.elementConvertor.convertorSerialize(param, elementName, printer)
|
|
640
|
+
], false)));
|
|
641
|
+
return printer.makeBlock(statements, false);
|
|
616
642
|
}
|
|
617
643
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
618
|
-
const lengthBuffer = `${bufferName}
|
|
619
|
-
const counterBuffer = `${bufferName}
|
|
644
|
+
const lengthBuffer = `${bufferName}Length`;
|
|
645
|
+
const counterBuffer = `${bufferName}BufCounterI`;
|
|
620
646
|
const statements = [];
|
|
621
647
|
const arrayType = this.idlType;
|
|
622
648
|
statements.push(writer.makeAssign(lengthBuffer, idl.IDLI32Type, writer.makeString(`${deserializerName}.readInt32()`), true));
|
|
623
649
|
statements.push(writer.makeAssign(bufferName, arrayType, writer.makeArrayInit(this.type, lengthBuffer), true, false));
|
|
624
650
|
statements.push(writer.makeArrayResize(bufferName, writer.getNodeName(arrayType), lengthBuffer, deserializerName));
|
|
625
|
-
statements.push(writer.makeLoop(counterBuffer, lengthBuffer, this.elementConvertor.convertorDeserialize(`${bufferName}
|
|
651
|
+
statements.push(writer.makeLoop(counterBuffer, lengthBuffer, this.elementConvertor.convertorDeserialize(`${bufferName}TempBuf`, deserializerName, (expr) => {
|
|
626
652
|
return writer.makeAssign(writer.makeArrayAccess(bufferName, counterBuffer).asString(), undefined, expr, false);
|
|
627
653
|
}, writer)));
|
|
628
654
|
statements.push(assigneer(writer.makeString(bufferName)));
|
|
@@ -638,7 +664,7 @@ export class ArrayConvertor extends BaseArgConvertor {
|
|
|
638
664
|
return true;
|
|
639
665
|
}
|
|
640
666
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
641
|
-
return writer.
|
|
667
|
+
return writer.instanceOf(value, this.idlType);
|
|
642
668
|
}
|
|
643
669
|
getObjectAccessor(language, value, args) {
|
|
644
670
|
const array = language === Language.CPP ? ".array" : "";
|
|
@@ -660,20 +686,22 @@ export class MapConvertor extends BaseArgConvertor {
|
|
|
660
686
|
convertorSerialize(param, value, printer) {
|
|
661
687
|
// Map size.
|
|
662
688
|
const mapSize = printer.makeMapSize(value);
|
|
663
|
-
printer.
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
689
|
+
return printer.makeBlock([
|
|
690
|
+
printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt32", [printer.makeString(printer.castToInt(mapSize.asString(), 32))])),
|
|
691
|
+
printer.makeMapForEach(value, `${value}KeyVar`, `${value}ValueVar`, [
|
|
692
|
+
this.keyConvertor.convertorSerialize(param, `${value}KeyVar`, printer),
|
|
693
|
+
this.valueConvertor.convertorSerialize(param, `${value}ValueVar`, printer)
|
|
694
|
+
])
|
|
695
|
+
], false);
|
|
668
696
|
}
|
|
669
697
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
670
698
|
const mapTypeName = writer.getNodeName(this.idlType);
|
|
671
699
|
const keyType = this.keyType;
|
|
672
700
|
const valueType = this.valueType;
|
|
673
|
-
const sizeBuffer = `${bufferName}
|
|
674
|
-
const keyBuffer = `${bufferName}
|
|
675
|
-
const valueBuffer = `${bufferName}
|
|
676
|
-
const counterBuffer = `${bufferName}
|
|
701
|
+
const sizeBuffer = `${bufferName}SizeVar`;
|
|
702
|
+
const keyBuffer = `${bufferName}KeyVar`;
|
|
703
|
+
const valueBuffer = `${bufferName}ValueVar`;
|
|
704
|
+
const counterBuffer = `${bufferName}IVar`;
|
|
677
705
|
const keyAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "keys" });
|
|
678
706
|
const valueAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "values" });
|
|
679
707
|
return new BlockStatement([
|
|
@@ -681,10 +709,10 @@ export class MapConvertor extends BaseArgConvertor {
|
|
|
681
709
|
writer.makeAssign(bufferName, this.idlType, writer.makeMapInit(this.idlType), true, false),
|
|
682
710
|
writer.makeMapResize(mapTypeName, keyType, valueType, bufferName, sizeBuffer, deserializerName),
|
|
683
711
|
writer.makeLoop(counterBuffer, sizeBuffer, new BlockStatement([
|
|
684
|
-
this.keyConvertor.convertorDeserialize(`${keyBuffer}
|
|
712
|
+
this.keyConvertor.convertorDeserialize(`${keyBuffer}TempBuf`, deserializerName, (expr) => {
|
|
685
713
|
return writer.makeAssign(keyBuffer, keyType, expr, true, true);
|
|
686
714
|
}, writer),
|
|
687
|
-
this.valueConvertor.convertorDeserialize(`${valueBuffer}
|
|
715
|
+
this.valueConvertor.convertorDeserialize(`${valueBuffer}TempBuf`, deserializerName, (expr) => {
|
|
688
716
|
return writer.makeAssign(valueBuffer, valueType, expr, true, true);
|
|
689
717
|
}, writer),
|
|
690
718
|
writer.makeMapInsert(keyAccessor, keyBuffer, valueAccessor, valueBuffer),
|
|
@@ -702,7 +730,7 @@ export class MapConvertor extends BaseArgConvertor {
|
|
|
702
730
|
return true;
|
|
703
731
|
}
|
|
704
732
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
705
|
-
return writer.
|
|
733
|
+
return writer.makeString(`${value} instanceof Map`);
|
|
706
734
|
}
|
|
707
735
|
getObjectAccessor(language, value, args) {
|
|
708
736
|
return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) && (args === null || args === void 0 ? void 0 : args.field)
|
|
@@ -712,7 +740,7 @@ export class MapConvertor extends BaseArgConvertor {
|
|
|
712
740
|
}
|
|
713
741
|
export class DateConvertor extends BaseArgConvertor {
|
|
714
742
|
constructor(param) {
|
|
715
|
-
super(idl.
|
|
743
|
+
super(idl.IDLDate, [RuntimeType.NUMBER], false, false, param);
|
|
716
744
|
}
|
|
717
745
|
convertorArg(param, writer) {
|
|
718
746
|
if (writer.language === Language.CPP) {
|
|
@@ -722,17 +750,17 @@ export class DateConvertor extends BaseArgConvertor {
|
|
|
722
750
|
}
|
|
723
751
|
convertorSerialize(param, value, writer) {
|
|
724
752
|
if (writer.language === Language.CPP) {
|
|
725
|
-
writer.
|
|
753
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [writer.makeString(value)]));
|
|
726
754
|
}
|
|
727
755
|
else if (writer.language === Language.CJ) {
|
|
728
|
-
writer.
|
|
729
|
-
writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type)
|
|
730
|
-
]);
|
|
756
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [
|
|
757
|
+
writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type)
|
|
758
|
+
]));
|
|
731
759
|
}
|
|
732
760
|
else {
|
|
733
|
-
writer.
|
|
734
|
-
writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type)
|
|
735
|
-
]);
|
|
761
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeInt64", [
|
|
762
|
+
writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type)
|
|
763
|
+
]));
|
|
736
764
|
}
|
|
737
765
|
}
|
|
738
766
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
@@ -767,7 +795,7 @@ export class ProxyConvertor extends BaseArgConvertor {
|
|
|
767
795
|
return this.convertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
|
|
768
796
|
}
|
|
769
797
|
convertorSerialize(param, value, printer) {
|
|
770
|
-
this.convertor.convertorSerialize(param, value, printer);
|
|
798
|
+
return this.convertor.convertorSerialize(param, value, printer);
|
|
771
799
|
}
|
|
772
800
|
nativeType() {
|
|
773
801
|
return this.convertor.nativeType();
|
|
@@ -802,7 +830,7 @@ export class CustomTypeConvertor extends BaseArgConvertor {
|
|
|
802
830
|
}
|
|
803
831
|
/** todo: check */
|
|
804
832
|
convertorSerialize(param, value, printer) {
|
|
805
|
-
printer.
|
|
833
|
+
return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, `writeCustomObject`, [printer.makeString(`"${this.customTypeName}"`), printer.makeCastCustomObject(value, this.isGenericType)]));
|
|
806
834
|
}
|
|
807
835
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
808
836
|
const type = writer.language === Language.CPP
|
|
@@ -843,30 +871,12 @@ export class OptionConvertor extends BaseArgConvertor {
|
|
|
843
871
|
throw new Error("Must never be used");
|
|
844
872
|
}
|
|
845
873
|
convertorSerialize(param, value, printer) {
|
|
846
|
-
const
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
|
|
854
|
-
printer.pushIndent();
|
|
855
|
-
if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
|
|
856
|
-
printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
|
|
857
|
-
}
|
|
858
|
-
const valueValue = `${value}_value`.replaceAll('.', '_');
|
|
859
|
-
printer.writeStatement(printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true));
|
|
860
|
-
this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
|
|
861
|
-
printer.popIndent();
|
|
862
|
-
printer.print(`}`);
|
|
863
|
-
if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
|
|
864
|
-
printer.print('else {');
|
|
865
|
-
printer.pushIndent();
|
|
866
|
-
printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
|
|
867
|
-
printer.popIndent();
|
|
868
|
-
printer.print('}');
|
|
869
|
-
}
|
|
874
|
+
const valueValue = `${value}TmpValue`.replaceAll('.', '_');
|
|
875
|
+
return printer.makeCondition(printer.makeDefinedCheck(value), new BlockStatement([
|
|
876
|
+
printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.OBJECT)])),
|
|
877
|
+
printer.makeAssign(valueValue, undefined, printer.makeValueFromOption(value, this.typeConvertor), true),
|
|
878
|
+
this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer)
|
|
879
|
+
], true, false), new BlockStatement([printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeRuntimeType(RuntimeType.UNDEFINED)]))], true, false));
|
|
870
880
|
}
|
|
871
881
|
convertorCArg(param) {
|
|
872
882
|
throw new Error("Must never be used");
|
|
@@ -883,7 +893,7 @@ export class OptionConvertor extends BaseArgConvertor {
|
|
|
883
893
|
? `${bufferName}.value` : bufferName;
|
|
884
894
|
return writer.makeAssign(receiver, undefined, expr, false);
|
|
885
895
|
}, writer)
|
|
886
|
-
]);
|
|
896
|
+
], true, false);
|
|
887
897
|
statements.push(writer.makeSetOptionTag(bufferName, writer.makeCast(writer.makeString(runtimeBufferName), writer.getTagType())));
|
|
888
898
|
statements.push(writer.makeCondition(writer.makeRuntimeTypeDefinedCheck(runtimeBufferName), thenStatement));
|
|
889
899
|
statements.push(assigneer(writer.makeString(bufferName)));
|
|
@@ -916,27 +926,23 @@ export class UnionConvertor extends BaseArgConvertor {
|
|
|
916
926
|
throw new Error("Do not use for union");
|
|
917
927
|
}
|
|
918
928
|
convertorSerialize(param, value, printer) {
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
const maybeElse = (index > 0 && this.memberConvertors[index - 1].runtimeTypes.length > 0) ? "else " : "";
|
|
924
|
-
const conditions = this.unionChecker.makeDiscriminator(value, index, printer);
|
|
925
|
-
printer.print(`${maybeElse}if (${conditions.asString()}) {`);
|
|
926
|
-
printer.pushIndent();
|
|
927
|
-
printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(index.toString(), 8)]);
|
|
929
|
+
const branches = this.memberConvertors.map((it, index) => {
|
|
930
|
+
const discriminator = this.unionChecker.makeDiscriminator(value, index, printer);
|
|
931
|
+
const statements = [];
|
|
932
|
+
statements.push(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeInt8", [printer.makeString(printer.castToInt(index.toString(), 8))])));
|
|
928
933
|
if (!(it instanceof UndefinedConvertor)) {
|
|
929
|
-
|
|
930
|
-
it.
|
|
934
|
+
const varName = `${value}ForIdx${index}`;
|
|
935
|
+
statements.push(printer.makeAssign(varName, undefined, printer.makeUnionVariantCast(it.getObjectAccessor(printer.language, value), printer.getNodeName(it.idlType), it, index), true));
|
|
936
|
+
statements.push(it.convertorSerialize(param, varName, printer));
|
|
931
937
|
}
|
|
932
|
-
|
|
933
|
-
|
|
938
|
+
const stmt = new BlockStatement(statements, false);
|
|
939
|
+
return { expr: discriminator, stmt };
|
|
934
940
|
});
|
|
935
|
-
|
|
941
|
+
return printer.makeMultiBranchCondition(branches);
|
|
936
942
|
}
|
|
937
943
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
938
944
|
const statements = [];
|
|
939
|
-
let selectorBuffer = `${bufferName}
|
|
945
|
+
let selectorBuffer = `${bufferName}UnionSelector`;
|
|
940
946
|
const maybeOptionalUnion = writer.language === Language.CPP || writer.language == Language.CJ
|
|
941
947
|
? this.type
|
|
942
948
|
: idl.createOptionalType(this.type);
|
|
@@ -949,8 +955,8 @@ export class UnionConvertor extends BaseArgConvertor {
|
|
|
949
955
|
const expr = writer.makeString(`${selectorBuffer} == ${writer.castToInt(index.toString(), 8)}`);
|
|
950
956
|
const stmt = new BlockStatement([
|
|
951
957
|
writer.makeSetUnionSelector(bufferName, `${index}`),
|
|
952
|
-
it.convertorDeserialize(`${bufferName}
|
|
953
|
-
if (writer.language == Language.CJ) {
|
|
958
|
+
it.convertorDeserialize(`${bufferName}BufU`, deserializerName, (expr) => {
|
|
959
|
+
if (writer.language == Language.CJ || writer.language == Language.KOTLIN) {
|
|
954
960
|
return writer.makeAssign(receiver, undefined, writer.makeFunctionCall(writer.getNodeName(this.type), [expr]), false);
|
|
955
961
|
}
|
|
956
962
|
else {
|
|
@@ -977,8 +983,7 @@ export class UnionConvertor extends BaseArgConvertor {
|
|
|
977
983
|
return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) ? `${value}.value${args.index}` : value;
|
|
978
984
|
}
|
|
979
985
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
980
|
-
|
|
981
|
-
return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => checker.makeDiscriminator(value, n, writer)));
|
|
986
|
+
return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => this.unionChecker.makeDiscriminator(value, n, writer)));
|
|
982
987
|
}
|
|
983
988
|
}
|
|
984
989
|
export class FunctionConvertor extends BaseArgConvertor {
|
|
@@ -988,13 +993,13 @@ export class FunctionConvertor extends BaseArgConvertor {
|
|
|
988
993
|
this.library = library;
|
|
989
994
|
}
|
|
990
995
|
convertorArg(param, writer) {
|
|
991
|
-
|
|
996
|
+
throw new Error('Shall not be used');
|
|
992
997
|
}
|
|
993
998
|
convertorSerialize(param, value, writer) {
|
|
994
|
-
|
|
999
|
+
throw new Error('Shall not be used');
|
|
995
1000
|
}
|
|
996
1001
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
997
|
-
|
|
1002
|
+
throw new Error('Shall not be used');
|
|
998
1003
|
}
|
|
999
1004
|
nativeType() {
|
|
1000
1005
|
return idl.IDLFunctionType;
|
|
@@ -1017,16 +1022,21 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
|
|
|
1017
1022
|
case Language.CPP:
|
|
1018
1023
|
return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
|
|
1019
1024
|
case Language.JAVA:
|
|
1025
|
+
case Language.KOTLIN:
|
|
1020
1026
|
case Language.CJ:
|
|
1021
1027
|
return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
|
|
1022
1028
|
default:
|
|
1029
|
+
if (isInExternalModule(this.declaration)) {
|
|
1030
|
+
const extractor = getExtractor(this.declaration, writer.language, true);
|
|
1031
|
+
return `${extractor.receiver}.${extractor.method}(${param})`;
|
|
1032
|
+
}
|
|
1023
1033
|
return `toPeerPtr(${param})`;
|
|
1024
1034
|
}
|
|
1025
1035
|
}
|
|
1026
1036
|
convertorSerialize(param, value, printer) {
|
|
1027
1037
|
const accessorRoot = getSerializerName(this.declaration);
|
|
1028
1038
|
printer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1029
|
-
printer.
|
|
1039
|
+
return printer.makeStatement(printer.makeStaticMethodCall(accessorRoot, 'write', [printer.makeString(`${param}Serializer`), printer.makeString(value)]));
|
|
1030
1040
|
}
|
|
1031
1041
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1032
1042
|
const accessorRoot = getSerializerName(this.declaration);
|
|
@@ -1046,62 +1056,11 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
|
|
|
1046
1056
|
unionDiscriminator(value, index, writer, duplicates) {
|
|
1047
1057
|
if (idl.isInterface(this.declaration)) {
|
|
1048
1058
|
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
|
|
1049
|
-
return writer.
|
|
1050
|
-
}
|
|
1051
|
-
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
|
|
1052
|
-
const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
|
|
1053
|
-
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
|
|
1054
|
-
}
|
|
1055
|
-
}
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
export class ExternalTypeConvertor extends BaseArgConvertor {
|
|
1059
|
-
constructor(library, param, declaration) {
|
|
1060
|
-
super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
|
|
1061
|
-
this.library = library;
|
|
1062
|
-
this.declaration = declaration;
|
|
1063
|
-
console.log(`ExternalType convertor for type: ${declaration.name}`);
|
|
1064
|
-
}
|
|
1065
|
-
convertorArg(param, writer) {
|
|
1066
|
-
const lang = writer.language;
|
|
1067
|
-
switch (lang) {
|
|
1068
|
-
case Language.CPP:
|
|
1069
|
-
return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
|
|
1070
|
-
default:
|
|
1071
|
-
return `extractors.${getExtractorName(this.declaration, lang, true)}(${param})`;
|
|
1072
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
convertorSerialize(param, value, printer) {
|
|
1075
|
-
const accessor = getSerializerName(this.declaration);
|
|
1076
|
-
printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1077
|
-
printer.writeStatement(printer.makeStatement(printer.makeStaticMethodCall(accessor, 'write', [
|
|
1078
|
-
printer.makeString(`${param}Serializer`),
|
|
1079
|
-
printer.makeString(value)
|
|
1080
|
-
])));
|
|
1081
|
-
}
|
|
1082
|
-
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1083
|
-
const accessor = getSerializerName(this.declaration);
|
|
1084
|
-
writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1085
|
-
const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]), this.declaration);
|
|
1086
|
-
return assigneer(readStatement);
|
|
1087
|
-
}
|
|
1088
|
-
nativeType() {
|
|
1089
|
-
return idl.createReferenceType(this.declaration);
|
|
1090
|
-
}
|
|
1091
|
-
interopType() {
|
|
1092
|
-
return idl.IDLPointerType;
|
|
1093
|
-
}
|
|
1094
|
-
isPointerType() {
|
|
1095
|
-
return false;
|
|
1096
|
-
}
|
|
1097
|
-
unionDiscriminator(value, index, writer, duplicates) {
|
|
1098
|
-
if (idl.isInterface(this.declaration)) {
|
|
1099
|
-
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
|
|
1100
|
-
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
|
|
1059
|
+
return writer.instanceOf(value, this.idlType);
|
|
1101
1060
|
}
|
|
1102
1061
|
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
|
|
1103
1062
|
const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
|
|
1104
|
-
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional
|
|
1063
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional);
|
|
1105
1064
|
}
|
|
1106
1065
|
}
|
|
1107
1066
|
}
|
|
@@ -1116,7 +1075,7 @@ export class ImportTypeConvertor extends BaseArgConvertor {
|
|
|
1116
1075
|
throw new Error("Must never be used");
|
|
1117
1076
|
}
|
|
1118
1077
|
convertorSerialize(param, value, printer) {
|
|
1119
|
-
printer.
|
|
1078
|
+
return printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, "writeCustomObject", [printer.makeString(`"${this.importedName}"`), printer.makeString(value)]));
|
|
1120
1079
|
}
|
|
1121
1080
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1122
1081
|
return assigneer(writer.makeString(`${deserializerName}.readCustomObject("${this.importedName}")`));
|
|
@@ -1151,14 +1110,15 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1151
1110
|
}
|
|
1152
1111
|
convertorSerialize(param, value, writer) {
|
|
1153
1112
|
if (writer.language == Language.CPP) {
|
|
1154
|
-
writer.
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1113
|
+
return writer.makeBlock([
|
|
1114
|
+
writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writeCallbackResource", [writer.makeString(`${value}.resource`)])),
|
|
1115
|
+
writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.call`), idl.IDLPointerType, { unsafe: true })])),
|
|
1116
|
+
writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.callSync`), idl.IDLPointerType, { unsafe: true })]))
|
|
1117
|
+
], false);
|
|
1158
1118
|
}
|
|
1159
1119
|
if (this.isTransformed)
|
|
1160
1120
|
value = `CallbackTransformer.transformFrom${this.library.getInteropName(this.decl)}(${value})`;
|
|
1161
|
-
writer.
|
|
1121
|
+
return writer.makeStatement(writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallback`, [writer.makeString(`${value}`)]));
|
|
1162
1122
|
}
|
|
1163
1123
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer, useSyncVersion = false) {
|
|
1164
1124
|
if (writer.language == Language.CPP) {
|
|
@@ -1175,12 +1135,12 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1175
1135
|
});
|
|
1176
1136
|
return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
|
|
1177
1137
|
}
|
|
1178
|
-
const resourceName = bufferName + "
|
|
1179
|
-
const callName = bufferName + "
|
|
1180
|
-
const callSyncName = bufferName + '
|
|
1181
|
-
const argsSerializer = bufferName + "
|
|
1182
|
-
const continuationValueName = bufferName + "
|
|
1183
|
-
const continuationCallbackName = bufferName + "
|
|
1138
|
+
const resourceName = bufferName + "BufResource";
|
|
1139
|
+
const callName = bufferName + "BufCall";
|
|
1140
|
+
const callSyncName = bufferName + 'BufCallSync';
|
|
1141
|
+
const argsSerializer = bufferName + "BufArgs";
|
|
1142
|
+
const continuationValueName = bufferName + "BufContinuationValue";
|
|
1143
|
+
const continuationCallbackName = bufferName + "BufContinuationCallback";
|
|
1184
1144
|
const statements = [];
|
|
1185
1145
|
statements.push(writer.makeAssign(resourceName, idl.createReferenceType("CallbackResource"), writer.makeMethodCall(deserializerName, 'readCallbackResource', []), true));
|
|
1186
1146
|
statements.push(writer.makeAssign(callName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, `readPointer`, []), true));
|
|
@@ -1196,14 +1156,14 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1196
1156
|
continuation = [
|
|
1197
1157
|
writer.language == Language.CJ ?
|
|
1198
1158
|
writer.makeAssign(continuationValueName, undefined, writer.makeString(`${writer.getNodeName(this.decl.returnType).replace(/[\<\>]/g, '')}Holder(None<${writer.getNodeName(this.decl.returnType)}>)`), true, true) :
|
|
1199
|
-
writer.makeAssign(continuationValueName, optionalReturnType, undefined, true, false),
|
|
1159
|
+
writer.makeAssign(continuationValueName, optionalReturnType, writer.language == Language.KOTLIN ? writer.makeNull() : undefined, true, false),
|
|
1200
1160
|
writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
|
|
1201
1161
|
writer.language == Language.CJ ?
|
|
1202
1162
|
writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
|
|
1203
1163
|
writer.makeAssign(continuationValueName, undefined, writer.makeString(`value`), false)
|
|
1204
1164
|
]), true),
|
|
1205
1165
|
new ProxyStatement(writer => {
|
|
1206
|
-
continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer);
|
|
1166
|
+
writer.writeStatement(continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer));
|
|
1207
1167
|
}),
|
|
1208
1168
|
];
|
|
1209
1169
|
}
|
|
@@ -1215,7 +1175,7 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1215
1175
|
...this.decl.parameters.map(it => {
|
|
1216
1176
|
const convertor = this.library.typeConvertor(it.name, it.type, it.isOptional);
|
|
1217
1177
|
return new ProxyStatement((writer) => {
|
|
1218
|
-
convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer);
|
|
1178
|
+
writer.writeStatement(convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer));
|
|
1219
1179
|
});
|
|
1220
1180
|
}),
|
|
1221
1181
|
...continuation,
|
|
@@ -1231,7 +1191,7 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1231
1191
|
writer.makeString(`${argsSerializer}Serializer.length()`),
|
|
1232
1192
|
])),
|
|
1233
1193
|
new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
|
|
1234
|
-
writer.
|
|
1194
|
+
writer.makeLambdaReturn(hasContinuation
|
|
1235
1195
|
? writer.makeCast(writer.language == Language.CJ ?
|
|
1236
1196
|
writer.makeString(`${continuationValueName}.value`) :
|
|
1237
1197
|
writer.makeString(continuationValueName), this.decl.returnType)
|
|
@@ -1248,10 +1208,6 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1248
1208
|
isPointerType() {
|
|
1249
1209
|
return true;
|
|
1250
1210
|
}
|
|
1251
|
-
unionDiscriminator(value, index, writer, duplicates) {
|
|
1252
|
-
// We serialize callbacks as table offsets, so don't need to discriminate them. Runtime type check is enough
|
|
1253
|
-
return writer.makeUnionVariantCondition(this, value, `${value}_type`, RuntimeType[RuntimeType.FUNCTION]);
|
|
1254
|
-
}
|
|
1255
1211
|
}
|
|
1256
1212
|
////////////////////////////////////////////////////////////////////////////////
|
|
1257
1213
|
// UTILS
|
|
@@ -1314,13 +1270,18 @@ class PromiseOutArgConvertor extends BaseArgConvertor {
|
|
|
1314
1270
|
}
|
|
1315
1271
|
convertorSerialize(param, value, writer) {
|
|
1316
1272
|
if (writer.language == Language.CPP) {
|
|
1317
|
-
this.callbackConvertor.convertorSerialize(param, value, writer);
|
|
1318
|
-
|
|
1273
|
+
return this.callbackConvertor.convertorSerialize(param, value, writer);
|
|
1274
|
+
}
|
|
1275
|
+
let serializeCallback;
|
|
1276
|
+
if (idl.isVoidType(this.promise.elementType[0])) {
|
|
1277
|
+
serializeCallback = writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromiseVoid`, []);
|
|
1278
|
+
}
|
|
1279
|
+
else {
|
|
1280
|
+
serializeCallback = writer.makeMethodCall(`${param}Serializer`, `holdAndWriteCallbackForPromise<${writer.getNodeName(this.promise.elementType[0])}>`, []);
|
|
1319
1281
|
}
|
|
1320
|
-
|
|
1321
|
-
? writer.
|
|
1322
|
-
: writer.
|
|
1323
|
-
writer.writeStatement(writer.makeAssign(value, undefined, writer.language == Language.CJ ? writer.makeString(serializeCallback.asString().concat('.promise')) : writer.makeTupleAccess(serializeCallback.asString(), 0), true));
|
|
1282
|
+
return writer.makeAssign(value, undefined, writer.language == Language.CJ
|
|
1283
|
+
? writer.makeString(serializeCallback.asString().concat('.promise'))
|
|
1284
|
+
: writer.makeTupleAccess(serializeCallback.asString(), 0), true);
|
|
1324
1285
|
}
|
|
1325
1286
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1326
1287
|
return this.callbackConvertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
|