@idlizer/core 2.0.41 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +4 -1
  2. package/build/lib/src/LanguageWriters/ArgConvertors.js +61 -13
  3. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +7 -5
  4. package/build/lib/src/LanguageWriters/LanguageWriter.js +8 -3
  5. package/build/lib/src/LanguageWriters/convertors/CppConvertors.d.ts +2 -1
  6. package/build/lib/src/LanguageWriters/convertors/CppConvertors.js +27 -12
  7. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.d.ts +3 -1
  8. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +3 -1
  9. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.js +4 -4
  10. package/build/lib/src/LanguageWriters/convertors/TSConvertors.d.ts +11 -1
  11. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +44 -1
  12. package/build/lib/src/LanguageWriters/index.d.ts +2 -2
  13. package/build/lib/src/LanguageWriters/index.js +4 -5
  14. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +4 -4
  15. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +6 -5
  16. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +4 -3
  17. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +5 -8
  18. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +6 -5
  19. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +26 -30
  20. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +3 -3
  21. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +4 -4
  22. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +3 -3
  23. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +21 -12
  24. package/build/lib/src/config.d.ts +958 -12
  25. package/build/lib/src/config.js +24 -2
  26. package/build/lib/src/configDescriber.d.ts +85 -0
  27. package/build/lib/src/configDescriber.js +297 -0
  28. package/build/lib/src/from-idl/DtsPrinter.js +4 -2
  29. package/build/lib/src/from-idl/IDLLinter.d.ts +24 -0
  30. package/build/lib/src/from-idl/IDLLinter.js +81 -0
  31. package/build/lib/src/from-idl/deserialize.js +41 -4
  32. package/build/lib/src/from-idl/webidl2-utils.d.ts +1 -0
  33. package/build/lib/src/from-idl/webidl2-utils.js +3 -0
  34. package/build/lib/src/idl.d.ts +23 -26
  35. package/build/lib/src/idl.js +31 -29
  36. package/build/lib/src/idlize.d.ts +10 -1
  37. package/build/lib/src/idlize.js +54 -26
  38. package/build/lib/src/index.d.ts +2 -0
  39. package/build/lib/src/index.js +2 -0
  40. package/build/lib/src/options.d.ts +1 -0
  41. package/build/lib/src/peer-generation/Materialized.d.ts +2 -1
  42. package/build/lib/src/peer-generation/Materialized.js +3 -2
  43. package/build/lib/src/peer-generation/PeerFile.d.ts +1 -2
  44. package/build/lib/src/peer-generation/PeerFile.js +1 -2
  45. package/build/lib/src/peer-generation/PeerLibrary.d.ts +0 -1
  46. package/build/lib/src/peer-generation/PeerLibrary.js +16 -3
  47. package/build/lib/src/peer-generation/PeerMethod.js +2 -16
  48. package/build/lib/src/peer-generation/idl/common.js +2 -2
  49. package/build/lib/src/peer-generation/isMaterialized.d.ts +1 -0
  50. package/build/lib/src/peer-generation/isMaterialized.js +21 -0
  51. package/build/lib/src/util.d.ts +1 -0
  52. package/build/lib/src/util.js +9 -0
  53. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { IndentedPrinter } from "../../IndentedPrinter";
2
- import { LambdaExpression, LanguageExpression, LanguageStatement, LanguageWriter, MakeCastOptions, MethodModifier, MethodSignature, ObjectArgs } from "../LanguageWriter";
2
+ import { LambdaExpression, LanguageExpression, LanguageStatement, LanguageWriter, MakeCastOptions, Method, MethodModifier, MethodSignature, ObjectArgs } from "../LanguageWriter";
3
3
  import { TSLanguageWriter } from "./TsLanguageWriter";
4
4
  import { IDLEnum, IDLType } from '../../idl';
5
5
  import { ArgConvertor } from "../ArgConvertors";
@@ -28,6 +28,8 @@ export declare class ETSLambdaExpression extends LambdaExpression {
28
28
  asString(): string;
29
29
  }
30
30
  export declare function generateTypeCheckerName(typeName: string): string;
31
+ export declare function generateEnumToOrdinalName(typeName: string): string;
32
+ export declare function generateEnumFromOrdinalName(typeName: string): string;
31
33
  export declare function makeArrayTypeCheckCall(valueAccessor: string, typeName: string, writer: LanguageWriter): LanguageExpression;
32
34
  export declare class ETSLanguageWriter extends TSLanguageWriter {
33
35
  private arrayConvertor;
@@ -35,17 +37,15 @@ export declare class ETSLanguageWriter extends TSLanguageWriter {
35
37
  fork(options?: {
36
38
  resolver?: ReferenceResolver;
37
39
  }): LanguageWriter;
38
- writeNativeMethodDeclaration(name: string, signature: MethodSignature): void;
39
40
  makeAssign(variableName: string, type: IDLType | undefined, expr: LanguageExpression, isDeclared?: boolean, isConst?: boolean): LanguageStatement;
40
41
  makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
41
42
  makeMapForEach(map: string, key: string, value: string, op: () => void): LanguageStatement;
42
43
  makeMapSize(map: string): LanguageExpression;
43
44
  get supportedModifiers(): MethodModifier[];
44
- makeUnsafeCast(convertor: ArgConvertor, param: string): string;
45
45
  runtimeType(param: ArgConvertor, valueType: string, value: string): void;
46
46
  makeUnionVariantCast(value: string, type: string, convertor: ArgConvertor, index?: number): LanguageExpression;
47
47
  enumFromOrdinal(value: LanguageExpression, enumEntry: idl.IDLType): LanguageExpression;
48
- ordinalFromEnum(value: LanguageExpression, _: idl.IDLType): LanguageExpression;
48
+ ordinalFromEnum(value: LanguageExpression, enumEntry: idl.IDLType): LanguageExpression;
49
49
  makeDiscriminatorFromFields(convertor: {
50
50
  targetType: (writer: LanguageWriter) => string;
51
51
  }, value: string, accessors: string[], duplicates: Set<string>): LanguageExpression;
@@ -54,8 +54,9 @@ export declare class ETSLanguageWriter extends TSLanguageWriter {
54
54
  makeEnumEntity(enumEntity: IDLEnum, isExport: boolean): LanguageStatement;
55
55
  getObjectAccessor(convertor: ArgConvertor, value: string, args?: ObjectArgs): string;
56
56
  writeMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
57
+ isQuickType(type: IDLType): boolean;
58
+ writeNativeMethodDeclaration(method: Method): void;
57
59
  writeProperty(propName: string, propType: IDLType): void;
58
- makeEnumCast(value: string, _unsafe: boolean, convertor: ArgConvertor | undefined): string;
59
60
  makeUnionVariantCondition(convertor: ArgConvertor, valueName: string, valueType: string, type: string, convertorIndex: number, runtimeTypeIndex: number): LanguageExpression;
60
61
  makeCastCustomObject(customName: string, isGenericType: boolean): LanguageExpression;
61
62
  makeHasOwnProperty(value: string, valueTypeName: string, property: string, propertyTypeName: string): LanguageExpression;
@@ -15,14 +15,13 @@
15
15
  import { IndentedPrinter } from "../../IndentedPrinter";
16
16
  import { LambdaExpression, MethodModifier } from "../LanguageWriter";
17
17
  import { TSCastExpression, TSLanguageWriter } from "./TsLanguageWriter";
18
- import { getExtAttribute, IDLI32Type, IDLThisType } from '../../idl';
19
- import { AggregateConvertor, ArrayConvertor, CustomTypeConvertor, InterfaceConvertor, MaterializedClassConvertor, OptionConvertor, UnionConvertor } from "../ArgConvertors";
18
+ import { getExtAttribute, IDLThisType } from '../../idl';
19
+ import { AggregateConvertor, ArrayConvertor, CustomTypeConvertor, InterfaceConvertor, MaterializedClassConvertor, OptionConvertor, UnionConvertor, BufferConvertor } from "../ArgConvertors";
20
20
  import * as idl from '../../idl';
21
21
  import { convertDeclaration } from "../nameConvertor";
22
22
  import { createDeclarationNameConvertor } from "../../peer-generation/idl/IdlNameConvertor";
23
23
  import { Language } from "../../Language";
24
24
  import { RuntimeType } from "../common";
25
- import { throwException } from "../../util";
26
25
  ////////////////////////////////////////////////////////////////
27
26
  // STATEMENTS //
28
27
  ////////////////////////////////////////////////////////////////
@@ -138,6 +137,14 @@ export function generateTypeCheckerName(typeName) {
138
137
  .replaceAll('.', ''); // Todo: hack for namespaces
139
138
  return `is${typeName.replaceAll('[]', 'Brackets')}`;
140
139
  }
140
+ export function generateEnumToOrdinalName(typeName) {
141
+ typeName = typeName.split(".").join("_");
142
+ return `${typeName}_ToOrdinal`;
143
+ }
144
+ export function generateEnumFromOrdinalName(typeName) {
145
+ typeName = typeName.split(".").join("_");
146
+ return `${typeName}_FromOrdinal`;
147
+ }
141
148
  export function makeArrayTypeCheckCall(valueAccessor, typeName, writer) {
142
149
  return writer.makeMethodCall("TypeChecker", generateTypeCheckerName(typeName), [writer.makeString(valueAccessor)
143
150
  ]);
@@ -154,12 +161,6 @@ export class ETSLanguageWriter extends TSLanguageWriter {
154
161
  var _a;
155
162
  return new ETSLanguageWriter(new IndentedPrinter(), (_a = options === null || options === void 0 ? void 0 : options.resolver) !== null && _a !== void 0 ? _a : this.resolver, this.typeConvertor, this.arrayConvertor);
156
163
  }
157
- writeNativeMethodDeclaration(name, signature) {
158
- if (signature.returnType === IDLThisType) {
159
- throw new Error('static method can not return this!');
160
- }
161
- this.writeMethodDeclaration(name, signature, [MethodModifier.STATIC, MethodModifier.NATIVE]);
162
- }
163
164
  makeAssign(variableName, type, expr, isDeclared = true, isConst = true) {
164
165
  return new EtsAssignStatement(variableName, type, expr, isDeclared, isConst);
165
166
  }
@@ -175,13 +176,6 @@ export class ETSLanguageWriter extends TSLanguageWriter {
175
176
  get supportedModifiers() {
176
177
  return [MethodModifier.PUBLIC, MethodModifier.PRIVATE, MethodModifier.NATIVE, MethodModifier.STATIC];
177
178
  }
178
- makeUnsafeCast(convertor, param) {
179
- if (idl.isEnum(convertor.idlType) && !param.endsWith(".value")) {
180
- const isStringEnum = idl.isStringEnum(convertor.idlType);
181
- return `(${param} as ${this.typeConvertor.convert(convertor.idlType)}).${isStringEnum ? 'ordinal' : 'value'}`;
182
- }
183
- return super.makeUnsafeCast(convertor, param);
184
- }
185
179
  runtimeType(param, valueType, value) {
186
180
  super.runtimeType(param, valueType, value);
187
181
  }
@@ -190,10 +184,11 @@ export class ETSLanguageWriter extends TSLanguageWriter {
190
184
  }
191
185
  enumFromOrdinal(value, enumEntry) {
192
186
  const enumName = this.getNodeName(enumEntry);
193
- return this.makeString(`${value.asString()} as ${enumName}`);
187
+ return this.makeMethodCall('TypeChecker', generateEnumFromOrdinalName(enumName), [this.makeString(value.asString())]);
194
188
  }
195
- ordinalFromEnum(value, _) {
196
- return this.makeCast(this.makeString(`${value.asString()}`), IDLI32Type);
189
+ ordinalFromEnum(value, enumEntry) {
190
+ const enumName = this.getNodeName(enumEntry);
191
+ return this.makeMethodCall('TypeChecker', generateEnumToOrdinalName(enumName), [this.makeString(value.asString())]);
197
192
  }
198
193
  makeDiscriminatorFromFields(convertor, value, accessors, duplicates) {
199
194
  if (convertor instanceof AggregateConvertor
@@ -223,19 +218,17 @@ export class ETSLanguageWriter extends TSLanguageWriter {
223
218
  // ArkTS does not support - 'this.?'
224
219
  super.writeMethodCall(receiver, method, params, nullable && receiver !== "this");
225
220
  }
226
- writeProperty(propName, propType) {
227
- throw new Error("writeProperty for ArkTS is not implemented yet.");
221
+ isQuickType(type) {
222
+ return idl.asPromise(type) == undefined;
228
223
  }
229
- makeEnumCast(value, _unsafe, convertor) {
230
- if (convertor === undefined) {
231
- throwException(`The makeEnumCast function required EnumConvertor`);
232
- }
233
- const decl = this.resolver.toDeclaration(convertor.nativeType());
234
- if (!idl.isEnum(decl)) {
235
- throwException(`Declaration type must be Enum`);
224
+ writeNativeMethodDeclaration(method) {
225
+ if (method.signature.returnType === IDLThisType) {
226
+ throw new Error('static method can not return this!');
236
227
  }
237
- // ((value as Axis) as int) - in case when Axis was casted to Object in Map<Axis, Smth>
238
- return this.makeCast(this.makeCast(this.makeString(value), convertor.idlType), IDLI32Type).asString();
228
+ this.writeMethodDeclaration(method.name, method.signature, [MethodModifier.STATIC, MethodModifier.NATIVE]);
229
+ }
230
+ writeProperty(propName, propType) {
231
+ throw new Error("writeProperty for ArkTS is not implemented yet.");
239
232
  }
240
233
  makeUnionVariantCondition(convertor, valueName, valueType, type, convertorIndex, runtimeTypeIndex) {
241
234
  if (idl.isEnum(this.resolver.toDeclaration(convertor.nativeType()))) {
@@ -289,6 +282,9 @@ export class ETSLanguageWriter extends TSLanguageWriter {
289
282
  if (convertor instanceof InterfaceConvertor || convertor instanceof MaterializedClassConvertor) {
290
283
  return makeInterfaceTypeCheckerCall(value, this.getNodeName(convertor.idlType), convertor.declaration.properties.filter(it => !it.isStatic).map(it => it.name), duplicateMembers, this);
291
284
  }
285
+ if (convertor instanceof BufferConvertor) {
286
+ return makeInterfaceTypeCheckerCall(value, this.getNodeName(convertor.idlType), [], new Set(), this);
287
+ }
292
288
  if (convertor instanceof AggregateConvertor) {
293
289
  return makeInterfaceTypeCheckerCall(value, convertor.aliasName !== undefined ? convertor.aliasName : this.getNodeName(convertor.idlType), convertor.members.map(it => it[0]), duplicateMembers, this);
294
290
  }
@@ -35,10 +35,10 @@ export declare class JavaLanguageWriter extends CLikeLanguageWriter {
35
35
  resolver?: ReferenceResolver;
36
36
  }): LanguageWriter;
37
37
  writeClass(name: string, op: (writer: this) => void, superClass?: string, interfaces?: string[], generics?: string[], isDeclared?: boolean, isExport?: boolean): void;
38
- writeInterface(name: string, op: (writer: this) => void, superInterfaces?: string[]): void;
38
+ writeInterface(name: string, op: (writer: this) => void, superInterfaces?: string[], generics?: string[]): void;
39
39
  writeMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
40
40
  writeFieldDeclaration(name: string, type: idl.IDLType, modifiers: FieldModifier[] | undefined, optional: boolean, initExpr?: LanguageExpression): void;
41
- writeNativeMethodDeclaration(name: string, signature: MethodSignature): void;
41
+ writeNativeMethodDeclaration(method: Method): void;
42
42
  writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, superCall?: Method, modifiers?: MethodModifier[]): void;
43
43
  writeProperty(propName: string, propType: idl.IDLType): void;
44
44
  writeTypeDeclaration(decl: idl.IDLTypedef): void;
@@ -78,7 +78,7 @@ export declare class JavaLanguageWriter extends CLikeLanguageWriter {
78
78
  ordinalFromEnum(value: LanguageExpression, _: idl.IDLType): LanguageExpression;
79
79
  makeValueFromOption(value: string): LanguageExpression;
80
80
  runtimeType(param: ArgConvertor, valueType: string, value: string): void;
81
- makeEnumCast(enumName: string, _unsafe: boolean, _convertor: ArgConvertor | undefined): string;
81
+ makeEnumCast(_enumEntry: idl.IDLEnum, enumName: string): string;
82
82
  castToBoolean(value: string): string;
83
83
  makeLengthSerializer(serializer: string, value: string): LanguageStatement | undefined;
84
84
  }
@@ -116,7 +116,7 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
116
116
  this.popIndent();
117
117
  this.printer.print(`}`);
118
118
  }
119
- writeInterface(name, op, superInterfaces) {
119
+ writeInterface(name, op, superInterfaces, generics) {
120
120
  let extendsClause = superInterfaces ? ` extends ${superInterfaces.join(",")}` : '';
121
121
  this.printer.print(`interface ${name}${extendsClause} {`);
122
122
  this.pushIndent();
@@ -136,8 +136,8 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
136
136
  let prefix = this.makeFieldModifiersList(modifiers);
137
137
  this.printer.print(`${prefix} ${(this.getNodeName(type))} ${name}${initExpr ? ` = ${initExpr.asString()}` : ""};`);
138
138
  }
139
- writeNativeMethodDeclaration(name, signature) {
140
- this.writeMethodDeclaration(name, signature, [MethodModifier.STATIC, MethodModifier.NATIVE]);
139
+ writeNativeMethodDeclaration(method) {
140
+ this.writeMethodDeclaration(method.name, method.signature, [MethodModifier.STATIC, MethodModifier.NATIVE]);
141
141
  }
142
142
  writeConstructorImplementation(className, signature, op, superCall, modifiers) {
143
143
  this.printer.print(`${modifiers ? modifiers.map((it) => MethodModifier[it].toLowerCase()).join(' ') : ''} ${className}(${signature.args.map((it, index) => `${this.getNodeName(it)} ${signature.argName(index)}`).join(", ")}) {`);
@@ -267,7 +267,7 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
267
267
  runtimeType(param, valueType, value) {
268
268
  this.writeStatement(this.makeAssign(valueType, undefined, this.makeRuntimeTypeGetterCall(value), false));
269
269
  }
270
- makeEnumCast(enumName, _unsafe, _convertor) {
270
+ makeEnumCast(_enumEntry, enumName) {
271
271
  return `${enumName}.value`;
272
272
  }
273
273
  castToBoolean(value) { return value; }
@@ -38,7 +38,7 @@ export declare class TSLanguageWriter extends LanguageWriter {
38
38
  }): LanguageWriter;
39
39
  getNodeName(type: idl.IDLNode): string;
40
40
  writeClass(name: string, op: (writer: this) => void, superClass?: string, interfaces?: string[], generics?: string[], isDeclared?: boolean, isAbstract?: boolean): void;
41
- writeInterface(name: string, op: (writer: this) => void, superInterfaces?: string[], isDeclared?: boolean): void;
41
+ writeInterface(name: string, op: (writer: this) => void, superInterfaces?: string[], generics?: string[], isDeclared?: boolean): void;
42
42
  writeFunctionDeclaration(name: string, signature: MethodSignature): void;
43
43
  writeFunctionImplementation(name: string, signature: MethodSignature, op: (writer: this) => void): void;
44
44
  private generateFunctionDeclaration;
@@ -49,7 +49,7 @@ export declare class TSLanguageWriter extends LanguageWriter {
49
49
  numberId: number;
50
50
  }[]): void;
51
51
  writeFieldDeclaration(name: string, type: idl.IDLType, modifiers: FieldModifier[] | undefined, optional: boolean, initExpr?: LanguageExpression): void;
52
- writeNativeMethodDeclaration(name: string, signature: MethodSignature, isNative?: boolean): void;
52
+ writeNativeMethodDeclaration(method: Method): void;
53
53
  writeMethodDeclaration(name: string, signature: MethodSignature, modifiers?: MethodModifier[]): void;
54
54
  writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, superCall?: Method, modifiers?: MethodModifier[]): void;
55
55
  writeMethodImplementation(method: Method, op: (writer: this) => void): void;
@@ -85,7 +85,7 @@ export declare class TSLanguageWriter extends LanguageWriter {
85
85
  get supportedFieldModifiers(): FieldModifier[];
86
86
  enumFromOrdinal(value: LanguageExpression, enumEntry: idl.IDLType): LanguageExpression;
87
87
  ordinalFromEnum(value: LanguageExpression, enumEntry: idl.IDLType): LanguageExpression;
88
- makeEnumCast(enumName: string, unsafe: boolean, convertor: ArgConvertor): string;
88
+ makeEnumCast(enumEntry: idl.IDLEnum, param: string): string;
89
89
  castToBoolean(value: string): string;
90
90
  makeCallIsObject(value: string): LanguageExpression;
91
91
  escapeKeyword(keyword: string): string;
@@ -13,11 +13,12 @@
13
13
  * limitations under the License.
14
14
  */
15
15
  import * as idl from '../../idl';
16
+ import { isOptionalType } from '../../idl';
16
17
  import { Language } from '../../Language';
17
18
  import { IndentedPrinter } from "../../IndentedPrinter";
18
19
  import { AssignStatement, BlockStatement, CheckOptionalStatement, ExpressionStatement, FieldModifier, IfStatement, LambdaExpression, LanguageWriter, Method, MethodModifier, NamedMethodSignature, NaryOpExpression, ReturnStatement, StringExpression } from "../LanguageWriter";
19
20
  import { RuntimeType } from "../common";
20
- import { throwException } from "../../util";
21
+ import { rightmostIndexOf, throwException } from "../../util";
21
22
  import { TSKeywords } from '../../languageSpecificKeywords';
22
23
  ////////////////////////////////////////////////////////////////
23
24
  // EXPRESSIONS //
@@ -155,9 +156,10 @@ export class TSLanguageWriter extends LanguageWriter {
155
156
  this.popIndent();
156
157
  this.printer.print(`}`);
157
158
  }
158
- writeInterface(name, op, superInterfaces, isDeclared) {
159
+ writeInterface(name, op, superInterfaces, generics, isDeclared) {
160
+ const genericsClause = (generics === null || generics === void 0 ? void 0 : generics.length) ? `<${generics.join(", ")}>` : '';
159
161
  let extendsClause = superInterfaces ? ` extends ${superInterfaces.join(",")}` : '';
160
- this.printer.print(`export ${isDeclared ? "declare " : ""}interface ${name}${extendsClause} {`);
162
+ this.printer.print(`export ${isDeclared ? "declare " : ""}interface ${name}${genericsClause}${extendsClause} {`);
161
163
  this.pushIndent();
162
164
  op(this);
163
165
  this.popIndent();
@@ -174,7 +176,11 @@ export class TSLanguageWriter extends LanguageWriter {
174
176
  this.printer.print('}');
175
177
  }
176
178
  generateFunctionDeclaration(name, signature) {
177
- const args = signature.args.map((it, index) => `${signature.argName(index)}${idl.isOptionalType(it) ? '?' : ''}: ${this.getNodeName(it)}`);
179
+ const rightmostRegularParameterIndex = rightmostIndexOf(signature.args, it => !isOptionalType(it));
180
+ const args = signature.args.map((it, index) => {
181
+ const optionalToken = idl.isOptionalType(it) && index > rightmostRegularParameterIndex ? '?' : '';
182
+ return `${signature.argName(index)}${optionalToken}: ${this.getNodeName(it)}`;
183
+ });
178
184
  const returnType = this.getNodeName(signature.returnType);
179
185
  return `export function ${name}(${args.join(", ")}): ${returnType}`;
180
186
  }
@@ -202,7 +208,9 @@ export class TSLanguageWriter extends LanguageWriter {
202
208
  prefix += " ";
203
209
  this.printer.print(`${prefix}${name}${optional ? "?" : ""}: ${this.getNodeName(type)}${init}`);
204
210
  }
205
- writeNativeMethodDeclaration(name, signature, isNative) {
211
+ writeNativeMethodDeclaration(method) {
212
+ let name = method.name;
213
+ let signature = method.signature;
206
214
  this.writeMethodImplementation(new Method(name, signature, [MethodModifier.STATIC]), writer => {
207
215
  const selfCallExpression = writer.makeFunctionCall(`this.${name}`, signature.args.map((_, i) => writer.makeString(this.escapeKeyword(signature.argName(i)))));
208
216
  writer.writeStatement(new IfStatement(new NaryOpExpression("==", [writer.makeFunctionCall("this._LoadOnce", []), writer.makeString("true")]), new BlockStatement([
@@ -272,7 +280,7 @@ export class TSLanguageWriter extends LanguageWriter {
272
280
  canBeOptional.reverse();
273
281
  const isOptional = signature.args.map((it, i) => idl.isOptionalType(it) && canBeOptional[i] && !isSetter);
274
282
  const normalizedArgs = signature.args.map((it, i) => idl.isOptionalType(it) && isOptional[i] ? idl.maybeUnwrapOptionalType(it) : it);
275
- this.printer.print(`${prefix}${name}${typeParams}(${normalizedArgs.map((it, index) => `${this.escapeKeyword(signature.argName(index))}${isOptional[index] ? "?" : ""}: ${this.getNodeName(it)}${signature.argDefault(index) ? ' = ' + signature.argDefault(index) : ""}`).join(", ")})${needReturn ? ": " + this.getNodeName(signature.returnType) : ""} ${needBracket ? "{" : ""}`);
283
+ this.printer.print(`${prefix}${name}${typeParams}(${normalizedArgs.map((it, index) => `${this.escapeKeyword(signature.argName(index))}${isOptional[index] ? "?" : ""}: ${this.getNodeName(it)}${signature.argDefault(index) ? ' = ' + signature.argDefault(index) : ""}`).join(", ")})${needReturn ? ": " + this.getNodeName(signature.returnType) : ""}${needBracket ? " {" : ""}`);
276
284
  }
277
285
  makeNull() {
278
286
  return new StringExpression("undefined");
@@ -364,7 +372,7 @@ export class TSLanguageWriter extends LanguageWriter {
364
372
  return this.makeAssign(receiver, undefined, this.makeString(`[${fields.map(it => `${it}!`).join(",")}]`), false);
365
373
  }
366
374
  get supportedModifiers() {
367
- return [MethodModifier.PUBLIC, MethodModifier.PRIVATE, MethodModifier.STATIC];
375
+ return [MethodModifier.PUBLIC, MethodModifier.PRIVATE, MethodModifier.PROTECTED, MethodModifier.STATIC];
368
376
  }
369
377
  get supportedFieldModifiers() {
370
378
  return [FieldModifier.PUBLIC, FieldModifier.PRIVATE, FieldModifier.PROTECTED, FieldModifier.READONLY, FieldModifier.STATIC];
@@ -380,11 +388,12 @@ export class TSLanguageWriter extends LanguageWriter {
380
388
  }
381
389
  return value;
382
390
  }
383
- makeEnumCast(enumName, unsafe, convertor) {
384
- if (unsafe) {
385
- return this.makeUnsafeCast(convertor, enumName);
386
- }
387
- return enumName;
391
+ makeEnumCast(enumEntry, param) {
392
+ // Take the ordinal value if Enum is a string, and valueOf when it is an integer
393
+ // Enum.valueOf() - compatible with ArkTS/TS
394
+ return idl.isStringEnum(enumEntry)
395
+ ? this.ordinalFromEnum(this.makeString(param), idl.createReferenceType(enumEntry)).asString()
396
+ : `${param}.valueOf()`;
388
397
  }
389
398
  castToBoolean(value) { return `+${value}`; }
390
399
  makeCallIsObject(value) {