@idlizer/core 2.1.9-arktscgen-5 → 2.1.9-arktscgen-8

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 (58) hide show
  1. package/build/lib/src/Language.d.ts +0 -1
  2. package/build/lib/src/Language.js +7 -8
  3. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +4 -15
  4. package/build/lib/src/LanguageWriters/ArgConvertors.js +103 -102
  5. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +8 -30
  6. package/build/lib/src/LanguageWriters/LanguageWriter.js +15 -67
  7. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +2 -2
  8. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.d.ts +17 -1
  9. package/build/lib/src/LanguageWriters/convertors/KotlinConvertors.js +121 -6
  10. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +6 -0
  11. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +1 -2
  12. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +3 -19
  13. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +0 -5
  14. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +0 -9
  15. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +3 -5
  16. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +9 -22
  17. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +6 -9
  18. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +23 -66
  19. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +1 -7
  20. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +4 -14
  21. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.d.ts +11 -8
  22. package/build/lib/src/LanguageWriters/writers/KotlinLanguageWriter.js +116 -27
  23. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +4 -5
  24. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +10 -26
  25. package/build/lib/src/config.d.ts +336 -1
  26. package/build/lib/src/config.js +11 -3
  27. package/build/lib/src/diagnosticmessages.d.ts +45 -0
  28. package/build/lib/src/diagnosticmessages.js +66 -0
  29. package/build/lib/src/diagnostictypes.d.ts +140 -0
  30. package/build/lib/src/diagnostictypes.js +72 -0
  31. package/build/lib/src/formatter.d.ts +3 -0
  32. package/build/lib/src/formatter.js +98 -0
  33. package/build/lib/src/from-idl/deserialize.d.ts +1 -0
  34. package/build/lib/src/from-idl/deserialize.js +107 -5
  35. package/build/lib/src/idl.d.ts +7 -0
  36. package/build/lib/src/idl.js +15 -3
  37. package/build/lib/src/index.d.ts +7 -1
  38. package/build/lib/src/index.js +7 -1
  39. package/build/lib/src/peer-generation/Materialized.d.ts +4 -20
  40. package/build/lib/src/peer-generation/Materialized.js +9 -62
  41. package/build/lib/src/peer-generation/PeerClass.d.ts +0 -2
  42. package/build/lib/src/peer-generation/PeerClass.js +4 -6
  43. package/build/lib/src/peer-generation/PeerLibrary.js +1 -5
  44. package/build/lib/src/peer-generation/PeerMethod.d.ts +25 -27
  45. package/build/lib/src/peer-generation/PeerMethod.js +83 -93
  46. package/build/lib/src/peer-generation/idl/common.js +1 -1
  47. package/build/lib/src/peer-generation/isMaterialized.js +0 -4
  48. package/build/lib/src/peer-generation/modules.d.ts +1 -0
  49. package/build/lib/src/peer-generation/modules.js +4 -0
  50. package/build/lib/src/peer-generation/unions.d.ts +0 -2
  51. package/build/lib/src/peer-generation/unions.js +3 -23
  52. package/build/lib/src/transformers/FqnTransformer.d.ts +4 -0
  53. package/build/lib/src/transformers/FqnTransformer.js +17 -0
  54. package/build/lib/src/transformers/GenericTransformer.d.ts +8 -0
  55. package/build/lib/src/transformers/GenericTransformer.js +141 -0
  56. package/build/lib/src/util.d.ts +4 -2
  57. package/build/lib/src/util.js +21 -12
  58. package/package.json +2 -2
@@ -1,10 +1,11 @@
1
1
  import { IndentedPrinter } from "../../IndentedPrinter";
2
- import { LambdaExpression, LanguageExpression, LanguageStatement, LanguageWriter, MakeCastOptions, Method, MethodModifier, MethodSignature, ObjectArgs } from "../LanguageWriter";
2
+ import { LambdaExpression, LanguageExpression, LanguageStatement, LanguageWriter, MakeAssignOptions, MakeCastOptions, Method, MethodModifier, MethodSignature } from "../LanguageWriter";
3
3
  import { TSLanguageWriter } from "./TsLanguageWriter";
4
4
  import { IDLEnum, IDLType } from '../../idl';
5
5
  import { ArgConvertor } from "../ArgConvertors";
6
6
  import * as idl from '../../idl';
7
7
  import { IdlNameConvertor } from "../nameConvertor";
8
+ import { RuntimeType } from "../common";
8
9
  import { ReferenceResolver } from "../../peer-generation/ReferenceResolver";
9
10
  export declare class EtsAssignStatement implements LanguageStatement {
10
11
  variableName: string;
@@ -12,7 +13,8 @@ export declare class EtsAssignStatement implements LanguageStatement {
12
13
  expression: LanguageExpression;
13
14
  isDeclared: boolean;
14
15
  protected isConst: boolean;
15
- constructor(variableName: string, type: IDLType | undefined, expression: LanguageExpression, isDeclared?: boolean, isConst?: boolean);
16
+ protected options?: MakeAssignOptions | undefined;
17
+ constructor(variableName: string, type: IDLType | undefined, expression: LanguageExpression, isDeclared?: boolean, isConst?: boolean, options?: MakeAssignOptions | undefined);
16
18
  write(writer: LanguageWriter): void;
17
19
  }
18
20
  export declare class ArkTSEnumEntityStatement implements LanguageStatement {
@@ -40,7 +42,7 @@ export declare class ETSLanguageWriter extends TSLanguageWriter {
40
42
  fork(options?: {
41
43
  resolver?: ReferenceResolver;
42
44
  }): LanguageWriter;
43
- makeAssign(variableName: string, type: IDLType | undefined, expr: LanguageExpression, isDeclared?: boolean, isConst?: boolean): LanguageStatement;
45
+ makeAssign(variableName: string, type: IDLType | undefined, expr: LanguageExpression, isDeclared?: boolean, isConst?: boolean, options?: MakeAssignOptions): LanguageStatement;
44
46
  makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
45
47
  makeMapForEach(map: string, key: string, value: string, op: () => void): LanguageStatement;
46
48
  makeMapSize(map: string): LanguageExpression;
@@ -53,23 +55,18 @@ export declare class ETSLanguageWriter extends TSLanguageWriter {
53
55
  targetType: (writer: LanguageWriter) => string;
54
56
  }, value: string, accessors: string[], duplicates: Set<string>): LanguageExpression;
55
57
  makeValueFromOption(value: string, destinationConvertor: ArgConvertor): LanguageExpression;
56
- makeIsTypeCall(value: string, decl: idl.IDLInterface): LanguageExpression;
57
58
  makeEnumEntity(enumEntity: IDLEnum, options: {
58
59
  isExport: boolean;
59
60
  isDeclare?: boolean;
60
61
  }): LanguageStatement;
61
- getObjectAccessor(convertor: ArgConvertor, value: string, args?: ObjectArgs): string;
62
62
  writeMethodCall(receiver: string, method: string, params: string[], nullable?: boolean): void;
63
63
  isQuickType(type: IDLType): boolean;
64
64
  writeNativeMethodDeclaration(method: Method): void;
65
- makeUnionVariantCondition(convertor: ArgConvertor, valueName: string, valueType: string, type: string, convertorIndex: number, runtimeTypeIndex: number): LanguageExpression;
66
65
  makeCastCustomObject(customName: string, isGenericType: boolean): LanguageExpression;
67
- makeHasOwnProperty(value: string, valueTypeName: string, property: string, propertyTypeName: string): LanguageExpression;
68
66
  makeEquals(args: LanguageExpression[]): LanguageExpression;
69
- makeDiscriminatorConvertor(convertor: ArgConvertor, value: string, index: number): LanguageExpression;
67
+ discriminate(value: string, index: number, type: idl.IDLType, runtimeTypes: RuntimeType[]): string;
70
68
  castToInt(value: string, bitness: 8 | 32): string;
71
69
  castToBoolean(value: string): string;
72
- instanceOf(convertor: ArgConvertor, value: string, duplicateMembers?: Set<string>): LanguageExpression;
73
70
  typeInstanceOf(type: idl.IDLEntry, value: string, members?: string[]): LanguageExpression;
74
71
  makeTypeCast(value: LanguageExpression, type: idl.IDLType, options?: MakeCastOptions): LanguageExpression;
75
72
  makeCast(value: LanguageExpression, node: idl.IDLNode, options?: MakeCastOptions): LanguageExpression;
@@ -16,24 +16,25 @@ import { IndentedPrinter } from "../../IndentedPrinter";
16
16
  import { LambdaExpression, MethodModifier } from "../LanguageWriter";
17
17
  import { TSCastExpression, TSLanguageWriter } from "./TsLanguageWriter";
18
18
  import { getExtAttribute, IDLThisType } from '../../idl';
19
- import { AggregateConvertor, ArrayConvertor, CustomTypeConvertor, InterfaceConvertor, MaterializedClassConvertor, OptionConvertor, UnionConvertor, BufferConvertor } from "../ArgConvertors";
19
+ import { AggregateConvertor, CustomTypeConvertor, InterfaceConvertor, MaterializedClassConvertor } 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
- import { RuntimeType } from "../common";
25
24
  ////////////////////////////////////////////////////////////////
26
25
  // STATEMENTS //
27
26
  ////////////////////////////////////////////////////////////////
28
27
  export class EtsAssignStatement {
29
- constructor(variableName, type, expression, isDeclared = true, isConst = true) {
28
+ constructor(variableName, type, expression, isDeclared = true, isConst = true, options) {
30
29
  this.variableName = variableName;
31
30
  this.type = type;
32
31
  this.expression = expression;
33
32
  this.isDeclared = isDeclared;
34
33
  this.isConst = isConst;
34
+ this.options = options;
35
35
  }
36
36
  write(writer) {
37
+ var _a;
37
38
  if (this.isDeclared) {
38
39
  const typeClause = this.type !== undefined ? `: ${writer.getNodeName(this.type)}` : '';
39
40
  const maybeAssign = this.expression !== undefined ? " = " : "";
@@ -41,7 +42,9 @@ export class EtsAssignStatement {
41
42
  writer.print(`${this.isConst ? "const" : "let"} ${this.variableName} ${typeClause}${maybeAssign}${initValue.asString()}`);
42
43
  }
43
44
  else {
44
- writer.print(`${this.variableName} = ${this.expression.asString()}`);
45
+ const receiver = (_a = this.options) === null || _a === void 0 ? void 0 : _a.receiver;
46
+ const withReceiver = receiver ? `${receiver}.` : "";
47
+ writer.print(`${withReceiver}${this.variableName} = ${this.expression.asString()}`);
45
48
  }
46
49
  }
47
50
  }
@@ -130,10 +133,10 @@ export class ETSLambdaExpression extends LambdaExpression {
130
133
  // UTILS //
131
134
  ////////////////////////////////////////////////////////////////
132
135
  export function generateTypeCheckerName(typeName) {
133
- typeName = typeName
136
+ return "is" + typeName
134
137
  .replaceAll('[]', 'BracketsArray')
135
- .split('.').join('_');
136
- return `is${typeName.replaceAll('[]', 'Brackets')}`;
138
+ .replaceAll(/<.*$/g, '') // delete type arguments
139
+ .replaceAll('.', '_');
137
140
  }
138
141
  export function generateEnumToNumericName(entry) {
139
142
  const typeName = idl.getQualifiedName(entry, "namespace.name").split('.').join('_');
@@ -159,8 +162,8 @@ export class ETSLanguageWriter extends TSLanguageWriter {
159
162
  var _a;
160
163
  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);
161
164
  }
162
- makeAssign(variableName, type, expr, isDeclared = true, isConst = true) {
163
- return new EtsAssignStatement(variableName, type, expr, isDeclared, isConst);
165
+ makeAssign(variableName, type, expr, isDeclared = true, isConst = true, options) {
166
+ return new EtsAssignStatement(variableName, type, expr, isDeclared, isConst, options);
164
167
  }
165
168
  makeLambda(signature, body) {
166
169
  return new ETSLambdaExpression(this, this.typeConvertor, signature, this.resolver, body);
@@ -202,7 +205,7 @@ export class ETSLanguageWriter extends TSLanguageWriter {
202
205
  || convertor instanceof InterfaceConvertor
203
206
  || convertor instanceof MaterializedClassConvertor
204
207
  || convertor instanceof CustomTypeConvertor) {
205
- return this.instanceOf(convertor, value, duplicates);
208
+ return this.instanceOf(value, convertor.idlType);
206
209
  }
207
210
  return this.makeString(`${value} instanceof ${convertor.targetType(this)}`);
208
211
  }
@@ -212,18 +215,12 @@ export class ETSLanguageWriter extends TSLanguageWriter {
212
215
  }
213
216
  return super.makeValueFromOption(value, destinationConvertor);
214
217
  }
215
- makeIsTypeCall(value, decl) {
216
- return makeInterfaceTypeCheckerCall(value, decl.name, decl.properties.map(it => it.name), new Set(), this);
217
- }
218
218
  makeEnumEntity(enumEntity, options) {
219
219
  return new ArkTSEnumEntityStatement(enumEntity, {
220
220
  isExport: options === null || options === void 0 ? void 0 : options.isExport,
221
221
  isDeclare: !!(options === null || options === void 0 ? void 0 : options.isDeclare),
222
222
  });
223
223
  }
224
- getObjectAccessor(convertor, value, args) {
225
- return super.getObjectAccessor(convertor, value, args);
226
- }
227
224
  writeMethodCall(receiver, method, params, nullable = false) {
228
225
  // ArkTS does not support - 'this.?'
229
226
  super.writeMethodCall(receiver, method, params, nullable && receiver !== "this");
@@ -237,46 +234,27 @@ export class ETSLanguageWriter extends TSLanguageWriter {
237
234
  }
238
235
  this.writeMethodDeclaration(method.name, method.signature, [MethodModifier.STATIC, MethodModifier.NATIVE]);
239
236
  }
240
- makeUnionVariantCondition(convertor, valueName, valueType, type, convertorIndex, runtimeTypeIndex) {
241
- if (idl.isEnum(this.resolver.toDeclaration(convertor.nativeType()))) {
242
- return this.instanceOf(convertor, valueName);
243
- }
244
- // TODO: in ArkTS SerializerBase.runtimeType returns RuntimeType.OBJECT for enum type and not RuntimeType.NUMBER as in TS
245
- if (convertor instanceof UnionConvertor || convertor instanceof OptionConvertor) {
246
- // Unwrapping of type
247
- const idlType = convertor instanceof UnionConvertor
248
- ? convertor.nativeType().types[runtimeTypeIndex]
249
- : idl.maybeUnwrapOptionalType(convertor.nativeType());
250
- if (idlType !== undefined && idl.isReferenceType(idlType)) {
251
- const resolved = this.resolver.resolveTypeReference(idlType);
252
- type = resolved != undefined && idl.isEnum(resolved) ? RuntimeType[RuntimeType.OBJECT] : type;
253
- }
254
- }
255
- return super.makeUnionVariantCondition(convertor, valueName, valueType, type, convertorIndex);
256
- }
257
237
  makeCastCustomObject(customName, isGenericType) {
258
238
  if (isGenericType) {
259
239
  return this.makeCast(this.makeString(customName), idl.IDLObjectType);
260
240
  }
261
241
  return super.makeCastCustomObject(customName, isGenericType);
262
242
  }
263
- makeHasOwnProperty(value, valueTypeName, property, propertyTypeName) {
264
- return this.makeNaryOp("&&", [
265
- this.makeString(`${value} instanceof ${valueTypeName}`),
266
- this.makeString(`isInstanceOf("${propertyTypeName}", ${value}.${property})`)
267
- ]);
268
- }
269
243
  makeEquals(args) {
270
244
  // TODO: Error elimination: 'TypeError: Both operands have to be reference types'
271
245
  // the '==' operator must be used when one of the operands is a reference
272
246
  return super.makeNaryOp('==', args);
273
247
  }
274
- makeDiscriminatorConvertor(convertor, value, index) {
275
- return this.instanceOf(convertor, value);
276
- // Or this ????????
277
- // return this.discriminatorFromExpressions(value, RuntimeType.OBJECT, [
278
- // makeEnumTypeCheckerCall(value, this.getNodeName(convertor.idlType), this)
279
- // ])
248
+ discriminate(value, index, type, runtimeTypes) {
249
+ // work around ArkTS compiler bugs
250
+ if (idl.IDLContainerUtils.isSequence(type)) {
251
+ const arrayTypeName = this.arrayConvertor.convert(type);
252
+ return `TypeChecker.${generateTypeCheckerName(arrayTypeName)}(${value})`;
253
+ }
254
+ if (this.getNodeName(type) === "DragPreviewMode") {
255
+ return `TypeChecker.isDragPreviewMode(${value})`;
256
+ }
257
+ return `${value} instanceof ${this.getNodeName(type)}`;
280
258
  }
281
259
  castToInt(value, bitness) {
282
260
  // This fix is used to avoid unnecessary writeInt8(value as int32) call, which is generated if value is already an int32
@@ -287,27 +265,6 @@ export class ETSLanguageWriter extends TSLanguageWriter {
287
265
  return `(${value}).toInt()`; // FIXME: is there int8 in ARKTS?
288
266
  }
289
267
  castToBoolean(value) { return `${value} ? 1 : 0`; }
290
- instanceOf(convertor, value, duplicateMembers) {
291
- if (convertor instanceof CustomTypeConvertor) {
292
- return makeInterfaceTypeCheckerCall(value, this.getNodeName(convertor.idlType), [], duplicateMembers, this);
293
- }
294
- if (convertor instanceof InterfaceConvertor || convertor instanceof MaterializedClassConvertor) {
295
- return makeInterfaceTypeCheckerCall(value, this.getNodeName(convertor.idlType), convertor.declaration.properties.filter(it => !it.isStatic).map(it => it.name), duplicateMembers, this);
296
- }
297
- if (convertor instanceof BufferConvertor) {
298
- return makeInterfaceTypeCheckerCall(value, this.getNodeName(convertor.idlType), [], new Set(), this);
299
- }
300
- if (convertor instanceof AggregateConvertor) {
301
- return makeInterfaceTypeCheckerCall(value, convertor.aliasName !== undefined ? convertor.aliasName : this.getNodeName(convertor.idlType), convertor.members.map(it => it[0]), duplicateMembers, this);
302
- }
303
- if (convertor instanceof ArrayConvertor) {
304
- return makeArrayTypeCheckCall(value, this.arrayConvertor.convert(convertor.idlType), this);
305
- }
306
- if (idl.isEnum(this.resolver.toDeclaration(convertor.nativeType()))) {
307
- return makeEnumTypeCheckerCall(value, this.getNodeName(convertor.idlType), this);
308
- }
309
- return super.instanceOf(convertor, value, duplicateMembers);
310
- }
311
268
  typeInstanceOf(type, value, members) {
312
269
  if (!members || members.length === 0) {
313
270
  throw new Error("At least one member needs to provided to pass it to TypeChecker!");
@@ -6,11 +6,6 @@ import { ArgConvertor, BaseArgConvertor } from "../ArgConvertors";
6
6
  import { IdlNameConvertor } from "../nameConvertor";
7
7
  import { RuntimeType } from "../common";
8
8
  import { ReferenceResolver } from "../../peer-generation/ReferenceResolver";
9
- export declare class JavaCheckDefinedExpression implements LanguageExpression {
10
- private value;
11
- constructor(value: string);
12
- asString(): string;
13
- }
14
9
  export declare class JavaCastExpression implements LanguageExpression {
15
10
  value: LanguageExpression;
16
11
  type: string;
@@ -46,13 +41,12 @@ export declare class JavaLanguageWriter extends CLikeLanguageWriter {
46
41
  }, setter?: {
47
42
  method: Method;
48
43
  op: () => void;
49
- }): void;
44
+ }, initExpr?: LanguageExpression): void;
50
45
  writeTypeDeclaration(decl: idl.IDLTypedef): void;
51
46
  writeConstant(constName: string, constType: idl.IDLType, constVal?: string): void;
52
47
  makeAssign(variableName: string, type: idl.IDLType | undefined, expr: LanguageExpression, isDeclared?: boolean, isConst?: boolean): LanguageStatement;
53
48
  makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
54
49
  makeReturn(expr: LanguageExpression): LanguageStatement;
55
- makeCheckOptional(optional: LanguageExpression, doStatement: LanguageStatement): LanguageStatement;
56
50
  makeDefinedCheck(value: string): LanguageExpression;
57
51
  makeLoop(counter: string, limit: string, statement?: LanguageStatement): LanguageStatement;
58
52
  makeMapForEach(map: string, key: string, value: string, op: () => void): LanguageStatement;
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { Language } from '../../Language';
16
16
  import { IndentedPrinter } from "../../IndentedPrinter";
17
- import { AssignStatement, CheckOptionalStatement, FieldModifier, LambdaExpression, Method, MethodModifier, MethodSignature, NamedMethodSignature, } from "../LanguageWriter";
17
+ import { AssignStatement, FieldModifier, LambdaExpression, Method, MethodModifier, MethodSignature, NamedMethodSignature, } from "../LanguageWriter";
18
18
  import { CLikeExpressionStatement, CLikeLanguageWriter, CLikeLoopStatement, CLikeReturnStatement } from "./CLikeLanguageWriter";
19
19
  import * as idl from '../../idl';
20
20
  import { RuntimeType } from "../common";
@@ -33,14 +33,6 @@ class JavaLambdaExpression extends LambdaExpression {
33
33
  return `(${params.join(", ")}) -> { ${this.bodyAsString()} }`;
34
34
  }
35
35
  }
36
- export class JavaCheckDefinedExpression {
37
- constructor(value) {
38
- this.value = value;
39
- }
40
- asString() {
41
- return `${this.value} != null`;
42
- }
43
- }
44
36
  export class JavaCastExpression {
45
37
  constructor(value, type, unsafe = false) {
46
38
  this.value = value;
@@ -156,7 +148,7 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
156
148
  this.popIndent();
157
149
  this.printer.print(`}`);
158
150
  }
159
- writeProperty(propName, propType, modifiers, getter, setter) {
151
+ writeProperty(propName, propType, modifiers, getter, setter, initExpr) {
160
152
  let isStatic = modifiers.includes(FieldModifier.STATIC);
161
153
  let isMutable = !modifiers.includes(FieldModifier.READONLY);
162
154
  let containerName = propName.concat("_container");
@@ -177,6 +169,7 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
177
169
  }
178
170
  }
179
171
  else {
172
+ // TBD: use initExpr
180
173
  this.writeMethodDeclaration(propName, new MethodSignature(propType, []));
181
174
  }
182
175
  }
@@ -195,11 +188,8 @@ export class JavaLanguageWriter extends CLikeLanguageWriter {
195
188
  makeReturn(expr) {
196
189
  return new CLikeReturnStatement(expr);
197
190
  }
198
- makeCheckOptional(optional, doStatement) {
199
- return new CheckOptionalStatement("null", optional, doStatement);
200
- }
201
191
  makeDefinedCheck(value) {
202
- return new JavaCheckDefinedExpression(value);
192
+ return this.makeString(`${value} != null`);
203
193
  }
204
194
  makeLoop(counter, limit, statement) {
205
195
  return new CLikeLoopStatement(counter, limit, statement);
@@ -6,6 +6,11 @@ import { ArgConvertor } from "../ArgConvertors";
6
6
  import { IdlNameConvertor } from "../nameConvertor";
7
7
  import { RuntimeType } from "../common";
8
8
  import { ReferenceResolver } from "../../peer-generation/ReferenceResolver";
9
+ export declare class KotlinLambdaReturnStatement implements LanguageStatement {
10
+ expression?: LanguageExpression | undefined;
11
+ constructor(expression?: LanguageExpression | undefined);
12
+ write(writer: LanguageWriter): void;
13
+ }
9
14
  export declare class KotlinEnumEntityStatement implements LanguageStatement {
10
15
  private readonly enumEntity;
11
16
  private readonly options;
@@ -49,11 +54,6 @@ export declare class KotlinNewObjectExpression implements LanguageExpression {
49
54
  constructor(objectName: string, params: LanguageExpression[]);
50
55
  asString(): string;
51
56
  }
52
- export declare class KotlinCheckDefinedExpression implements LanguageExpression {
53
- private value;
54
- constructor(value: string);
55
- asString(): string;
56
- }
57
57
  export declare class KotlinLanguageWriter extends LanguageWriter {
58
58
  protected typeConvertor: IdlNameConvertor;
59
59
  constructor(printer: IndentedPrinter, resolver: ReferenceResolver, typeConvertor: IdlNameConvertor, language?: Language);
@@ -78,6 +78,8 @@ export declare class KotlinLanguageWriter extends LanguageWriter {
78
78
  private writeDeclaration;
79
79
  writeFieldDeclaration(name: string, type: idl.IDLType, modifiers: FieldModifier[] | undefined, optional: boolean, initExpr?: LanguageExpression): void;
80
80
  writeNativeMethodDeclaration(method: Method): void;
81
+ private convertInteropArgument;
82
+ private convertInteropReturnValue;
81
83
  writeMethodDeclaration(name: string, signature: MethodSignature, modifiers?: MethodModifier[]): void;
82
84
  writeConstructorImplementation(className: string, signature: MethodSignature, op: (writer: this) => void, delegationCall?: DelegationCall, modifiers?: MethodModifier[]): void;
83
85
  writeMethodImplementation(method: Method, op: (writer: this) => void): void;
@@ -87,7 +89,7 @@ export declare class KotlinLanguageWriter extends LanguageWriter {
87
89
  }, setter?: {
88
90
  method: Method;
89
91
  op: () => void;
90
- }): void;
92
+ }, initExpr?: LanguageExpression): void;
91
93
  writeGetterImplementation(method: Method, op?: (writer: this) => void): void;
92
94
  writeSetterImplementation(method: Method, op: (writer: this) => void): void;
93
95
  writeTypeDeclaration(decl: idl.IDLTypedef): void;
@@ -97,7 +99,7 @@ export declare class KotlinLanguageWriter extends LanguageWriter {
97
99
  makeLambda(signature: MethodSignature, body?: LanguageStatement[]): LanguageExpression;
98
100
  makeThrowError(message: string): LanguageStatement;
99
101
  makeReturn(expr: LanguageExpression): LanguageStatement;
100
- makeCheckOptional(optional: LanguageExpression, doStatement: LanguageStatement): LanguageStatement;
102
+ makeLambdaReturn(expr: LanguageExpression): LanguageStatement;
101
103
  makeStatement(expr: LanguageExpression): LanguageStatement;
102
104
  makeLoop(counter: string, limit: string, statement?: LanguageStatement): LanguageStatement;
103
105
  makeMapForEach(map: string, key: string, value: string, op: () => void): LanguageStatement;
@@ -108,8 +110,10 @@ export declare class KotlinLanguageWriter extends LanguageWriter {
108
110
  makeUndefined(): LanguageExpression;
109
111
  makeRuntimeType(rt: RuntimeType): LanguageExpression;
110
112
  makeTupleAlloc(option: string): LanguageStatement;
113
+ makeTupleAccess(value: string, index: number): LanguageExpression;
111
114
  makeArrayInit(type: idl.IDLContainerType, size?: number): LanguageExpression;
112
115
  makeArrayLength(array: string, length?: string): LanguageExpression;
116
+ makeArrayResize(array: string, arrayType: string, length: string, deserializer: string): LanguageStatement;
113
117
  makeClassInit(type: idl.IDLType, paramenters: LanguageExpression[]): LanguageExpression;
114
118
  makeMapInit(type: idl.IDLType): LanguageExpression;
115
119
  makeMapInsert(keyAccessor: string, key: string, valueAccessor: string, value: string): LanguageStatement;
@@ -136,7 +140,6 @@ export declare class KotlinLanguageWriter extends LanguageWriter {
136
140
  makeCallIsObject(value: string): LanguageExpression;
137
141
  makeNewObject(objectName: string, params?: LanguageExpression[]): LanguageExpression;
138
142
  escapeKeyword(keyword: string): string;
139
- makeDiscriminatorConvertor(convertor: ArgConvertor, value: string, index: number): LanguageExpression | undefined;
140
143
  makeStaticBlock(op: (writer: LanguageWriter) => void): void;
141
144
  pushNamespace(namespace: string, options: {
142
145
  ident: boolean;
@@ -15,11 +15,19 @@
15
15
  import * as idl from '../../idl';
16
16
  import { Language } from '../../Language';
17
17
  import { IndentedPrinter } from "../../IndentedPrinter";
18
- import { AssignStatement, DelegationType, ExpressionStatement, FieldModifier, LambdaExpression, LanguageWriter, Method, MethodModifier, MethodSignature } from "../LanguageWriter";
18
+ import { AssignStatement, DelegationType, ExpressionStatement, FieldModifier, LambdaExpression, LanguageWriter, Method, MethodModifier, MethodSignature, ReturnStatement } from "../LanguageWriter";
19
19
  import { RuntimeType } from "../common";
20
20
  import { isDefined } from "../../util";
21
- import { TSReturnStatement } from './TsLanguageWriter';
22
21
  import { removePoints } from '../convertors/CJConvertors';
22
+ export class KotlinLambdaReturnStatement {
23
+ constructor(expression) {
24
+ this.expression = expression;
25
+ }
26
+ write(writer) {
27
+ if (this.expression)
28
+ writer.print(`${this.expression.asString()}`);
29
+ }
30
+ }
23
31
  export class KotlinEnumEntityStatement {
24
32
  constructor(enumEntity, options) {
25
33
  this.enumEntity = enumEntity;
@@ -122,6 +130,17 @@ export class KotlinThrowErrorStatement {
122
130
  writer.print(`throw Error("${this.message}")`);
123
131
  }
124
132
  }
133
+ class KotlinArrayResizeStatement {
134
+ constructor(array, arrayType, length, deserializer) {
135
+ this.array = array;
136
+ this.arrayType = arrayType;
137
+ this.length = length;
138
+ this.deserializer = deserializer;
139
+ }
140
+ write(writer) {
141
+ writer.print(`${this.array} = ${this.arrayType}(${this.length})`);
142
+ }
143
+ }
125
144
  export class KotlinLoopStatement {
126
145
  constructor(counter, limit, statement) {
127
146
  this.counter = counter;
@@ -171,14 +190,6 @@ export class KotlinNewObjectExpression {
171
190
  return `${this.objectName}(${this.params.map(it => it.asString()).join(", ")})`;
172
191
  }
173
192
  }
174
- export class KotlinCheckDefinedExpression {
175
- constructor(value) {
176
- this.value = value;
177
- }
178
- asString() {
179
- return `${this.value} != null`;
180
- }
181
- }
182
193
  class KotlinUnwrapOptionalExpression {
183
194
  constructor(value) {
184
195
  this.value = value;
@@ -210,6 +221,13 @@ export class KotlinLanguageWriter extends LanguageWriter {
210
221
  return new KotlinLanguageWriter(new IndentedPrinter(), (_a = options === null || options === void 0 ? void 0 : options.resolver) !== null && _a !== void 0 ? _a : this.resolver, this.typeConvertor, this.language);
211
222
  }
212
223
  getNodeName(type) {
224
+ // another stub. Bad one.
225
+ // I hope that I will rewrite LWs soon
226
+ if (idl.isType(type) && idl.isReferenceType(type)) {
227
+ if (type.name.startsWith('%TEXT%:')) {
228
+ return type.name.substring(7);
229
+ }
230
+ }
213
231
  return this.typeConvertor.convert(type);
214
232
  }
215
233
  writeClass(name, op, superClass, interfaces, generics, isDeclared, isAbstract) {
@@ -226,7 +244,8 @@ export class KotlinLanguageWriter extends LanguageWriter {
226
244
  this.printer.print(`}`);
227
245
  }
228
246
  writeInterface(name, op, superInterfaces, generics, isDeclared) {
229
- this.printer.print(`public interface ${name} {`);
247
+ const inheritance = superInterfaces ? (superInterfaces.length > 0 ? `: ${superInterfaces.join(', ')}` : '') : '';
248
+ this.printer.print(`public interface ${name}${inheritance} {`);
230
249
  this.pushIndent();
231
250
  op(this);
232
251
  this.popIndent();
@@ -273,7 +292,73 @@ export class KotlinLanguageWriter extends LanguageWriter {
273
292
  writeNativeMethodDeclaration(method) {
274
293
  let name = method.name;
275
294
  let signature = method.signature;
276
- this.writeMethodImplementation(new Method(name, signature, [MethodModifier.STATIC]), writer => { });
295
+ this.writeMethodImplementation(new Method(name, signature, [MethodModifier.STATIC]), writer => {
296
+ const args = signature.args.map((type, index) => this.convertInteropArgument(signature.argName(index), type));
297
+ const interopCallExpression = this.makeFunctionCall(`kotlin${name}`, args);
298
+ if (signature.returnType === idl.IDLVoidType) {
299
+ this.writeExpressionStatement(interopCallExpression);
300
+ return;
301
+ }
302
+ const retval = "retval";
303
+ this.writeStatement(this.makeAssign(retval, undefined, interopCallExpression));
304
+ this.writeStatement(this.makeReturn(this.convertInteropReturnValue(retval, signature.returnType)));
305
+ });
306
+ }
307
+ convertInteropArgument(varName, type) {
308
+ const realInteropType = this.getNodeName(type);
309
+ let expr;
310
+ switch (realInteropType) {
311
+ case "KPointer":
312
+ case "KSerializerBuffer":
313
+ expr = `${varName}.toCPointer<CPointed>()!!`;
314
+ break;
315
+ case "KInt":
316
+ case "KLong":
317
+ case "KFloat":
318
+ case "KDouble":
319
+ case "KStringPtr":
320
+ case "KBoolean":
321
+ case "Float64":
322
+ case "Float":
323
+ case "Double":
324
+ case "UInt":
325
+ case "Int":
326
+ expr = varName;
327
+ break;
328
+ default: throw new Error(`Unexpected type ${realInteropType} in interop with Kotlin`);
329
+ }
330
+ return this.makeString(expr);
331
+ }
332
+ convertInteropReturnValue(varName, type) {
333
+ const realInteropType = this.getNodeName(type);
334
+ let expr;
335
+ switch (realInteropType) {
336
+ case "KPointer":
337
+ expr = `${varName}.toLong()`;
338
+ break;
339
+ case "KInt":
340
+ case "KLong":
341
+ case "Float64":
342
+ case "Float":
343
+ case "Double":
344
+ case "Long":
345
+ case "Int":
346
+ expr = varName;
347
+ break;
348
+ case "String":
349
+ case "KStringPtr":
350
+ expr = `${varName}?.toKString() ?: ""`;
351
+ break;
352
+ case "Boolean":
353
+ case "KBoolean":
354
+ expr = `${varName} != 0.toByte()`;
355
+ break;
356
+ case "KInteropReturnBuffer":
357
+ expr = `${varName}.useContents { KInteropReturnBuffer(length, data.toLong()) }`;
358
+ break;
359
+ default: throw new Error(`Unexpected type ${realInteropType} in interop with Kotlin`);
360
+ }
361
+ return this.makeString(expr);
277
362
  }
278
363
  writeMethodDeclaration(name, signature, modifiers) {
279
364
  this.writeDeclaration(name, signature, true, false, modifiers);
@@ -301,7 +386,7 @@ export class KotlinLanguageWriter extends LanguageWriter {
301
386
  this.popIndent();
302
387
  this.printer.print(`}`);
303
388
  }
304
- writeProperty(propName, propType, modifiers, getter, setter) {
389
+ writeProperty(propName, propType, modifiers, getter, setter, initExpr) {
305
390
  let containerName = propName.concat("_container");
306
391
  let truePropName = this.escapeKeyword(propName);
307
392
  if (getter) {
@@ -309,9 +394,10 @@ export class KotlinLanguageWriter extends LanguageWriter {
309
394
  this.print(`private var ${containerName}: ${this.getNodeName(propType)}`);
310
395
  }
311
396
  }
312
- let isStatic = modifiers.includes(FieldModifier.STATIC);
313
397
  let isMutable = !modifiers.includes(FieldModifier.READONLY);
314
- this.print(`public ${isMutable ? "var " : "val "}${truePropName}: ${this.getNodeName(propType)}`);
398
+ let isOverride = modifiers.includes(FieldModifier.OVERRIDE);
399
+ let initializer = initExpr ? ` = ${initExpr.asString()}` : "";
400
+ this.print(`${isOverride ? 'override ' : ''}public ${isMutable ? "var " : "val "}${truePropName}: ${this.getNodeName(propType)}${initializer}`);
315
401
  if (getter) {
316
402
  this.pushIndent();
317
403
  this.writeGetterImplementation(getter.method, getter.op);
@@ -363,10 +449,10 @@ export class KotlinLanguageWriter extends LanguageWriter {
363
449
  return new KotlinThrowErrorStatement(message);
364
450
  }
365
451
  makeReturn(expr) {
366
- return new TSReturnStatement(expr);
452
+ return new ReturnStatement(expr);
367
453
  }
368
- makeCheckOptional(optional, doStatement) {
369
- throw new Error("Not implemented");
454
+ makeLambdaReturn(expr) {
455
+ return new KotlinLambdaReturnStatement(expr);
370
456
  }
371
457
  makeStatement(expr) {
372
458
  return new ExpressionStatement(expr);
@@ -378,7 +464,7 @@ export class KotlinLanguageWriter extends LanguageWriter {
378
464
  return new KotlinMapForEachStatement(map, key, value, op);
379
465
  }
380
466
  writePrintLog(message) {
381
- throw new Error("Not implemented");
467
+ this.print(`println(\"${message}\")`);
382
468
  }
383
469
  makeCast(value, node, options) {
384
470
  return this.makeString(`${value.asString()} as ${this.getNodeName(node)}`);
@@ -398,12 +484,18 @@ export class KotlinLanguageWriter extends LanguageWriter {
398
484
  makeTupleAlloc(option) {
399
485
  throw new Error("Not implemented");
400
486
  }
487
+ makeTupleAccess(value, index) {
488
+ return this.makeString(`${value}.component${index + 1}()`);
489
+ }
401
490
  makeArrayInit(type, size) {
402
- return this.makeString(`Array<${this.getNodeName(type.elementType[0])}>(${size !== null && size !== void 0 ? size : ''})`);
491
+ return this.makeString(`ArrayList<${this.getNodeName(type.elementType[0])}>(${size !== null && size !== void 0 ? size : ''})`);
403
492
  }
404
493
  makeArrayLength(array, length) {
405
494
  return this.makeString(`${array}.size`);
406
495
  }
496
+ makeArrayResize(array, arrayType, length, deserializer) {
497
+ return new KotlinArrayResizeStatement(array, arrayType, length, deserializer);
498
+ }
407
499
  makeClassInit(type, paramenters) {
408
500
  throw new Error("Not implemented");
409
501
  }
@@ -411,13 +503,13 @@ export class KotlinLanguageWriter extends LanguageWriter {
411
503
  return this.makeString(`${this.getNodeName(type)}()`);
412
504
  }
413
505
  makeMapInsert(keyAccessor, key, valueAccessor, value) {
414
- return this.makeStatement(this.makeMethodCall(keyAccessor, "set", [this.makeString(key), this.makeString(value)]));
506
+ return this.makeStatement(this.makeMethodCall(keyAccessor, "put", [this.makeString(key), this.makeString(value)]));
415
507
  }
416
508
  makeUnwrapOptional(expression) {
417
509
  return new KotlinUnwrapOptionalExpression(expression);
418
510
  }
419
511
  makeDefinedCheck(value) {
420
- return new KotlinCheckDefinedExpression(value);
512
+ return this.makeString(`${value} != null`);
421
513
  }
422
514
  makeUnionSelector(value, valueType) {
423
515
  return this.makeAssign(valueType, undefined, this.makeMethodCall(value, "getSelector", []), false);
@@ -453,13 +545,13 @@ export class KotlinLanguageWriter extends LanguageWriter {
453
545
  return [MethodModifier.PUBLIC, MethodModifier.PRIVATE, MethodModifier.OVERRIDE];
454
546
  }
455
547
  get supportedFieldModifiers() {
456
- return [FieldModifier.PUBLIC, FieldModifier.PRIVATE, FieldModifier.PROTECTED, FieldModifier.READONLY];
548
+ return [FieldModifier.PUBLIC, FieldModifier.PRIVATE, FieldModifier.PROTECTED, FieldModifier.READONLY, FieldModifier.OVERRIDE];
457
549
  }
458
550
  enumFromI32(value, enumEntry) {
459
551
  return this.makeString(`${this.getNodeName(enumEntry)}(${value.asString()})`);
460
552
  }
461
553
  i32FromEnum(value, enumEntry) {
462
- return this.makeString(`${value.asString()}.value`);
554
+ return this.makeString(`${value.asString()}.value!!`);
463
555
  }
464
556
  makeEnumEntity(enumEntity, options) {
465
557
  return new KotlinEnumWithGetter(enumEntity, options.isExport);
@@ -479,9 +571,6 @@ export class KotlinLanguageWriter extends LanguageWriter {
479
571
  escapeKeyword(keyword) {
480
572
  return keyword;
481
573
  }
482
- makeDiscriminatorConvertor(convertor, value, index) {
483
- throw new Error("Not implemented");
484
- }
485
574
  makeStaticBlock(op) {
486
575
  this.printer.print('companion object {');
487
576
  this.printer.pushIndent();