@idlizer/core 2.0.15
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 +28 -0
- package/build/lib/src/IndentedPrinter.js +81 -0
- package/build/lib/src/Language.d.ts +15 -0
- package/build/lib/src/Language.js +42 -0
- package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +318 -0
- package/build/lib/src/LanguageWriters/ArgConvertors.js +1015 -0
- package/build/lib/src/LanguageWriters/InteropConvertor.d.ts +36 -0
- package/build/lib/src/LanguageWriters/InteropConvertor.js +174 -0
- package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +386 -0
- package/build/lib/src/LanguageWriters/LanguageWriter.js +746 -0
- package/build/lib/src/LanguageWriters/common.d.ts +17 -0
- package/build/lib/src/LanguageWriters/common.js +33 -0
- package/build/lib/src/LanguageWriters/convertors/CppConvertors.d.ts +8 -0
- package/build/lib/src/LanguageWriters/convertors/CppConvertors.js +35 -0
- package/build/lib/src/LanguageWriters/index.d.ts +3 -0
- package/build/lib/src/LanguageWriters/index.js +3 -0
- package/build/lib/src/LanguageWriters/nameConvertor.d.ts +28 -0
- package/build/lib/src/LanguageWriters/nameConvertor.js +61 -0
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +147 -0
- package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +578 -0
- package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +46 -0
- package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +121 -0
- package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +116 -0
- package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +472 -0
- package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +72 -0
- package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +329 -0
- package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +83 -0
- package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +275 -0
- package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +93 -0
- package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +390 -0
- package/build/lib/src/LibraryInterface.d.ts +21 -0
- package/build/lib/src/LibraryInterface.js +2 -0
- package/build/lib/src/config.d.ts +8 -0
- package/build/lib/src/config.js +20 -0
- package/build/lib/src/from-idl/DtsPrinter.d.ts +35 -0
- package/build/lib/src/from-idl/DtsPrinter.js +375 -0
- package/build/lib/src/from-idl/common.d.ts +5 -0
- package/build/lib/src/from-idl/common.js +83 -0
- package/build/lib/src/from-idl/deserialize.d.ts +9 -0
- package/build/lib/src/from-idl/deserialize.js +384 -0
- package/build/lib/src/from-idl/toString.d.ts +2 -0
- package/build/lib/src/from-idl/toString.js +18 -0
- package/build/lib/src/from-idl/webidl2-utils.d.ts +20 -0
- package/build/lib/src/from-idl/webidl2-utils.js +84 -0
- package/build/lib/src/idl.d.ts +404 -0
- package/build/lib/src/idl.js +1015 -0
- package/build/lib/src/idlize.d.ts +4 -0
- package/build/lib/src/idlize.js +52 -0
- package/build/lib/src/index.d.ts +34 -0
- package/build/lib/src/index.js +48 -0
- package/build/lib/src/inheritance.d.ts +16 -0
- package/build/lib/src/inheritance.js +76 -0
- package/build/lib/src/languageSpecificKeywords.d.ts +5 -0
- package/build/lib/src/languageSpecificKeywords.js +51 -0
- package/build/lib/src/library.d.ts +67 -0
- package/build/lib/src/library.js +190 -0
- package/build/lib/src/options.d.ts +11 -0
- package/build/lib/src/options.js +16 -0
- package/build/lib/src/peer-generation/PrimitiveType.d.ts +24 -0
- package/build/lib/src/peer-generation/PrimitiveType.js +52 -0
- package/build/lib/src/peer-generation/ReferenceResolver.d.ts +9 -0
- package/build/lib/src/peer-generation/ReferenceResolver.js +37 -0
- package/build/lib/src/peer-generation/idl/IdlNameConvertor.d.ts +28 -0
- package/build/lib/src/peer-generation/idl/IdlNameConvertor.js +82 -0
- package/build/lib/src/peer-generation/idl/common.d.ts +9 -0
- package/build/lib/src/peer-generation/idl/common.js +70 -0
- package/build/lib/src/peer-generation/unions.d.ts +29 -0
- package/build/lib/src/peer-generation/unions.js +111 -0
- package/build/lib/src/rand_utils.d.ts +6 -0
- package/build/lib/src/rand_utils.js +100 -0
- package/build/lib/src/util.d.ts +75 -0
- package/build/lib/src/util.js +622 -0
- package/package.json +49 -0
- package/webidl2.js/LICENSE +21 -0
- package/webidl2.js/README.md +827 -0
- package/webidl2.js/dist/package.json +3 -0
- package/webidl2.js/dist/webidl2.js +4547 -0
- package/webidl2.js/package.json +55 -0
|
@@ -0,0 +1,1015 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2024 Huawei Device Co., Ltd.
|
|
3
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License.
|
|
5
|
+
* You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
* See the License for the specific language governing permissions and
|
|
13
|
+
* limitations under the License.
|
|
14
|
+
*/
|
|
15
|
+
import * as idl from "../idl";
|
|
16
|
+
import { Language } from "../Language";
|
|
17
|
+
import { PrintHint, BlockStatement, StringExpression } from "./LanguageWriter";
|
|
18
|
+
import { RuntimeType } from "./common";
|
|
19
|
+
import { generatorTypePrefix } from "../config";
|
|
20
|
+
import { hashCodeFromString, warn } from "../util";
|
|
21
|
+
import { UnionRuntimeTypeChecker } from "../peer-generation/unions";
|
|
22
|
+
import { InteropNameConvertor } from "./InteropConvertor";
|
|
23
|
+
import { createEmptyReferenceResolver } from "../peer-generation/ReferenceResolver";
|
|
24
|
+
import { CppInteropConvertor } from "./convertors/CppConvertors";
|
|
25
|
+
import { PrimitiveTypesInstance } from "../peer-generation/PrimitiveType";
|
|
26
|
+
export class BaseArgConvertor {
|
|
27
|
+
constructor(idlType, runtimeTypes, isScoped, useArray, param) {
|
|
28
|
+
this.idlType = idlType;
|
|
29
|
+
this.runtimeTypes = runtimeTypes;
|
|
30
|
+
this.isScoped = isScoped;
|
|
31
|
+
this.useArray = useArray;
|
|
32
|
+
this.param = param;
|
|
33
|
+
}
|
|
34
|
+
nativeType() {
|
|
35
|
+
throw new Error("Define");
|
|
36
|
+
}
|
|
37
|
+
isPointerType() {
|
|
38
|
+
throw new Error("Define");
|
|
39
|
+
}
|
|
40
|
+
interopType() {
|
|
41
|
+
throw new Error("Define");
|
|
42
|
+
}
|
|
43
|
+
targetType(writer) {
|
|
44
|
+
return writer.getNodeName(this.idlType);
|
|
45
|
+
}
|
|
46
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
getMembers() { return []; }
|
|
50
|
+
getObjectAccessor(language, value, args, writer) {
|
|
51
|
+
if (writer)
|
|
52
|
+
return writer.getObjectAccessor(this, value, args);
|
|
53
|
+
return this.useArray && (args === null || args === void 0 ? void 0 : args.index) ? `${value}[${args.index}]` : value;
|
|
54
|
+
}
|
|
55
|
+
discriminatorFromFields(value, writer, uniqueFields, nameAccessor, optionalAccessor, duplicates) {
|
|
56
|
+
if (!uniqueFields || uniqueFields.length === 0)
|
|
57
|
+
return undefined;
|
|
58
|
+
const firstNonOptional = uniqueFields.find(it => !optionalAccessor(it));
|
|
59
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [
|
|
60
|
+
writer.makeDiscriminatorFromFields(this, value, firstNonOptional ? [nameAccessor(firstNonOptional)] : uniqueFields.map(it => nameAccessor(it)), duplicates)
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class BooleanConvertor extends BaseArgConvertor {
|
|
65
|
+
constructor(param) {
|
|
66
|
+
super(idl.IDLBooleanType, [RuntimeType.BOOLEAN], false, false, param);
|
|
67
|
+
}
|
|
68
|
+
convertorArg(param, writer) {
|
|
69
|
+
return writer.castToBoolean(param);
|
|
70
|
+
}
|
|
71
|
+
convertorSerialize(param, value, printer) {
|
|
72
|
+
printer.writeMethodCall(`${param}Serializer`, "writeBoolean", [value]);
|
|
73
|
+
}
|
|
74
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
75
|
+
return assigneer(writer.makeString(`${deserializerName}.readBoolean()`));
|
|
76
|
+
}
|
|
77
|
+
nativeType() {
|
|
78
|
+
return idl.IDLBooleanType;
|
|
79
|
+
}
|
|
80
|
+
interopType() {
|
|
81
|
+
return idl.IDLBooleanType;
|
|
82
|
+
}
|
|
83
|
+
isPointerType() {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export class UndefinedConvertor extends BaseArgConvertor {
|
|
88
|
+
constructor(param) {
|
|
89
|
+
super(idl.IDLUndefinedType, [RuntimeType.UNDEFINED], false, false, param);
|
|
90
|
+
}
|
|
91
|
+
convertorArg(param, writer) {
|
|
92
|
+
return writer.makeUndefined().asString();
|
|
93
|
+
}
|
|
94
|
+
convertorSerialize(param, value, printer) { }
|
|
95
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
96
|
+
return assigneer(writer.makeUndefined());
|
|
97
|
+
}
|
|
98
|
+
nativeType() {
|
|
99
|
+
return idl.IDLUndefinedType;
|
|
100
|
+
}
|
|
101
|
+
interopType() {
|
|
102
|
+
return idl.IDLUndefinedType;
|
|
103
|
+
}
|
|
104
|
+
isPointerType() {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export class VoidConvertor extends UndefinedConvertor {
|
|
109
|
+
convertorArg(param, writer) {
|
|
110
|
+
return writer.makeVoid().asString();
|
|
111
|
+
}
|
|
112
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
113
|
+
return assigneer(writer.makeVoid());
|
|
114
|
+
}
|
|
115
|
+
nativeType() {
|
|
116
|
+
return idl.IDLVoidType;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export class StringConvertor extends BaseArgConvertor {
|
|
120
|
+
constructor(param) {
|
|
121
|
+
super(idl.IDLStringType, [RuntimeType.STRING], false, false, param);
|
|
122
|
+
}
|
|
123
|
+
convertorArg(param, writer) {
|
|
124
|
+
return writer.language == Language.CPP
|
|
125
|
+
? writer.makeUnsafeCast_(writer.makeString(`&${param}`), this.idlType, PrintHint.AsConstPointer)
|
|
126
|
+
: param;
|
|
127
|
+
}
|
|
128
|
+
convertorSerialize(param, value, writer) {
|
|
129
|
+
writer.writeMethodCall(`${param}Serializer`, `writeString`, [value]);
|
|
130
|
+
}
|
|
131
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
132
|
+
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readString()`), this.idlType, { optional: false }));
|
|
133
|
+
}
|
|
134
|
+
nativeType() {
|
|
135
|
+
return idl.IDLStringType;
|
|
136
|
+
}
|
|
137
|
+
interopType() {
|
|
138
|
+
return idl.IDLStringType;
|
|
139
|
+
}
|
|
140
|
+
isPointerType() {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
144
|
+
return this.literalValue
|
|
145
|
+
? writer.makeString(`${value} === "${this.literalValue}"`)
|
|
146
|
+
: undefined;
|
|
147
|
+
}
|
|
148
|
+
targetType(writer) {
|
|
149
|
+
if (this.literalValue) {
|
|
150
|
+
return writer.getNodeName(idl.IDLStringType);
|
|
151
|
+
}
|
|
152
|
+
return super.targetType(writer);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export class EnumConvertor extends BaseArgConvertor {
|
|
156
|
+
constructor(param, enumEntry) {
|
|
157
|
+
super(idl.createReferenceType(enumEntry.name, undefined, enumEntry), [idl.isStringEnum(enumEntry) ? RuntimeType.STRING : RuntimeType.NUMBER], false, false, param);
|
|
158
|
+
this.enumEntry = enumEntry;
|
|
159
|
+
}
|
|
160
|
+
convertorArg(param, writer) {
|
|
161
|
+
return writer.makeEnumCast(param, false, this);
|
|
162
|
+
}
|
|
163
|
+
convertorSerialize(param, value, writer) {
|
|
164
|
+
value =
|
|
165
|
+
idl.isStringEnum(this.enumEntry)
|
|
166
|
+
? writer.ordinalFromEnum(writer.makeString(value), idl.createReferenceType(this.enumEntry.name, undefined, this.enumEntry)).asString()
|
|
167
|
+
: writer.makeEnumCast(value, false, this);
|
|
168
|
+
writer.writeMethodCall(`${param}Serializer`, "writeInt32", [value]);
|
|
169
|
+
}
|
|
170
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
171
|
+
const readExpr = writer.makeMethodCall(`${deserializerName}`, "readInt32", []);
|
|
172
|
+
const enumExpr = idl.isStringEnum(this.enumEntry)
|
|
173
|
+
? writer.enumFromOrdinal(readExpr, idl.createReferenceType(this.enumEntry.name, undefined, this.enumEntry))
|
|
174
|
+
: writer.makeCast(readExpr, idl.createReferenceType(this.enumEntry.name, undefined, this.enumEntry));
|
|
175
|
+
return assigneer(enumExpr);
|
|
176
|
+
}
|
|
177
|
+
nativeType() {
|
|
178
|
+
return idl.createReferenceType(this.enumEntry.name, undefined, this.enumEntry);
|
|
179
|
+
}
|
|
180
|
+
interopType() {
|
|
181
|
+
return idl.IDLI32Type;
|
|
182
|
+
}
|
|
183
|
+
isPointerType() {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
targetType(writer) {
|
|
187
|
+
return writer.getNodeName(this.idlType); // this.enumTypeName(writer.language)
|
|
188
|
+
}
|
|
189
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
190
|
+
return writer.makeDiscriminatorConvertor(this, value, index);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export class NumberConvertor extends BaseArgConvertor {
|
|
194
|
+
constructor(param) {
|
|
195
|
+
// TODO: as we pass tagged values - request serialization to array for now.
|
|
196
|
+
// Optimize me later!
|
|
197
|
+
super(idl.IDLNumberType, [RuntimeType.NUMBER], false, false, param);
|
|
198
|
+
}
|
|
199
|
+
convertorArg(param, writer) {
|
|
200
|
+
return writer.language == Language.CPP
|
|
201
|
+
? writer.makeUnsafeCast_(writer.makeString(`&${param}`), this.idlType, PrintHint.AsConstPointer)
|
|
202
|
+
: param;
|
|
203
|
+
}
|
|
204
|
+
convertorSerialize(param, value, printer) {
|
|
205
|
+
printer.writeMethodCall(`${param}Serializer`, "writeNumber", [value]);
|
|
206
|
+
}
|
|
207
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
208
|
+
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readNumber()`), this.idlType, { optional: false }));
|
|
209
|
+
}
|
|
210
|
+
nativeType() {
|
|
211
|
+
return idl.IDLNumberType;
|
|
212
|
+
}
|
|
213
|
+
interopType() {
|
|
214
|
+
return idl.IDLNumberType;
|
|
215
|
+
}
|
|
216
|
+
isPointerType() {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export class NumericConvertor extends BaseArgConvertor {
|
|
221
|
+
constructor(param, type) {
|
|
222
|
+
// check numericPrimitiveTypes.include(type)
|
|
223
|
+
super(type, [RuntimeType.NUMBER], false, false, param);
|
|
224
|
+
this.interopNameConvertor = new InteropNameConvertor(createEmptyReferenceResolver());
|
|
225
|
+
}
|
|
226
|
+
convertorArg(param, writer) {
|
|
227
|
+
return param;
|
|
228
|
+
}
|
|
229
|
+
convertorSerialize(param, value, printer) {
|
|
230
|
+
printer.writeMethodCall(`${param}Serializer`, `write${this.interopNameConvertor.convert(this.idlType)}`, [value]);
|
|
231
|
+
}
|
|
232
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
233
|
+
return assigneer(writer.makeString(`${deserializerName}.read${this.interopNameConvertor.convert(this.idlType)}()`));
|
|
234
|
+
}
|
|
235
|
+
nativeType() {
|
|
236
|
+
return this.idlType;
|
|
237
|
+
}
|
|
238
|
+
interopType() {
|
|
239
|
+
return this.idlType;
|
|
240
|
+
}
|
|
241
|
+
isPointerType() {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
export class PointerConvertor extends BaseArgConvertor {
|
|
246
|
+
constructor(param) {
|
|
247
|
+
// check numericPrimitiveTypes.include(type)
|
|
248
|
+
super(idl.IDLPointerType, [RuntimeType.NUMBER, RuntimeType.OBJECT], false, false, param);
|
|
249
|
+
}
|
|
250
|
+
convertorArg(param, writer) {
|
|
251
|
+
return param;
|
|
252
|
+
}
|
|
253
|
+
convertorSerialize(param, value, printer) {
|
|
254
|
+
printer.writeMethodCall(`${param}Serializer`, `writePointer`, [value]);
|
|
255
|
+
}
|
|
256
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
257
|
+
return assigneer(writer.makeString(`${deserializerName}.readPointer()`));
|
|
258
|
+
}
|
|
259
|
+
nativeType() {
|
|
260
|
+
return this.idlType;
|
|
261
|
+
}
|
|
262
|
+
interopType() {
|
|
263
|
+
return this.idlType;
|
|
264
|
+
}
|
|
265
|
+
isPointerType() {
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
export class BufferConvertor extends BaseArgConvertor {
|
|
270
|
+
constructor(param) {
|
|
271
|
+
super(idl.IDLBufferType, [RuntimeType.OBJECT], false, true, param);
|
|
272
|
+
}
|
|
273
|
+
convertorArg(param, _) {
|
|
274
|
+
return param;
|
|
275
|
+
}
|
|
276
|
+
convertorSerialize(param, value, printer) {
|
|
277
|
+
printer.writeMethodCall(`${param}Serializer`, "writeBuffer", [value]);
|
|
278
|
+
}
|
|
279
|
+
convertorDeserialize(_, deserializerName, assigneer, writer) {
|
|
280
|
+
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readBuffer()`), this.idlType, { optional: false }));
|
|
281
|
+
}
|
|
282
|
+
nativeType() {
|
|
283
|
+
return idl.IDLBufferType;
|
|
284
|
+
}
|
|
285
|
+
interopType() {
|
|
286
|
+
return idl.IDLBufferType;
|
|
287
|
+
}
|
|
288
|
+
isPointerType() {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
292
|
+
return writer.instanceOf(this, value);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
export class AggregateConvertor extends BaseArgConvertor {
|
|
296
|
+
constructor(library, param, type, decl) {
|
|
297
|
+
super(type, [RuntimeType.OBJECT], false, true, param);
|
|
298
|
+
this.library = library;
|
|
299
|
+
this.decl = decl;
|
|
300
|
+
this.members = [];
|
|
301
|
+
// this.aliasName = ts.isTypeAliasDeclaration(this.type.parent) ? identName(this.type.parent.name) : undefined
|
|
302
|
+
this.memberConvertors = decl
|
|
303
|
+
.properties
|
|
304
|
+
// .filter(ts.isPropertySignature)
|
|
305
|
+
.map((member, index) => {
|
|
306
|
+
this.members[index] = [member.name, member.isOptional];
|
|
307
|
+
return library.typeConvertor(param, member.type, member.isOptional);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
convertorArg(param, writer) {
|
|
311
|
+
throw new Error("Do not use for aggregates");
|
|
312
|
+
}
|
|
313
|
+
convertorSerialize(param, value, printer) {
|
|
314
|
+
this.memberConvertors.forEach((it, index) => {
|
|
315
|
+
let memberName = this.members[index][0];
|
|
316
|
+
let memberAccess = `${value}.${memberName}`;
|
|
317
|
+
printer.writeStatement(printer.makeAssign(`${value}_${memberName}`, undefined, printer.makeString(memberAccess), true));
|
|
318
|
+
it.convertorSerialize(param, `${value}_${memberName}`, printer);
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
322
|
+
const statements = [];
|
|
323
|
+
if (writer.language === Language.CPP) {
|
|
324
|
+
statements.push(writer.makeAssign(bufferName, this.idlType, undefined, true, false));
|
|
325
|
+
}
|
|
326
|
+
// TODO: Needs to be reworked DeserializerBase.readFunction properly
|
|
327
|
+
if (writer.language === Language.ARKTS
|
|
328
|
+
&& this.memberConvertors.find(it => it instanceof FunctionConvertor)) {
|
|
329
|
+
return new BlockStatement([writer.makeThrowError("Not implemented yet")], false);
|
|
330
|
+
}
|
|
331
|
+
for (let i = 0; i < this.decl.properties.length; i++) {
|
|
332
|
+
const prop = this.decl.properties[i];
|
|
333
|
+
const propConvertor = this.memberConvertors[i];
|
|
334
|
+
statements.push(propConvertor.convertorDeserialize(`${bufferName}_${prop.name}_buf`, deserializerName, (expr) => {
|
|
335
|
+
if (writer.language === Language.CPP) {
|
|
336
|
+
// prefix initialization for CPP, just easier. Waiting for easy work with nullables
|
|
337
|
+
return writer.makeAssign(`${bufferName}.${writer.escapeKeyword(prop.name)}`, undefined, expr, false);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* todo: check UnionType name creation for union of unnamed nodes (isNamedNode() == false)
|
|
341
|
+
*/
|
|
342
|
+
const memberType = prop.isOptional
|
|
343
|
+
? idl.createUnionType([idl.IDLUndefinedType, prop.type], "$NOT TO BE PRINTED%")
|
|
344
|
+
: prop.type;
|
|
345
|
+
return writer.makeAssign(`${bufferName}_${prop.name}`, memberType, expr, true, true);
|
|
346
|
+
}, writer));
|
|
347
|
+
}
|
|
348
|
+
if (writer.language === Language.CPP) {
|
|
349
|
+
statements.push(assigneer(writer.makeString(bufferName)));
|
|
350
|
+
}
|
|
351
|
+
else if (writer.language == Language.CJ) {
|
|
352
|
+
const resultExpression = writer.makeString(`${writer.getNodeName(this.idlType)}(${this.decl.properties.map(prop => `${bufferName}_${prop.name}`).join(", ")})`);
|
|
353
|
+
statements.push(assigneer(resultExpression));
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
const resultExpression = this.makeAssigneeExpression(this.decl.properties.map(prop => {
|
|
357
|
+
return [prop.name, writer.makeString(`${bufferName}_${prop.name}`)];
|
|
358
|
+
}), writer);
|
|
359
|
+
statements.push(assigneer(resultExpression));
|
|
360
|
+
}
|
|
361
|
+
return new BlockStatement(statements, false);
|
|
362
|
+
}
|
|
363
|
+
makeAssigneeExpression(fields, writer) {
|
|
364
|
+
const content = fields.map(it => `${it[0]}: ${it[1].asString()}`).join(', ');
|
|
365
|
+
return writer.makeCast(writer.makeString(`{${content}}`), this.idlType);
|
|
366
|
+
}
|
|
367
|
+
nativeType() {
|
|
368
|
+
return idl.createReferenceType(this.decl.name, undefined, this.decl);
|
|
369
|
+
}
|
|
370
|
+
interopType() {
|
|
371
|
+
throw new Error("Must never be used");
|
|
372
|
+
}
|
|
373
|
+
isPointerType() {
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
getMembers() {
|
|
377
|
+
return this.members.map(it => it[0]);
|
|
378
|
+
}
|
|
379
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
380
|
+
const uniqueFields = this.members.filter(it => !duplicates.has(it[0]));
|
|
381
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it[0], it => it[1], duplicates);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
export class TupleConvertor extends AggregateConvertor {
|
|
385
|
+
constructor(library, param, type, decl) {
|
|
386
|
+
super(library, param, type, decl);
|
|
387
|
+
}
|
|
388
|
+
convertorArg(param, writer) {
|
|
389
|
+
throw new Error("Must never be used");
|
|
390
|
+
}
|
|
391
|
+
convertorSerialize(param, value, printer) {
|
|
392
|
+
this.memberConvertors.forEach((it, index) => {
|
|
393
|
+
printer.writeStatement(printer.makeAssign(`${value}_${index}`, undefined, printer.makeTupleAccess(value, index), true));
|
|
394
|
+
it.convertorSerialize(param, `${value}_${index}`, printer);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
makeAssigneeExpression(fields, writer) {
|
|
398
|
+
return writer.makeCast(writer.makeString(`[${fields.map(it => it[1].asString()).join(', ')}]`), this.idlType);
|
|
399
|
+
}
|
|
400
|
+
nativeType() {
|
|
401
|
+
return idl.createReferenceType(this.decl.name, undefined, this.decl);
|
|
402
|
+
}
|
|
403
|
+
interopType() {
|
|
404
|
+
throw new Error("Must never be used");
|
|
405
|
+
}
|
|
406
|
+
isPointerType() {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
getObjectAccessor(language, value, args) {
|
|
410
|
+
return (args === null || args === void 0 ? void 0 : args.index)
|
|
411
|
+
? language === Language.CPP
|
|
412
|
+
? `${value}.value${args.index}`
|
|
413
|
+
: `${value}[${args.index}]`
|
|
414
|
+
: value;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
export class InterfaceConvertor extends BaseArgConvertor {
|
|
418
|
+
constructor(library, name /* change to IDLReferenceType */, param, declaration) {
|
|
419
|
+
super(idl.createReferenceType(name, undefined, declaration), [RuntimeType.OBJECT], false, true, param);
|
|
420
|
+
this.library = library;
|
|
421
|
+
this.declaration = declaration;
|
|
422
|
+
}
|
|
423
|
+
convertorArg(param, writer) {
|
|
424
|
+
throw new Error("Must never be used");
|
|
425
|
+
}
|
|
426
|
+
convertorSerialize(param, value, printer) {
|
|
427
|
+
printer.writeMethodCall(`${param}Serializer`, `write${this.library.getInteropName(this.idlType)}`, [value]);
|
|
428
|
+
}
|
|
429
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
430
|
+
return assigneer(writer.makeMethodCall(`${deserializerName}`, `read${this.library.getInteropName(this.idlType)}`, []));
|
|
431
|
+
}
|
|
432
|
+
nativeType() {
|
|
433
|
+
return this.idlType;
|
|
434
|
+
}
|
|
435
|
+
interopType() {
|
|
436
|
+
throw new Error("Must never be used");
|
|
437
|
+
}
|
|
438
|
+
isPointerType() {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
getMembers() {
|
|
442
|
+
var _a, _b;
|
|
443
|
+
return (_b = (_a = this.declaration) === null || _a === void 0 ? void 0 : _a.properties.map(it => it.name)) !== null && _b !== void 0 ? _b : [];
|
|
444
|
+
}
|
|
445
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
446
|
+
var _a;
|
|
447
|
+
// Try to figure out interface by examining field sets
|
|
448
|
+
const uniqueFields = (_a = this.declaration) === null || _a === void 0 ? void 0 : _a.properties.filter(it => !duplicates.has(it.name));
|
|
449
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
export class ClassConvertor extends InterfaceConvertor {
|
|
453
|
+
constructor(library, name, param, declaration) {
|
|
454
|
+
super(library, name, param, declaration);
|
|
455
|
+
}
|
|
456
|
+
unionDiscriminator(value, index, writer, duplicateMembers) {
|
|
457
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicateMembers)]);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
export class ArrayConvertor extends BaseArgConvertor {
|
|
461
|
+
constructor(library, param, type, elementType) {
|
|
462
|
+
super(idl.createContainerType('sequence', [elementType]), [RuntimeType.OBJECT], false, true, param);
|
|
463
|
+
this.library = library;
|
|
464
|
+
this.type = type;
|
|
465
|
+
this.elementType = elementType;
|
|
466
|
+
this.elementConvertor = library.typeConvertor(param, elementType);
|
|
467
|
+
}
|
|
468
|
+
convertorArg(param, writer) {
|
|
469
|
+
throw new Error("Must never be used");
|
|
470
|
+
}
|
|
471
|
+
convertorSerialize(param, value, printer) {
|
|
472
|
+
// Array length.
|
|
473
|
+
const valueLength = printer.makeArrayLength(value).asString();
|
|
474
|
+
const loopCounter = "i";
|
|
475
|
+
printer.writeMethodCall(`${param}Serializer`, "writeInt32", [printer.castToInt(valueLength, 32)]);
|
|
476
|
+
printer.writeStatement(printer.makeLoop(loopCounter, valueLength));
|
|
477
|
+
printer.pushIndent();
|
|
478
|
+
printer.writeStatement(printer.makeAssign(`${value}_element`, this.elementType, printer.makeArrayAccess(value, loopCounter), true));
|
|
479
|
+
this.elementConvertor.convertorSerialize(param, this.elementConvertor.getObjectAccessor(printer.language, `${value}_element`), printer);
|
|
480
|
+
printer.popIndent();
|
|
481
|
+
printer.print(`}`);
|
|
482
|
+
}
|
|
483
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
484
|
+
const lengthBuffer = `${bufferName}_length`;
|
|
485
|
+
const counterBuffer = `${bufferName}_i`;
|
|
486
|
+
const statements = [];
|
|
487
|
+
const arrayType = this.idlType;
|
|
488
|
+
statements.push(writer.makeAssign(lengthBuffer, idl.IDLI32Type, writer.makeString(`${deserializerName}.readInt32()`), true));
|
|
489
|
+
statements.push(writer.makeAssign(bufferName, arrayType, writer.makeArrayInit(this.type), true, false));
|
|
490
|
+
statements.push(writer.makeArrayResize(bufferName, writer.getNodeName(arrayType), lengthBuffer, deserializerName));
|
|
491
|
+
statements.push(writer.makeLoop(counterBuffer, lengthBuffer, this.elementConvertor.convertorDeserialize(`${bufferName}_buf`, deserializerName, (expr) => {
|
|
492
|
+
return writer.makeAssign(writer.makeArrayAccess(bufferName, counterBuffer).asString(), undefined, expr, false);
|
|
493
|
+
}, writer)));
|
|
494
|
+
statements.push(assigneer(writer.makeString(bufferName)));
|
|
495
|
+
return new BlockStatement(statements, false);
|
|
496
|
+
}
|
|
497
|
+
nativeType() {
|
|
498
|
+
return idl.createContainerType('sequence', [this.elementType]);
|
|
499
|
+
}
|
|
500
|
+
interopType() {
|
|
501
|
+
throw new Error("Must never be used");
|
|
502
|
+
}
|
|
503
|
+
isPointerType() {
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
507
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
|
|
508
|
+
}
|
|
509
|
+
getObjectAccessor(language, value, args) {
|
|
510
|
+
const array = language === Language.CPP ? ".array" : "";
|
|
511
|
+
return (args === null || args === void 0 ? void 0 : args.index) ? `${value}${array}${args.index}` : value;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
export class MapConvertor extends BaseArgConvertor {
|
|
515
|
+
constructor(library, param, type, keyType, valueType) {
|
|
516
|
+
super(idl.createContainerType('record', [keyType, valueType]), [RuntimeType.OBJECT], false, true, param);
|
|
517
|
+
this.library = library;
|
|
518
|
+
this.keyType = keyType;
|
|
519
|
+
this.valueType = valueType;
|
|
520
|
+
this.keyConvertor = library.typeConvertor(param, keyType);
|
|
521
|
+
this.valueConvertor = library.typeConvertor(param, valueType);
|
|
522
|
+
}
|
|
523
|
+
convertorArg(param, writer) {
|
|
524
|
+
throw new Error("Must never be used");
|
|
525
|
+
}
|
|
526
|
+
convertorSerialize(param, value, printer) {
|
|
527
|
+
// Map size.
|
|
528
|
+
const mapSize = printer.makeMapSize(value);
|
|
529
|
+
printer.writeMethodCall(`${param}Serializer`, "writeInt32", [mapSize.asString()]);
|
|
530
|
+
printer.writeStatement(printer.makeMapForEach(value, `${value}_key`, `${value}_value`, () => {
|
|
531
|
+
this.keyConvertor.convertorSerialize(param, `${value}_key`, printer);
|
|
532
|
+
this.valueConvertor.convertorSerialize(param, `${value}_value`, printer);
|
|
533
|
+
}));
|
|
534
|
+
}
|
|
535
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
536
|
+
const mapTypeName = writer.getNodeName(this.idlType);
|
|
537
|
+
const keyType = this.keyType;
|
|
538
|
+
const valueType = this.valueType;
|
|
539
|
+
const sizeBuffer = `${bufferName}_size`;
|
|
540
|
+
const keyBuffer = `${bufferName}_key`;
|
|
541
|
+
const valueBuffer = `${bufferName}_value`;
|
|
542
|
+
const counterBuffer = `${bufferName}_i`;
|
|
543
|
+
const keyAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "keys" });
|
|
544
|
+
const valueAccessor = this.getObjectAccessor(writer.language, bufferName, { index: counterBuffer, field: "values" });
|
|
545
|
+
return new BlockStatement([
|
|
546
|
+
writer.makeAssign(sizeBuffer, idl.IDLI32Type, writer.makeString(`${deserializerName}.readInt32()`), true, true),
|
|
547
|
+
writer.makeAssign(bufferName, this.idlType, writer.makeMapInit(this.idlType), true, false),
|
|
548
|
+
writer.makeMapResize(mapTypeName, keyType, valueType, bufferName, sizeBuffer, deserializerName),
|
|
549
|
+
writer.makeLoop(counterBuffer, sizeBuffer, new BlockStatement([
|
|
550
|
+
this.keyConvertor.convertorDeserialize(`${keyBuffer}_buf`, deserializerName, (expr) => {
|
|
551
|
+
return writer.makeAssign(keyBuffer, keyType, expr, true, true);
|
|
552
|
+
}, writer),
|
|
553
|
+
this.valueConvertor.convertorDeserialize(`${valueBuffer}_buf`, deserializerName, (expr) => {
|
|
554
|
+
return writer.makeAssign(valueBuffer, valueType, expr, true, true);
|
|
555
|
+
}, writer),
|
|
556
|
+
writer.makeMapInsert(keyAccessor, keyBuffer, valueAccessor, valueBuffer),
|
|
557
|
+
], false)),
|
|
558
|
+
assigneer(writer.makeString(bufferName))
|
|
559
|
+
], false);
|
|
560
|
+
}
|
|
561
|
+
nativeType() {
|
|
562
|
+
return idl.createContainerType('record', [this.keyType, this.valueType]);
|
|
563
|
+
}
|
|
564
|
+
interopType() {
|
|
565
|
+
throw new Error("Must never be used");
|
|
566
|
+
}
|
|
567
|
+
isPointerType() {
|
|
568
|
+
return true;
|
|
569
|
+
}
|
|
570
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
571
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.makeString(`${value} instanceof Map`)]);
|
|
572
|
+
}
|
|
573
|
+
getObjectAccessor(language, value, args) {
|
|
574
|
+
return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) && (args === null || args === void 0 ? void 0 : args.field)
|
|
575
|
+
? `${value}.${args.field}[${args.index}]`
|
|
576
|
+
: value;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
export class DateConvertor extends BaseArgConvertor {
|
|
580
|
+
constructor(param) {
|
|
581
|
+
super(idl.IDLBigintType, [RuntimeType.NUMBER], false, false, param);
|
|
582
|
+
}
|
|
583
|
+
convertorArg(param, writer) {
|
|
584
|
+
if (writer.language === Language.CPP) {
|
|
585
|
+
return param;
|
|
586
|
+
}
|
|
587
|
+
return `${param}.getTime()`;
|
|
588
|
+
}
|
|
589
|
+
convertorSerialize(param, value, writer) {
|
|
590
|
+
if (writer.language === Language.CPP) {
|
|
591
|
+
writer.writeMethodCall(`${param}Serializer`, "writeInt64", [value]);
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
writer.writeMethodCall(`${param}Serializer`, "writeInt64", [
|
|
595
|
+
writer.makeCast(writer.makeString(`${value}.getTime()`), idl.IDLI64Type).asString()
|
|
596
|
+
]);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
600
|
+
const deserializeTime = writer.makeMethodCall(`${deserializerName}`, "readInt64", []);
|
|
601
|
+
if (writer.language === Language.CPP) {
|
|
602
|
+
return assigneer(deserializeTime);
|
|
603
|
+
}
|
|
604
|
+
return assigneer(writer.makeString(`new Date(${deserializeTime.asString()})`));
|
|
605
|
+
}
|
|
606
|
+
nativeType() {
|
|
607
|
+
return idl.createReferenceType('Date');
|
|
608
|
+
}
|
|
609
|
+
interopType() {
|
|
610
|
+
return idl.IDLDate;
|
|
611
|
+
}
|
|
612
|
+
isPointerType() {
|
|
613
|
+
return false;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
export class ProxyConvertor extends BaseArgConvertor {
|
|
617
|
+
constructor(convertor, suggestedName) {
|
|
618
|
+
super(suggestedName ? idl.createReferenceType(suggestedName, undefined, convertor.idlType) : convertor.idlType, convertor.runtimeTypes, convertor.isScoped, convertor.useArray, convertor.param);
|
|
619
|
+
this.convertor = convertor;
|
|
620
|
+
}
|
|
621
|
+
convertorArg(param, writer) {
|
|
622
|
+
return this.convertor.convertorArg(param, writer);
|
|
623
|
+
}
|
|
624
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
625
|
+
return this.convertor.convertorDeserialize(bufferName, deserializerName, assigneer, writer);
|
|
626
|
+
}
|
|
627
|
+
convertorSerialize(param, value, printer) {
|
|
628
|
+
this.convertor.convertorSerialize(param, value, printer);
|
|
629
|
+
}
|
|
630
|
+
nativeType() {
|
|
631
|
+
return this.convertor.nativeType();
|
|
632
|
+
}
|
|
633
|
+
interopType() {
|
|
634
|
+
return this.convertor.interopType();
|
|
635
|
+
}
|
|
636
|
+
isPointerType() {
|
|
637
|
+
return this.convertor.isPointerType();
|
|
638
|
+
}
|
|
639
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
640
|
+
return this.convertor.unionDiscriminator(value, index, writer, duplicates);
|
|
641
|
+
}
|
|
642
|
+
getMembers() {
|
|
643
|
+
return this.convertor.getMembers();
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
export class TypeAliasConvertor extends ProxyConvertor {
|
|
647
|
+
constructor(library, param, typedef) {
|
|
648
|
+
super(library.typeConvertor(param, typedef.type), typedef.name);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
export class CustomTypeConvertor extends BaseArgConvertor {
|
|
652
|
+
constructor(param, customTypeName, isGenericType = false, tsType) {
|
|
653
|
+
super(idl.createReferenceType(tsType !== null && tsType !== void 0 ? tsType : "Object"), [RuntimeType.OBJECT], false, true, param);
|
|
654
|
+
this.customTypeName = customTypeName;
|
|
655
|
+
this.isGenericType = isGenericType;
|
|
656
|
+
warnCustomObject(`${tsType}`);
|
|
657
|
+
}
|
|
658
|
+
convertorArg(param, writer) {
|
|
659
|
+
throw new Error("Must never be used");
|
|
660
|
+
}
|
|
661
|
+
/** todo: check */
|
|
662
|
+
convertorSerialize(param, value, printer) {
|
|
663
|
+
printer.writeMethodCall(`${param}Serializer`, `writeCustomObject`, [`"${this.customTypeName}"`, printer.makeCastCustomObject(value, this.isGenericType).asString()]);
|
|
664
|
+
}
|
|
665
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
666
|
+
const type = writer.language === Language.CPP
|
|
667
|
+
? this.nativeType()
|
|
668
|
+
: this.idlType;
|
|
669
|
+
return assigneer(writer.makeCast(writer.makeMethodCall(`${deserializerName}`, "readCustomObject", [writer.makeString(`"${this.customTypeName}"`)]), type, { optional: false }));
|
|
670
|
+
}
|
|
671
|
+
nativeType() {
|
|
672
|
+
return idl.IDLCustomObjectType;
|
|
673
|
+
}
|
|
674
|
+
interopType() {
|
|
675
|
+
throw new Error("Must never be used");
|
|
676
|
+
}
|
|
677
|
+
isPointerType() {
|
|
678
|
+
return true;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
export class OptionConvertor extends BaseArgConvertor {
|
|
682
|
+
// TODO: be smarter here, and for smth like Length|undefined or number|undefined pass without serializer.
|
|
683
|
+
constructor(library, param, type) {
|
|
684
|
+
let conv = library.typeConvertor(param, type);
|
|
685
|
+
let runtimeTypes = conv.runtimeTypes;
|
|
686
|
+
if (!runtimeTypes.includes(RuntimeType.UNDEFINED)) {
|
|
687
|
+
runtimeTypes.push(RuntimeType.UNDEFINED);
|
|
688
|
+
}
|
|
689
|
+
super(idl.createOptionalType(conv.idlType), runtimeTypes, conv.isScoped, true, param);
|
|
690
|
+
this.library = library;
|
|
691
|
+
this.type = type;
|
|
692
|
+
this.typeConvertor = conv;
|
|
693
|
+
}
|
|
694
|
+
convertorArg(param, writer) {
|
|
695
|
+
throw new Error("Must never be used");
|
|
696
|
+
}
|
|
697
|
+
convertorSerialize(param, value, printer) {
|
|
698
|
+
const valueType = `${value}_type`;
|
|
699
|
+
const serializedType = (printer.language == Language.JAVA ? undefined : idl.IDLI32Type);
|
|
700
|
+
printer.writeStatement(printer.makeAssign(valueType, serializedType, printer.makeRuntimeType(RuntimeType.UNDEFINED), true, false));
|
|
701
|
+
printer.runtimeType(this, valueType, value);
|
|
702
|
+
printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(valueType, 8)]);
|
|
703
|
+
printer.print(`if (${printer.makeRuntimeTypeCondition(valueType, false, RuntimeType.UNDEFINED, value).asString()}) {`);
|
|
704
|
+
printer.pushIndent();
|
|
705
|
+
printer.writeStatement(printer.makeAssign(`${value}_value`, undefined, printer.makeValueFromOption(value, this.typeConvertor), true));
|
|
706
|
+
this.typeConvertor.convertorSerialize(param, this.typeConvertor.getObjectAccessor(printer.language, `${value}_value`), printer);
|
|
707
|
+
printer.popIndent();
|
|
708
|
+
printer.print(`}`);
|
|
709
|
+
}
|
|
710
|
+
convertorCArg(param) {
|
|
711
|
+
throw new Error("Must never be used");
|
|
712
|
+
}
|
|
713
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
714
|
+
const runtimeBufferName = `${bufferName}_runtimeType`;
|
|
715
|
+
const statements = [];
|
|
716
|
+
statements.push(writer.makeAssign(runtimeBufferName, undefined, writer.makeCast(writer.makeString(`${deserializerName}.readInt8()`), writer.getRuntimeType()), true));
|
|
717
|
+
const bufferType = this.nativeType();
|
|
718
|
+
if (writer.language == Language.CJ) {
|
|
719
|
+
statements.push(writer.makeAssign(bufferName, bufferType, idl.isOptionalType(bufferType) ? writer.makeString('Option.None') : undefined, true, false));
|
|
720
|
+
}
|
|
721
|
+
else {
|
|
722
|
+
statements.push(writer.makeAssign(bufferName, bufferType, undefined, true, false));
|
|
723
|
+
}
|
|
724
|
+
const thenStatement = new BlockStatement([
|
|
725
|
+
this.typeConvertor.convertorDeserialize(`${bufferName}_`, deserializerName, (expr) => {
|
|
726
|
+
const receiver = writer.language === Language.CPP
|
|
727
|
+
? `${bufferName}.value` : bufferName;
|
|
728
|
+
return writer.makeAssign(receiver, undefined, expr, false);
|
|
729
|
+
}, writer)
|
|
730
|
+
]);
|
|
731
|
+
statements.push(writer.makeSetOptionTag(bufferName, writer.makeCast(writer.makeString(runtimeBufferName), writer.getTagType())));
|
|
732
|
+
statements.push(writer.makeCondition(writer.makeRuntimeTypeDefinedCheck(runtimeBufferName), thenStatement));
|
|
733
|
+
statements.push(assigneer(writer.makeString(bufferName)));
|
|
734
|
+
return writer.makeBlock(statements, false);
|
|
735
|
+
}
|
|
736
|
+
nativeType() {
|
|
737
|
+
return idl.createOptionalType(this.type);
|
|
738
|
+
}
|
|
739
|
+
interopType() {
|
|
740
|
+
return idl.createOptionalType(this.type);
|
|
741
|
+
}
|
|
742
|
+
isPointerType() {
|
|
743
|
+
return true;
|
|
744
|
+
}
|
|
745
|
+
getObjectAccessor(language, value, args) {
|
|
746
|
+
return language === Language.CPP ? `${value}.value` : value;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
export class UnionConvertor extends BaseArgConvertor {
|
|
750
|
+
constructor(library, param, type) {
|
|
751
|
+
super(idl.IDLObjectType, [], false, true, param);
|
|
752
|
+
this.library = library;
|
|
753
|
+
this.type = type;
|
|
754
|
+
this.memberConvertors = type.types.map(member => library.typeConvertor(param, member));
|
|
755
|
+
this.unionChecker = new UnionRuntimeTypeChecker(this.memberConvertors);
|
|
756
|
+
this.runtimeTypes = this.memberConvertors.flatMap(it => it.runtimeTypes);
|
|
757
|
+
this.idlType = type;
|
|
758
|
+
}
|
|
759
|
+
convertorArg(param, writer) {
|
|
760
|
+
throw new Error("Do not use for union");
|
|
761
|
+
}
|
|
762
|
+
convertorSerialize(param, value, printer) {
|
|
763
|
+
var _a;
|
|
764
|
+
printer.writeStatement(printer.makeAssign(`${value}_type`, idl.IDLI32Type, printer.makeUnionTypeDefaultInitializer(), true, false));
|
|
765
|
+
printer.writeStatement(printer.makeUnionSelector(value, `${value}_type`));
|
|
766
|
+
this.memberConvertors.forEach((it, index) => {
|
|
767
|
+
const maybeElse = (index > 0 && this.memberConvertors[index - 1].runtimeTypes.length > 0) ? "else " : "";
|
|
768
|
+
const conditions = this.unionChecker.makeDiscriminator(value, index, printer);
|
|
769
|
+
printer.print(`${maybeElse}if (${conditions.asString()}) {`);
|
|
770
|
+
printer.pushIndent();
|
|
771
|
+
printer.writeMethodCall(`${param}Serializer`, "writeInt8", [printer.castToInt(index.toString(), 8)]);
|
|
772
|
+
if (!(it instanceof UndefinedConvertor)) {
|
|
773
|
+
printer.writeStatement(printer.makeAssign(`${value}_${index}`, undefined, printer.makeUnionVariantCast(it.getObjectAccessor(printer.language, value), printer.getNodeName(it.idlType), it, index), true));
|
|
774
|
+
it.convertorSerialize(param, `${value}_${index}`, printer);
|
|
775
|
+
}
|
|
776
|
+
printer.popIndent();
|
|
777
|
+
printer.print(`}`);
|
|
778
|
+
});
|
|
779
|
+
this.unionChecker.reportConflicts((_a = this.library.getCurrentContext()) !== null && _a !== void 0 ? _a : "<unknown context>");
|
|
780
|
+
}
|
|
781
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
782
|
+
const statements = [];
|
|
783
|
+
let selectorBuffer = `${bufferName}_selector`;
|
|
784
|
+
const maybeOptionalUnion = writer.language === Language.CPP || writer.language == Language.CJ
|
|
785
|
+
? this.type
|
|
786
|
+
: idl.createOptionalType(this.type);
|
|
787
|
+
statements.push(writer.makeAssign(selectorBuffer, idl.IDLI8Type, writer.makeString(`${deserializerName}.readInt8()`), true));
|
|
788
|
+
statements.push(writer.makeAssign(bufferName, maybeOptionalUnion, undefined, true, false));
|
|
789
|
+
if (writer.language === Language.CPP)
|
|
790
|
+
statements.push(writer.makeAssign(`${bufferName}.selector`, undefined, writer.makeString(selectorBuffer), false));
|
|
791
|
+
const branches = this.memberConvertors.map((it, index) => {
|
|
792
|
+
const receiver = this.getObjectAccessor(writer.language, bufferName, { index: `${index}` });
|
|
793
|
+
const expr = writer.makeString(`${selectorBuffer} == ${index}`);
|
|
794
|
+
const stmt = new BlockStatement([
|
|
795
|
+
writer.makeSetUnionSelector(bufferName, `${index}`),
|
|
796
|
+
it.convertorDeserialize(`${bufferName}_u`, deserializerName, (expr) => {
|
|
797
|
+
if (writer.language == Language.CJ) {
|
|
798
|
+
return writer.makeAssign(receiver, undefined, writer.makeFunctionCall(writer.getNodeName(this.type), [expr]), false);
|
|
799
|
+
}
|
|
800
|
+
else {
|
|
801
|
+
return writer.makeAssign(receiver, undefined, expr, false);
|
|
802
|
+
}
|
|
803
|
+
}, writer),
|
|
804
|
+
], false);
|
|
805
|
+
return { expr, stmt };
|
|
806
|
+
});
|
|
807
|
+
statements.push(writer.makeMultiBranchCondition(branches, writer.makeThrowError(`One of the branches for ${bufferName} has to be chosen through deserialisation.`)));
|
|
808
|
+
statements.push(assigneer(writer.makeCast(writer.makeString(bufferName), this.type)));
|
|
809
|
+
return new BlockStatement(statements, false);
|
|
810
|
+
}
|
|
811
|
+
nativeType() {
|
|
812
|
+
return this.type;
|
|
813
|
+
}
|
|
814
|
+
interopType() {
|
|
815
|
+
throw new Error("Union");
|
|
816
|
+
}
|
|
817
|
+
isPointerType() {
|
|
818
|
+
return true;
|
|
819
|
+
}
|
|
820
|
+
getObjectAccessor(language, value, args) {
|
|
821
|
+
return language === Language.CPP && (args === null || args === void 0 ? void 0 : args.index) ? `${value}.value${args.index}` : value;
|
|
822
|
+
}
|
|
823
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
824
|
+
const checker = new UnionRuntimeTypeChecker(this.memberConvertors);
|
|
825
|
+
return writer.makeNaryOp("||", this.memberConvertors.map((_, n) => checker.makeDiscriminator(value, n, writer)));
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
export class FunctionConvertor extends BaseArgConvertor {
|
|
829
|
+
constructor(library, param, type) {
|
|
830
|
+
// TODO: pass functions as integers to native side.
|
|
831
|
+
super(idl.IDLFunctionType, [RuntimeType.FUNCTION], false, false, param);
|
|
832
|
+
this.library = library;
|
|
833
|
+
this.type = type;
|
|
834
|
+
}
|
|
835
|
+
convertorArg(param, writer) {
|
|
836
|
+
return writer.language == Language.CPP ? `makeArkFunctionFromId(${param})` : `registerCallback(${param})`;
|
|
837
|
+
}
|
|
838
|
+
convertorSerialize(param, value, writer) {
|
|
839
|
+
writer.writeMethodCall(`${param}Serializer`, "writeFunction", [value]);
|
|
840
|
+
}
|
|
841
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
842
|
+
return assigneer(writer.makeCast(writer.makeString(`${deserializerName}.readFunction()`), this.type, { optional: true }));
|
|
843
|
+
}
|
|
844
|
+
nativeType() {
|
|
845
|
+
return idl.IDLFunctionType;
|
|
846
|
+
}
|
|
847
|
+
interopType() {
|
|
848
|
+
return idl.IDLFunctionType;
|
|
849
|
+
}
|
|
850
|
+
isPointerType() {
|
|
851
|
+
return false;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
export class MaterializedClassConvertor extends BaseArgConvertor {
|
|
855
|
+
constructor(param, declaration) {
|
|
856
|
+
super(idl.createReferenceType(declaration.name, undefined, declaration), [RuntimeType.OBJECT], false, true, param);
|
|
857
|
+
this.declaration = declaration;
|
|
858
|
+
}
|
|
859
|
+
convertorArg(param, writer) {
|
|
860
|
+
throw new Error("Must never be used");
|
|
861
|
+
}
|
|
862
|
+
convertorSerialize(param, value, printer) {
|
|
863
|
+
printer.writeStatement(printer.makeStatement(printer.makeMethodCall(`${param}Serializer`, `write${this.declaration.name}`, [
|
|
864
|
+
printer.makeString(value)
|
|
865
|
+
])));
|
|
866
|
+
}
|
|
867
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
868
|
+
const readStatement = writer.makeCast(writer.makeMethodCall(`${deserializerName}`, `read${this.declaration.name}`, []), idl.createReferenceType(this.declaration.name, undefined, this.declaration));
|
|
869
|
+
return assigneer(readStatement);
|
|
870
|
+
}
|
|
871
|
+
nativeType() {
|
|
872
|
+
return idl.createReferenceType(this.declaration.name, undefined, this.declaration);
|
|
873
|
+
}
|
|
874
|
+
interopType() {
|
|
875
|
+
throw new Error("Must never be used");
|
|
876
|
+
}
|
|
877
|
+
isPointerType() {
|
|
878
|
+
return true;
|
|
879
|
+
}
|
|
880
|
+
unionDiscriminator(value, index, writer, duplicates) {
|
|
881
|
+
if (idl.isInterface(this.declaration)) {
|
|
882
|
+
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Class) {
|
|
883
|
+
return writer.discriminatorFromExpressions(value, RuntimeType.OBJECT, [writer.instanceOf(this, value, duplicates)]);
|
|
884
|
+
}
|
|
885
|
+
if (this.declaration.subkind === idl.IDLInterfaceSubkind.Interface) {
|
|
886
|
+
const uniqueFields = this.declaration.properties.filter(it => !duplicates.has(it.name));
|
|
887
|
+
return this.discriminatorFromFields(value, writer, uniqueFields, it => it.name, it => it.isOptional, duplicates);
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
export class ImportTypeConvertor extends BaseArgConvertor {
|
|
893
|
+
constructor(param, importedName) {
|
|
894
|
+
super(idl.IDLObjectType, [RuntimeType.OBJECT], false, true, param);
|
|
895
|
+
this.importedName = importedName;
|
|
896
|
+
warnCustomObject(importedName, `imported`);
|
|
897
|
+
}
|
|
898
|
+
convertorArg(param, writer) {
|
|
899
|
+
throw new Error("Must never be used");
|
|
900
|
+
}
|
|
901
|
+
convertorSerialize(param, value, printer) {
|
|
902
|
+
printer.writeMethodCall(`${param}Serializer`, "writeCustomObject", [`"${this.importedName}"`, value]);
|
|
903
|
+
}
|
|
904
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer) {
|
|
905
|
+
return assigneer(writer.makeString(`${deserializerName}.readCustomObject("${this.importedName}")`));
|
|
906
|
+
}
|
|
907
|
+
nativeType() {
|
|
908
|
+
// treat ImportType as CustomObject
|
|
909
|
+
return idl.IDLCustomObjectType;
|
|
910
|
+
}
|
|
911
|
+
interopType() {
|
|
912
|
+
throw new Error("Must never be used");
|
|
913
|
+
}
|
|
914
|
+
isPointerType() {
|
|
915
|
+
return true;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
export class CallbackConvertor extends BaseArgConvertor {
|
|
919
|
+
constructor(library, param, decl) {
|
|
920
|
+
super(idl.createReferenceType(decl.name, undefined, decl), [RuntimeType.FUNCTION], false, true, param);
|
|
921
|
+
this.library = library;
|
|
922
|
+
this.decl = decl;
|
|
923
|
+
}
|
|
924
|
+
get isTransformed() {
|
|
925
|
+
return this.decl !== this.transformedDecl;
|
|
926
|
+
}
|
|
927
|
+
get transformedDecl() {
|
|
928
|
+
var _a;
|
|
929
|
+
return (_a = maybeTransformManagedCallback(this.decl)) !== null && _a !== void 0 ? _a : this.decl;
|
|
930
|
+
}
|
|
931
|
+
convertorArg(param, writer) {
|
|
932
|
+
throw new Error("Must never be used");
|
|
933
|
+
}
|
|
934
|
+
convertorSerialize(param, value, writer) {
|
|
935
|
+
if (writer.language == Language.CPP) {
|
|
936
|
+
writer.writeMethodCall(`${param}Serializer`, "writeCallbackResource", [`${value}.resource`]);
|
|
937
|
+
writer.writeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.call`), idl.IDLPointerType, { unsafe: true }).asString()]);
|
|
938
|
+
writer.writeMethodCall(`${param}Serializer`, "writePointer", [writer.makeCast(new StringExpression(`${value}.callSync`), idl.IDLPointerType, { unsafe: true }).asString()]);
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
if (this.isTransformed)
|
|
942
|
+
value = `CallbackTransformer.transformFrom${this.library.getInteropName(this.decl)}(${value})`;
|
|
943
|
+
writer.writeMethodCall(`${param}Serializer`, `holdAndWriteCallback`, [`${value}`]);
|
|
944
|
+
}
|
|
945
|
+
convertorDeserialize(bufferName, deserializerName, assigneer, writer, useSyncVersion = false) {
|
|
946
|
+
if (writer.language == Language.CPP) {
|
|
947
|
+
const callerInvocation = writer.makeString(`getManagedCallbackCaller(${generateCallbackKindAccess(this.transformedDecl, writer.language)})`);
|
|
948
|
+
const callerSyncInvocation = writer.makeString(`getManagedCallbackCallerSync(${generateCallbackKindAccess(this.transformedDecl, writer.language)})`);
|
|
949
|
+
const resourceReadExpr = writer.makeMethodCall(`${deserializerName}`, `readCallbackResource`, []);
|
|
950
|
+
const callReadExpr = writer.makeCast(writer.makeMethodCall(`${deserializerName}`, `readPointerOrDefault`, [writer.makeCast(callerInvocation, idl.IDLPointerType, { unsafe: true })]), idl.IDLUndefinedType /* not used */, {
|
|
951
|
+
unsafe: true,
|
|
952
|
+
overrideTypeName: `void(*)(${generateCallbackAPIArguments(this.library, this.transformedDecl).join(", ")})`
|
|
953
|
+
});
|
|
954
|
+
const callSyncReadExpr = writer.makeCast(writer.makeMethodCall(`${deserializerName}`, `readPointerOrDefault`, [writer.makeCast(callerSyncInvocation, idl.IDLPointerType, { unsafe: true })]), idl.IDLUndefinedType /* not used */, {
|
|
955
|
+
unsafe: true,
|
|
956
|
+
overrideTypeName: `void(*)(${[`${generatorTypePrefix()}VMContext vmContext`].concat(generateCallbackAPIArguments(this.library, this.transformedDecl)).join(", ")})`
|
|
957
|
+
});
|
|
958
|
+
return assigneer(writer.makeString(`{${resourceReadExpr.asString()}, ${callReadExpr.asString()}, ${callSyncReadExpr.asString()}}`));
|
|
959
|
+
}
|
|
960
|
+
let result = writer.makeString(`${deserializerName}.read${this.library.getInteropName(this.transformedDecl)}(${useSyncVersion ? 'true' : ''})`);
|
|
961
|
+
if (this.isTransformed)
|
|
962
|
+
result = writer.makeMethodCall(`CallbackTransformer`, `transformTo${this.library.getInteropName(this.decl)}`, [result]);
|
|
963
|
+
return assigneer(result);
|
|
964
|
+
}
|
|
965
|
+
nativeType() {
|
|
966
|
+
return idl.createReferenceType(this.transformedDecl.name, undefined, this.decl);
|
|
967
|
+
}
|
|
968
|
+
isPointerType() {
|
|
969
|
+
return true;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
973
|
+
// UTILS
|
|
974
|
+
const customObjects = new Set();
|
|
975
|
+
function warnCustomObject(type, msg) {
|
|
976
|
+
if (!customObjects.has(type)) {
|
|
977
|
+
warn(`Use CustomObject for ${msg ? `${msg} ` : ``}type ${type}`);
|
|
978
|
+
customObjects.add(type);
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
export const CallbackKind = "CallbackKind";
|
|
982
|
+
export function generateCallbackKindName(callback) {
|
|
983
|
+
return `Kind_${callback.name}`;
|
|
984
|
+
}
|
|
985
|
+
export function generateCallbackKindAccess(callback, language) {
|
|
986
|
+
const name = generateCallbackKindName(callback);
|
|
987
|
+
if (language == Language.CPP)
|
|
988
|
+
return name;
|
|
989
|
+
return `${CallbackKind}.${name}`;
|
|
990
|
+
}
|
|
991
|
+
export function generateCallbackKindValue(callback) {
|
|
992
|
+
const name = generateCallbackKindName(callback);
|
|
993
|
+
return hashCodeFromString(name);
|
|
994
|
+
}
|
|
995
|
+
export function generateCallbackAPIArguments(library, callback) {
|
|
996
|
+
const nameConvertor = new CppInteropConvertor(library);
|
|
997
|
+
const args = [`const ${PrimitiveTypesInstance.Int32.getText()} resourceId`];
|
|
998
|
+
args.push(...callback.parameters.map(it => {
|
|
999
|
+
const target = library.toDeclaration(it.type);
|
|
1000
|
+
const type = library.typeConvertor(it.name, it.type, it.isOptional);
|
|
1001
|
+
const constPrefix = !idl.isEnum(target) ? "const " : "";
|
|
1002
|
+
return `${constPrefix}${nameConvertor.convert(type.nativeType())} ${type.param}`;
|
|
1003
|
+
}));
|
|
1004
|
+
if (!idl.isVoidType(callback.returnType)) {
|
|
1005
|
+
const type = library.typeConvertor(`continuation`, library.createContinuationCallbackReference(callback.returnType), false);
|
|
1006
|
+
args.push(`const ${nameConvertor.convert(type.nativeType())} ${type.param}`);
|
|
1007
|
+
}
|
|
1008
|
+
return args;
|
|
1009
|
+
}
|
|
1010
|
+
export function maybeTransformManagedCallback(callback) {
|
|
1011
|
+
if (callback.name === "CustomBuilder")
|
|
1012
|
+
return idl.createCallback("CustomNodeBuilder", [idl.createParameter("parentNode", idl.IDLPointerType)], idl.IDLPointerType, { extendedAttributes: [{ name: idl.IDLExtendedAttributes.Synthetic }] });
|
|
1013
|
+
return undefined;
|
|
1014
|
+
}
|
|
1015
|
+
//# sourceMappingURL=ArgConvertors.js.map
|