@idlizer/core 2.1.7 → 2.1.9-arktscgen-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -3
- package/build/lib/src/LanguageWriters/ArgConvertors.js +154 -23
- package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +29 -4
- package/build/lib/src/LanguageWriters/LanguageWriter.js +42 -0
- package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +23 -10
- 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/index.js +4 -0
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +5 -5
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +25 -23
- 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 +2 -2
- package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +20 -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 +2 -2
- package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +6 -4
- package/build/lib/src/LibraryInterface.d.ts +2 -0
- package/build/lib/src/config.d.ts +132 -66
- package/build/lib/src/config.js +4 -2
- package/build/lib/src/configDescriber.d.ts +1 -1
- package/build/lib/src/configDescriber.js +1 -1
- package/build/lib/src/from-idl/DtsPrinter.js +10 -7
- package/build/lib/src/from-idl/IDLLinter.d.ts +0 -1
- package/build/lib/src/from-idl/IDLLinter.js +0 -6
- package/build/lib/src/from-idl/deserialize.js +7 -21
- package/build/lib/src/idl.d.ts +4 -13
- package/build/lib/src/idl.js +24 -58
- 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 -3
- package/build/lib/src/peer-generation/PeerLibrary.d.ts +5 -2
- package/build/lib/src/peer-generation/PeerLibrary.js +26 -6
- 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.js +1 -1
- 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 +15 -7
- package/build/lib/src/util.d.ts +2 -0
- package/build/lib/src/util.js +17 -7
- package/build/lib/src/visitor.js +0 -1
- package/package.json +2 -2
- 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;
|
|
@@ -301,8 +302,21 @@ export declare class FunctionConvertor extends BaseArgConvertor {
|
|
|
301
302
|
isPointerType(): boolean;
|
|
302
303
|
}
|
|
303
304
|
export declare class MaterializedClassConvertor extends BaseArgConvertor {
|
|
305
|
+
private library;
|
|
306
|
+
declaration: idl.IDLInterface;
|
|
307
|
+
constructor(library: LibraryInterface, param: string, declaration: idl.IDLInterface);
|
|
308
|
+
convertorArg(param: string, writer: LanguageWriter): string;
|
|
309
|
+
convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
|
|
310
|
+
convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
|
|
311
|
+
nativeType(): idl.IDLType;
|
|
312
|
+
interopType(): idl.IDLType;
|
|
313
|
+
isPointerType(): boolean;
|
|
314
|
+
unionDiscriminator(value: string, index: number, writer: LanguageWriter, duplicates: Set<string>): LanguageExpression | undefined;
|
|
315
|
+
}
|
|
316
|
+
export declare class ExternalTypeConvertor extends BaseArgConvertor {
|
|
317
|
+
private library;
|
|
304
318
|
declaration: idl.IDLInterface;
|
|
305
|
-
constructor(param: string, declaration: idl.IDLInterface);
|
|
319
|
+
constructor(library: PeerLibrary, param: string, declaration: idl.IDLInterface);
|
|
306
320
|
convertorArg(param: string, writer: LanguageWriter): string;
|
|
307
321
|
convertorSerialize(param: string, value: string, printer: LanguageWriter): void;
|
|
308
322
|
convertorDeserialize(bufferName: string, deserializerName: string, assigneer: ExpressionAssigner, writer: LanguageWriter): LanguageStatement;
|
|
@@ -324,7 +338,8 @@ export declare class ImportTypeConvertor extends BaseArgConvertor {
|
|
|
324
338
|
export declare class CallbackConvertor extends BaseArgConvertor {
|
|
325
339
|
private readonly library;
|
|
326
340
|
private readonly decl;
|
|
327
|
-
|
|
341
|
+
private readonly interopModuleName;
|
|
342
|
+
constructor(library: LibraryInterface, param: string, decl: idl.IDLCallback, interopModuleName: NativeModuleType);
|
|
328
343
|
private get isTransformed();
|
|
329
344
|
private get transformedDecl();
|
|
330
345
|
convertorArg(param: string, writer: LanguageWriter): string;
|
|
@@ -14,15 +14,19 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import * as idl from "../idl";
|
|
16
16
|
import { Language } from "../Language";
|
|
17
|
-
import { BlockStatement, PrintHint, StringExpression, MethodModifier } from "./LanguageWriter";
|
|
17
|
+
import { BlockStatement, PrintHint, StringExpression, MethodModifier, NamedMethodSignature, ProxyStatement, ExpressionStatement } from "./LanguageWriter";
|
|
18
18
|
import { RuntimeType } from "./common";
|
|
19
19
|
import { generatorConfiguration, generatorTypePrefix } from "../config";
|
|
20
|
-
import { hashCodeFromString, warn } from "../util";
|
|
20
|
+
import { getExtractorName, hashCodeFromString, warn } from "../util";
|
|
21
21
|
import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
|
|
22
22
|
import { CppConvertor, CppNameConvertor } from "./convertors/CppConvertors";
|
|
23
23
|
import { createEmptyReferenceResolver } from "../peer-generation/ReferenceResolver";
|
|
24
24
|
import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
|
|
25
25
|
import { qualifiedName } from "../peer-generation/idl/common";
|
|
26
|
+
import { LayoutNodeRole } from "../peer-generation/LayoutManager";
|
|
27
|
+
export function getSerializerName(declaration) {
|
|
28
|
+
return `${idl.getQualifiedName(declaration, "namespace.name").split('.').join('_')}_serializer`;
|
|
29
|
+
}
|
|
26
30
|
export function isDirectConvertedType(originalType, library) {
|
|
27
31
|
const debug = false;
|
|
28
32
|
if (originalType == undefined)
|
|
@@ -437,7 +441,7 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
437
441
|
convertorSerialize(param, value, printer) {
|
|
438
442
|
this.memberConvertors.forEach((it, index) => {
|
|
439
443
|
let memberName = this.members[index][0];
|
|
440
|
-
let memberAccess = `${value}.${memberName}`;
|
|
444
|
+
let memberAccess = `${value}.${printer.escapeKeyword(memberName)}`;
|
|
441
445
|
printer.writeStatement(printer.makeAssign(`${value}_${memberName}`, undefined, printer.makeString(memberAccess), true));
|
|
442
446
|
it.convertorSerialize(param, `${value}_${memberName}`, printer);
|
|
443
447
|
});
|
|
@@ -463,9 +467,7 @@ export class AggregateConvertor extends BaseArgConvertor {
|
|
|
463
467
|
/**
|
|
464
468
|
* todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
|
|
465
469
|
*/
|
|
466
|
-
const memberType = prop.isOptional
|
|
467
|
-
? idl.createUnionType([idl.IDLUndefinedType, prop.type])
|
|
468
|
-
: prop.type;
|
|
470
|
+
const memberType = idl.maybeOptional(prop.type, prop.isOptional);
|
|
469
471
|
return writer.makeAssign(`${bufferName}_${prop.name}`, memberType, expr, true, true);
|
|
470
472
|
}, writer));
|
|
471
473
|
}
|
|
@@ -548,10 +550,14 @@ export class InterfaceConvertor extends BaseArgConvertor {
|
|
|
548
550
|
throw new Error("Must never be used");
|
|
549
551
|
}
|
|
550
552
|
convertorSerialize(param, value, printer) {
|
|
551
|
-
|
|
553
|
+
const accessor = getSerializerName(this.declaration);
|
|
554
|
+
printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
555
|
+
printer.writeStaticMethodCall(accessor, 'write', [`${param}Serializer`, value]);
|
|
552
556
|
}
|
|
553
557
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
554
|
-
|
|
558
|
+
const accessor = getSerializerName(this.declaration);
|
|
559
|
+
writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
560
|
+
return assigneer(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]));
|
|
555
561
|
}
|
|
556
562
|
nativeType() {
|
|
557
563
|
return this.idlType;
|
|
@@ -716,6 +722,11 @@ export class DateConvertor extends BaseArgConvertor {
|
|
|
716
722
|
if (writer.language === Language.CPP) {
|
|
717
723
|
writer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
|
|
718
724
|
}
|
|
725
|
+
else if (writer.language === Language.CJ) {
|
|
726
|
+
writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
|
|
727
|
+
writer.makeCast(writer.makeString(`${value}`), idl.IDLI64Type).asString()
|
|
728
|
+
]);
|
|
729
|
+
}
|
|
719
730
|
else {
|
|
720
731
|
writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
|
|
721
732
|
writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type).asString()
|
|
@@ -727,10 +738,13 @@ export class DateConvertor extends BaseArgConvertor {
|
|
|
727
738
|
if (writer.language === Language.CPP) {
|
|
728
739
|
return assigneer(deserializeTime);
|
|
729
740
|
}
|
|
741
|
+
if (writer.language === Language.CJ) {
|
|
742
|
+
return assigneer(writer.makeString(`DateTime.now()`));
|
|
743
|
+
}
|
|
730
744
|
return assigneer(writer.makeString(`new Date(${deserializeTime.asString()})`));
|
|
731
745
|
}
|
|
732
746
|
nativeType() {
|
|
733
|
-
return idl.
|
|
747
|
+
return idl.IDLDate;
|
|
734
748
|
}
|
|
735
749
|
interopType() {
|
|
736
750
|
return idl.IDLDate;
|
|
@@ -830,13 +844,13 @@ export class OptionConvertor extends BaseArgConvertor {
|
|
|
830
844
|
const valueType = `${value}_type`.replaceAll('.', '_');
|
|
831
845
|
const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
|
|
832
846
|
printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
|
|
833
|
-
if (printer.language != Language.CJ) {
|
|
847
|
+
if (printer.language != Language.CJ && printer.language != Language.KOTLIN) {
|
|
834
848
|
printer.runtimeType(this, valueType, value);
|
|
835
849
|
printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
|
|
836
850
|
}
|
|
837
851
|
printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
|
|
838
852
|
printer.pushIndent();
|
|
839
|
-
if (printer.language == Language.CJ) {
|
|
853
|
+
if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
|
|
840
854
|
printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.OBJECT.ordinal"]); // everything is object, except None<T>
|
|
841
855
|
}
|
|
842
856
|
const valueValue = `${value}_value`.replaceAll('.', '_');
|
|
@@ -844,7 +858,7 @@ export class OptionConvertor extends BaseArgConvertor {
|
|
|
844
858
|
this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, valueValue), printer);
|
|
845
859
|
printer.popIndent();
|
|
846
860
|
printer.print(`}`);
|
|
847
|
-
if (printer.language == Language.CJ) {
|
|
861
|
+
if (printer.language == Language.CJ || printer.language == Language.KOTLIN) {
|
|
848
862
|
printer.print('else {');
|
|
849
863
|
printer.pushIndent();
|
|
850
864
|
printer.writeMethodCall(`${param}Serializer`, "writeInt8", ["RuntimeType.UNDEFINED.ordinal"]); // undefined
|
|
@@ -860,7 +874,7 @@ export class OptionConvertor extends BaseArgConvertor {
|
|
|
860
874
|
const statements = [];
|
|
861
875
|
statements.push(writer.makeAssign(runtimeBufferName, undefined, writer.makeCast(writer.makeString(`${deserializerName}.readInt8()`), writer.getRuntimeType()), true));
|
|
862
876
|
const bufferType = this.nativeType();
|
|
863
|
-
statements.push(writer.makeAssign(bufferName, bufferType, writer.language == Language.CJ ? writer.makeNull() : undefined, true, false));
|
|
877
|
+
statements.push(writer.makeAssign(bufferName, bufferType, (writer.language == Language.CJ || writer.language == Language.KOTLIN) ? writer.makeNull() : undefined, true, false));
|
|
864
878
|
const thenStatement = new BlockStatement([
|
|
865
879
|
this.typeConvertor.convertorDeserialize(`${bufferName}_`, deserializerName, (expr) => {
|
|
866
880
|
const receiver = writer.language === Language.CPP
|
|
@@ -930,7 +944,7 @@ export class UnionConvertor extends BaseArgConvertor {
|
|
|
930
944
|
statements.push(writer.makeAssign(`${bufferName}.selector`, undefined, writer.makeString(selectorBuffer), false));
|
|
931
945
|
const branches = this.memberConvertors.map((it, index) => {
|
|
932
946
|
const receiver = this.getObjectAccessor(writer.language, bufferName, { index: `${index}` });
|
|
933
|
-
const expr = writer.makeString(`${selectorBuffer} == ${index}`);
|
|
947
|
+
const expr = writer.makeString(`${selectorBuffer} == ${writer.castToInt(index.toString(), 8)}`);
|
|
934
948
|
const stmt = new BlockStatement([
|
|
935
949
|
writer.makeSetUnionSelector(bufferName, `${index}`),
|
|
936
950
|
it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
|
|
@@ -991,8 +1005,9 @@ export class FunctionConvertor extends BaseArgConvertor {
|
|
|
991
1005
|
}
|
|
992
1006
|
}
|
|
993
1007
|
export class MaterializedClassConvertor extends BaseArgConvertor {
|
|
994
|
-
constructor(param, declaration) {
|
|
1008
|
+
constructor(library, param, declaration) {
|
|
995
1009
|
super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
|
|
1010
|
+
this.library = library;
|
|
996
1011
|
this.declaration = declaration;
|
|
997
1012
|
}
|
|
998
1013
|
convertorArg(param, writer) {
|
|
@@ -1001,18 +1016,71 @@ export class MaterializedClassConvertor extends BaseArgConvertor {
|
|
|
1001
1016
|
return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
|
|
1002
1017
|
case Language.JAVA:
|
|
1003
1018
|
case Language.CJ:
|
|
1004
|
-
return `MaterializedBase.toPeerPtr(${param})`;
|
|
1019
|
+
return `MaterializedBase.toPeerPtr(${writer.escapeKeyword(param)})`;
|
|
1005
1020
|
default:
|
|
1006
1021
|
return `toPeerPtr(${param})`;
|
|
1007
1022
|
}
|
|
1008
1023
|
}
|
|
1009
1024
|
convertorSerialize(param, value, printer) {
|
|
1010
|
-
|
|
1025
|
+
const accessorRoot = getSerializerName(this.declaration);
|
|
1026
|
+
printer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1027
|
+
printer.writeStaticMethodCall(accessorRoot, 'write', [`${param}Serializer`, value]);
|
|
1028
|
+
}
|
|
1029
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1030
|
+
const accessorRoot = getSerializerName(this.declaration);
|
|
1031
|
+
writer.addFeature(accessorRoot, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1032
|
+
const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessorRoot, "read", [writer.makeString(deserializerName)]), this.declaration);
|
|
1033
|
+
return assigneer(readStatement);
|
|
1034
|
+
}
|
|
1035
|
+
nativeType() {
|
|
1036
|
+
return idl.createReferenceType(this.declaration);
|
|
1037
|
+
}
|
|
1038
|
+
interopType() {
|
|
1039
|
+
return idl.IDLPointerType;
|
|
1040
|
+
}
|
|
1041
|
+
isPointerType() {
|
|
1042
|
+
return false;
|
|
1043
|
+
}
|
|
1044
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
1045
|
+
if (idl.isInterface(this.declaration)) {
|
|
1046
|
+
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
|
|
1047
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
|
|
1048
|
+
}
|
|
1049
|
+
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
|
|
1050
|
+
const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
|
|
1051
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
export class ExternalTypeConvertor extends BaseArgConvertor {
|
|
1057
|
+
constructor(library, param, declaration) {
|
|
1058
|
+
super(idl.createReferenceType(declaration), [RuntimeType.OBJECT], false, false, param);
|
|
1059
|
+
this.library = library;
|
|
1060
|
+
this.declaration = declaration;
|
|
1061
|
+
console.log(`ExternalType convertor for type: ${declaration.name}`);
|
|
1062
|
+
}
|
|
1063
|
+
convertorArg(param, writer) {
|
|
1064
|
+
const lang = writer.language;
|
|
1065
|
+
switch (lang) {
|
|
1066
|
+
case Language.CPP:
|
|
1067
|
+
return `static_cast<${generatorTypePrefix()}${qualifiedName(this.declaration, "_", "namespace.name")}>(${param})`;
|
|
1068
|
+
default:
|
|
1069
|
+
return `extractors.${getExtractorName(this.declaration, lang, true)}(${param})`;
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
convertorSerialize(param, value, printer) {
|
|
1073
|
+
const accessor = getSerializerName(this.declaration);
|
|
1074
|
+
printer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1075
|
+
printer.writeStatement(printer.makeStatement(printer.makeStaticMethodCall(accessor, 'write', [
|
|
1076
|
+
printer.makeString(`${param}Serializer`),
|
|
1011
1077
|
printer.makeString(value)
|
|
1012
1078
|
])));
|
|
1013
1079
|
}
|
|
1014
1080
|
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
1015
|
-
const
|
|
1081
|
+
const accessor = getSerializerName(this.declaration);
|
|
1082
|
+
writer.addFeature(accessor, this.library.layout.resolve({ node: this.declaration, role: LayoutNodeRole.SERIALIZER }));
|
|
1083
|
+
const readStatement = writer.makeCast(writer.makeStaticMethodCall(accessor, 'read', [writer.makeString(deserializerName)]), this.declaration);
|
|
1016
1084
|
return assigneer(readStatement);
|
|
1017
1085
|
}
|
|
1018
1086
|
nativeType() {
|
|
@@ -1063,10 +1131,11 @@ export class ImportTypeConvertor extends BaseArgConvertor {
|
|
|
1063
1131
|
}
|
|
1064
1132
|
}
|
|
1065
1133
|
export class CallbackConvertor extends BaseArgConvertor {
|
|
1066
|
-
constructor(library, param, decl) {
|
|
1134
|
+
constructor(library, param, decl, interopModuleName) {
|
|
1067
1135
|
super(idl.createReferenceType(decl), [RuntimeType.FUNCTION], false, true, param);
|
|
1068
1136
|
this.library = library;
|
|
1069
1137
|
this.decl = decl;
|
|
1138
|
+
this.interopModuleName = interopModuleName;
|
|
1070
1139
|
}
|
|
1071
1140
|
get isTransformed() {
|
|
1072
1141
|
return this.decl !== this.transformedDecl;
|
|
@@ -1104,10 +1173,72 @@ export class CallbackConvertor extends BaseArgConvertor {
|
|
|
1104
1173
|
});
|
|
1105
1174
|
return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
|
|
1106
1175
|
}
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1176
|
+
const resourceName = bufferName + "_resource";
|
|
1177
|
+
const callName = bufferName + "_call";
|
|
1178
|
+
const callSyncName = bufferName + '_callSync';
|
|
1179
|
+
const argsSerializer = bufferName + "_args";
|
|
1180
|
+
const continuationValueName = bufferName + "_continuationValue";
|
|
1181
|
+
const continuationCallbackName = bufferName + "_continuationCallback";
|
|
1182
|
+
const statements = [];
|
|
1183
|
+
statements.push(writer.makeAssign(resourceName, idl.createReferenceType("CallbackResource"), writer.makeMethodCall(deserializerName, 'readCallbackResource', []), true));
|
|
1184
|
+
statements.push(writer.makeAssign(callName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, `readPointer`, []), true));
|
|
1185
|
+
statements.push(writer.makeAssign(callSyncName, idl.IDLPointerType, writer.makeMethodCall(deserializerName, 'readPointer', []), true));
|
|
1186
|
+
const callbackSignature = new NamedMethodSignature(this.decl.returnType, this.decl.parameters.map(it => idl.maybeOptional(it.type, it.isOptional)), this.decl.parameters.map(it => it.name));
|
|
1187
|
+
const hasContinuation = !idl.isVoidType(this.decl.returnType);
|
|
1188
|
+
let continuation = [];
|
|
1189
|
+
if (hasContinuation) {
|
|
1190
|
+
const continuationReference = this.library.createContinuationCallbackReference(this.decl.returnType);
|
|
1191
|
+
const continuationConvertor = this.library.typeConvertor(continuationCallbackName, continuationReference);
|
|
1192
|
+
const returnType = this.decl.returnType;
|
|
1193
|
+
const optionalReturnType = idl.createOptionalType(this.decl.returnType);
|
|
1194
|
+
continuation = [
|
|
1195
|
+
writer.language == Language.CJ ?
|
|
1196
|
+
writer.makeAssign(continuationValueName, undefined, writer.makeString(`${writer.getNodeName(this.decl.returnType).replace(/[\<\>]/g, '')}Holder(None<${writer.getNodeName(this.decl.returnType)}>)`), true, true) :
|
|
1197
|
+
writer.makeAssign(continuationValueName, optionalReturnType, undefined, true, false),
|
|
1198
|
+
writer.makeAssign(continuationCallbackName, continuationReference, writer.makeLambda(new NamedMethodSignature(idl.IDLVoidType, [returnType], [`value`]), [
|
|
1199
|
+
writer.language == Language.CJ ?
|
|
1200
|
+
writer.makeAssign(`${continuationValueName}.value`, undefined, writer.makeString(`value`), false) :
|
|
1201
|
+
writer.makeAssign(continuationValueName, undefined, writer.makeString(`value`), false)
|
|
1202
|
+
]), true),
|
|
1203
|
+
new ProxyStatement(writer => {
|
|
1204
|
+
continuationConvertor.convertorSerialize(argsSerializer, continuationCallbackName, writer);
|
|
1205
|
+
}),
|
|
1206
|
+
];
|
|
1207
|
+
}
|
|
1208
|
+
const result = writer.makeLambda(callbackSignature, [
|
|
1209
|
+
writer.makeAssign(`${argsSerializer}Serializer`, idl.createReferenceType('SerializerBase'), writer.makeMethodCall('SerializerBase', 'hold', []), true),
|
|
1210
|
+
new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writeInt32`, [writer.makeString(`${resourceName}.resourceId`)])),
|
|
1211
|
+
new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writePointer`, [writer.makeString(callName)])),
|
|
1212
|
+
new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `writePointer`, [writer.makeString(callSyncName)])),
|
|
1213
|
+
...this.decl.parameters.map(it => {
|
|
1214
|
+
const convertor = this.library.typeConvertor(it.name, it.type, it.isOptional);
|
|
1215
|
+
return new ProxyStatement((writer) => {
|
|
1216
|
+
convertor.convertorSerialize(argsSerializer, writer.escapeKeyword(it.name), writer);
|
|
1217
|
+
});
|
|
1218
|
+
}),
|
|
1219
|
+
...continuation,
|
|
1220
|
+
new ExpressionStatement(useSyncVersion
|
|
1221
|
+
? writer.makeNativeCall(this.interopModuleName, `_CallCallbackSync`, [
|
|
1222
|
+
writer.makeString(generateCallbackKindValue(this.decl).toString()),
|
|
1223
|
+
writer.makeSerializedBufferGetter(`${argsSerializer}Serializer`),
|
|
1224
|
+
writer.makeString(`${argsSerializer}Serializer.length()`),
|
|
1225
|
+
])
|
|
1226
|
+
: writer.makeNativeCall(this.interopModuleName, `_CallCallback`, [
|
|
1227
|
+
writer.makeString(generateCallbackKindValue(this.decl).toString()),
|
|
1228
|
+
writer.makeSerializedBufferGetter(`${argsSerializer}Serializer`),
|
|
1229
|
+
writer.makeString(`${argsSerializer}Serializer.length()`),
|
|
1230
|
+
])),
|
|
1231
|
+
new ExpressionStatement(writer.makeMethodCall(`${argsSerializer}Serializer`, `release`, [])),
|
|
1232
|
+
writer.makeReturn(hasContinuation
|
|
1233
|
+
? writer.makeCast(writer.language == Language.CJ ?
|
|
1234
|
+
writer.makeString(`${continuationValueName}.value`) :
|
|
1235
|
+
writer.makeString(continuationValueName), this.decl.returnType)
|
|
1236
|
+
: undefined),
|
|
1237
|
+
]);
|
|
1238
|
+
return writer.makeBlock([
|
|
1239
|
+
...statements,
|
|
1240
|
+
assigneer(result)
|
|
1241
|
+
], false);
|
|
1111
1242
|
}
|
|
1112
1243
|
nativeType() {
|
|
1113
1244
|
return idl.createReferenceType(this.decl);
|
|
@@ -33,8 +33,8 @@ export declare class NewObjectExpression implements LanguageExpression {
|
|
|
33
33
|
asString(): string;
|
|
34
34
|
}
|
|
35
35
|
export declare class FunctionCallExpression implements LanguageExpression {
|
|
36
|
-
|
|
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;
|
|
@@ -245,7 +266,7 @@ export declare abstract class LanguageWriter {
|
|
|
245
266
|
abstract writeFunctionDeclaration(name: string, signature: MethodSignature, generics?: string[]): void;
|
|
246
267
|
abstract writeFunctionImplementation(name: string, signature: MethodSignature, op: (writer: this) => void, generics?: string[]): void;
|
|
247
268
|
abstract writeMethodDeclaration(name: string, signature: MethodSignature, modifiers?: MethodModifier[]): void;
|
|
248
|
-
abstract writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void,
|
|
269
|
+
abstract writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, delegationCall?: DelegationCall, modifiers?: MethodModifier[]): void;
|
|
249
270
|
abstract writeMethodImplementation(method: Method, op: (writer: this) => void): void;
|
|
250
271
|
abstract writeProperty(propName: string, propType: idl.IDLType, modifiers: FieldModifier[], getter?: {
|
|
251
272
|
method: Method;
|
|
@@ -293,6 +314,7 @@ export declare abstract class LanguageWriter {
|
|
|
293
314
|
writeSetterImplementation(method: Method, op: (writer: this) => void): void;
|
|
294
315
|
writeSuperCall(params: string[]): void;
|
|
295
316
|
writeMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
|
|
317
|
+
writeStaticMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
|
|
296
318
|
writeStatement(stmt: LanguageStatement): void;
|
|
297
319
|
writeStatements(...statements: LanguageStatement[]): void;
|
|
298
320
|
writeExpressionStatement(smth: LanguageExpression): void;
|
|
@@ -307,6 +329,8 @@ export declare abstract class LanguageWriter {
|
|
|
307
329
|
makeNewObject(objectName: string, params?: LanguageExpression[]): LanguageExpression;
|
|
308
330
|
makeFunctionCall(name: string | LanguageExpression, params: LanguageExpression[]): LanguageExpression;
|
|
309
331
|
makeMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
|
|
332
|
+
makeThisCall(params: LanguageExpression[]): LanguageExpression;
|
|
333
|
+
makeStaticMethodCall(receiver: string, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
|
|
310
334
|
makeFieldAccess(receiver: string, method: string, nullable?: boolean): LanguageExpression;
|
|
311
335
|
makeNativeCall(nativeModule: NativeModuleType, method: string, params: LanguageExpression[], nullable?: boolean): LanguageExpression;
|
|
312
336
|
makeBlock(statements: LanguageStatement[], inScope?: boolean): BlockStatement;
|
|
@@ -370,6 +394,7 @@ export declare abstract class LanguageWriter {
|
|
|
370
394
|
castToInt(value: string, bitness: 8 | 32): string;
|
|
371
395
|
castToBoolean(value: string): string;
|
|
372
396
|
makeCallIsObject(value: string): LanguageExpression;
|
|
397
|
+
makeStaticBlock(op: (writer: LanguageWriter) => void): void;
|
|
373
398
|
instanceOf(convertor: ArgConvertor, value: string, _duplicateMembers?: Set<string>): LanguageExpression;
|
|
374
399
|
typeInstanceOf(type: idl.IDLEntry, value: string, members?: string[]): LanguageExpression;
|
|
375
400
|
stringifyTypeOrEmpty(type: idl.IDLType | undefined): string;
|
|
@@ -73,6 +73,18 @@ export class MethodCallExpression extends FunctionCallExpression {
|
|
|
73
73
|
return `${this.receiver}${this.nullable ? "?" : ""}.${super.asString()}`;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
+
export class MethodStaticCallExpression extends MethodCallExpression {
|
|
77
|
+
constructor(receiver, method, params, nullable = false) {
|
|
78
|
+
super(receiver, method, params, nullable);
|
|
79
|
+
this.receiver = receiver;
|
|
80
|
+
this.nullable = nullable;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export class ThisCallExpression extends FunctionCallExpression {
|
|
84
|
+
constructor(params) {
|
|
85
|
+
super("this", params);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
76
88
|
export class FieldAccessExpression {
|
|
77
89
|
constructor(receiver, field, nullable = false) {
|
|
78
90
|
this.receiver = receiver;
|
|
@@ -283,6 +295,9 @@ export class LambdaExpression {
|
|
|
283
295
|
stmt.write(writer);
|
|
284
296
|
}
|
|
285
297
|
}
|
|
298
|
+
writer.features.forEach(([feature, module]) => {
|
|
299
|
+
this.originalWriter.addFeature(feature, module);
|
|
300
|
+
});
|
|
286
301
|
return (this.body ? ((_a = this.body) === null || _a === void 0 ? void 0 : _a.length) > 1 ? '\n' : '' : '').concat(writer.getOutput()
|
|
287
302
|
.filter(line => line !== "")
|
|
288
303
|
.map(line => indentedBy(line.endsWith('{') || line.endsWith('}') || line.endsWith(';') ? line : `${line};`, 1))
|
|
@@ -320,6 +335,7 @@ export var MethodModifier;
|
|
|
320
335
|
MethodModifier[MethodModifier["THROWS"] = 8] = "THROWS";
|
|
321
336
|
MethodModifier[MethodModifier["FREE"] = 9] = "FREE";
|
|
322
337
|
MethodModifier[MethodModifier["FORCE_CONTEXT"] = 10] = "FORCE_CONTEXT";
|
|
338
|
+
MethodModifier[MethodModifier["OVERRIDE"] = 11] = "OVERRIDE";
|
|
323
339
|
})(MethodModifier || (MethodModifier = {}));
|
|
324
340
|
export var ClassModifier;
|
|
325
341
|
(function (ClassModifier) {
|
|
@@ -327,6 +343,11 @@ export var ClassModifier;
|
|
|
327
343
|
ClassModifier[ClassModifier["PRIVATE"] = 1] = "PRIVATE";
|
|
328
344
|
ClassModifier[ClassModifier["PROTECTED"] = 2] = "PROTECTED";
|
|
329
345
|
})(ClassModifier || (ClassModifier = {}));
|
|
346
|
+
export var DelegationType;
|
|
347
|
+
(function (DelegationType) {
|
|
348
|
+
DelegationType[DelegationType["THIS"] = 0] = "THIS";
|
|
349
|
+
DelegationType[DelegationType["SUPER"] = 1] = "SUPER";
|
|
350
|
+
})(DelegationType || (DelegationType = {}));
|
|
330
351
|
export class Field {
|
|
331
352
|
constructor(name, type, modifiers = []) {
|
|
332
353
|
this.name = name;
|
|
@@ -355,6 +376,7 @@ PrintHint.AsPointer = new PrintHint('AsPointer');
|
|
|
355
376
|
PrintHint.AsConstPointer = new PrintHint('AsConstPointer');
|
|
356
377
|
PrintHint.AsValue = new PrintHint('AsValue');
|
|
357
378
|
PrintHint.AsConstReference = new PrintHint('AsConstReference');
|
|
379
|
+
PrintHint.AsReference = new PrintHint('AsReference');
|
|
358
380
|
export class MethodSignature {
|
|
359
381
|
constructor(returnType, args, defaults = undefined, argsModifiers = undefined, printHints, argNames) {
|
|
360
382
|
this.returnType = returnType;
|
|
@@ -410,11 +432,15 @@ export class LanguageWriter {
|
|
|
410
432
|
this.resolver = resolver;
|
|
411
433
|
this.language = language;
|
|
412
434
|
this.namespaceStack = [];
|
|
435
|
+
this.features = [];
|
|
413
436
|
}
|
|
414
437
|
indentDepth() {
|
|
415
438
|
return this.printer.indentDepth();
|
|
416
439
|
}
|
|
417
440
|
maybeSemicolon() { return ";"; }
|
|
441
|
+
addFeature(feature, module) {
|
|
442
|
+
this.features.push([feature, module]);
|
|
443
|
+
}
|
|
418
444
|
// version of makeCast which uses TypeCheck.typeCast<T>(value) call for ETS language writer
|
|
419
445
|
// Use it only if TypeChecker class is added as import to the generated file
|
|
420
446
|
makeTypeCast(value, type, options) {
|
|
@@ -441,12 +467,17 @@ export class LanguageWriter {
|
|
|
441
467
|
var _a;
|
|
442
468
|
this.writeMethodImplementation(new Method(method.name, method.signature, [MethodModifier.SETTER].concat((_a = method.modifiers) !== null && _a !== void 0 ? _a : [])), op);
|
|
443
469
|
}
|
|
470
|
+
// Deprecated
|
|
471
|
+
// Use instead declarationCall parameter in writeConstructorImplementation(...)
|
|
444
472
|
writeSuperCall(params) {
|
|
445
473
|
this.printer.print(`super(${params.join(", ")})${this.maybeSemicolon()}`);
|
|
446
474
|
}
|
|
447
475
|
writeMethodCall(receiver, method, params, nullable = false) {
|
|
448
476
|
this.printer.print(`${receiver}${nullable ? "?" : ""}.${method}(${params.join(", ")})`);
|
|
449
477
|
}
|
|
478
|
+
writeStaticMethodCall(receiver, method, params, nullable = false) {
|
|
479
|
+
this.writeMethodCall(receiver, method, params, nullable);
|
|
480
|
+
}
|
|
450
481
|
writeStatement(stmt) {
|
|
451
482
|
stmt.write(this);
|
|
452
483
|
}
|
|
@@ -497,6 +528,14 @@ export class LanguageWriter {
|
|
|
497
528
|
makeMethodCall(receiver, method, params, nullable) {
|
|
498
529
|
return new MethodCallExpression(receiver, method, params, nullable);
|
|
499
530
|
}
|
|
531
|
+
// Deprecated
|
|
532
|
+
// Use instead declarationCall parameter in writeConstructorImplementation(...) with DelegationType.THIS
|
|
533
|
+
makeThisCall(params) {
|
|
534
|
+
return new ThisCallExpression(params);
|
|
535
|
+
}
|
|
536
|
+
makeStaticMethodCall(receiver, method, params, nullable) {
|
|
537
|
+
return new MethodStaticCallExpression(receiver, method, params, nullable);
|
|
538
|
+
}
|
|
500
539
|
makeFieldAccess(receiver, method, nullable) {
|
|
501
540
|
return new FieldAccessExpression(receiver, method, nullable);
|
|
502
541
|
}
|
|
@@ -678,6 +717,9 @@ export class LanguageWriter {
|
|
|
678
717
|
makeCallIsObject(value) {
|
|
679
718
|
return this.makeString(`typeof ${value} === "object"`);
|
|
680
719
|
}
|
|
720
|
+
makeStaticBlock(op) {
|
|
721
|
+
op(this);
|
|
722
|
+
}
|
|
681
723
|
instanceOf(convertor, value, _duplicateMembers) {
|
|
682
724
|
return this.makeString(`${value} instanceof ${this.getNodeName(convertor.idlType)}`);
|
|
683
725
|
}
|