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