@idlizer/core 2.1.0 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +15 -2
  2. package/build/lib/src/LanguageWriters/ArgConvertors.js +93 -33
  3. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +34 -14
  4. package/build/lib/src/LanguageWriters/LanguageWriter.js +29 -52
  5. package/build/lib/src/LanguageWriters/convertors/CJConvertors.d.ts +2 -1
  6. package/build/lib/src/LanguageWriters/convertors/CJConvertors.js +16 -5
  7. package/build/lib/src/LanguageWriters/convertors/CppConvertors.d.ts +4 -2
  8. package/build/lib/src/LanguageWriters/convertors/CppConvertors.js +25 -15
  9. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +7 -18
  10. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.d.ts +4 -2
  11. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.js +13 -3
  12. package/build/lib/src/LanguageWriters/convertors/JavaConvertors.d.ts +2 -1
  13. package/build/lib/src/LanguageWriters/convertors/JavaConvertors.js +24 -4
  14. package/build/lib/src/LanguageWriters/convertors/TSConvertors.d.ts +4 -2
  15. package/build/lib/src/LanguageWriters/convertors/TSConvertors.js +49 -29
  16. package/build/lib/src/LanguageWriters/nameConvertor.d.ts +3 -1
  17. package/build/lib/src/LanguageWriters/nameConvertor.js +5 -1
  18. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.d.ts +21 -10
  19. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +56 -65
  20. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.d.ts +4 -1
  21. package/build/lib/src/LanguageWriters/writers/CLikeLanguageWriter.js +1 -1
  22. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.d.ts +16 -10
  23. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +18 -27
  24. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +14 -9
  25. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +18 -21
  26. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +11 -7
  27. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +42 -18
  28. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +14 -6
  29. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +49 -44
  30. package/build/lib/src/LibraryInterface.d.ts +1 -5
  31. package/build/lib/src/config.d.ts +1029 -66
  32. package/build/lib/src/config.js +15 -2
  33. package/build/lib/src/configDescriber.d.ts +30 -3
  34. package/build/lib/src/configDescriber.js +99 -1
  35. package/build/lib/src/from-idl/DtsPrinter.js +32 -20
  36. package/build/lib/src/from-idl/IDLLinter.d.ts +40 -7
  37. package/build/lib/src/from-idl/IDLLinter.js +211 -25
  38. package/build/lib/src/from-idl/common.js +1 -1
  39. package/build/lib/src/from-idl/deserialize.d.ts +4 -1
  40. package/build/lib/src/from-idl/deserialize.js +434 -346
  41. package/build/lib/src/idl.d.ts +28 -18
  42. package/build/lib/src/idl.js +376 -111
  43. package/build/lib/src/idlize.d.ts +3 -1
  44. package/build/lib/src/idlize.js +85 -28
  45. package/build/lib/src/index.d.ts +6 -3
  46. package/build/lib/src/index.js +5 -2
  47. package/build/lib/src/options.d.ts +1 -1
  48. package/build/lib/src/peer-generation/BuilderClass.d.ts +0 -2
  49. package/build/lib/src/peer-generation/BuilderClass.js +0 -8
  50. package/build/lib/src/peer-generation/LayoutManager.d.ts +10 -3
  51. package/build/lib/src/peer-generation/LayoutManager.js +3 -2
  52. package/build/lib/src/peer-generation/Materialized.d.ts +1 -1
  53. package/build/lib/src/peer-generation/Materialized.js +2 -2
  54. package/build/lib/src/peer-generation/PeerClass.d.ts +3 -8
  55. package/build/lib/src/peer-generation/PeerClass.js +0 -1
  56. package/build/lib/src/peer-generation/PeerFile.d.ts +1 -2
  57. package/build/lib/src/peer-generation/PeerFile.js +1 -1
  58. package/build/lib/src/peer-generation/PeerLibrary.d.ts +12 -9
  59. package/build/lib/src/peer-generation/PeerLibrary.js +136 -71
  60. package/build/lib/src/peer-generation/ReferenceResolver.d.ts +1 -1
  61. package/build/lib/src/peer-generation/ReferenceResolver.js +2 -2
  62. package/build/lib/src/peer-generation/idl/IdlNameConvertor.d.ts +1 -0
  63. package/build/lib/src/peer-generation/idl/IdlNameConvertor.js +6 -2
  64. package/build/lib/src/peer-generation/idl/common.d.ts +2 -1
  65. package/build/lib/src/peer-generation/idl/common.js +13 -2
  66. package/build/lib/src/peer-generation/isEnumType.d.ts +5 -0
  67. package/build/lib/src/peer-generation/isEnumType.js +29 -0
  68. package/build/lib/src/peer-generation/isMaterialized.js +25 -8
  69. package/build/lib/src/peer-generation/modules.d.ts +10 -0
  70. package/build/lib/src/peer-generation/modules.js +38 -0
  71. package/build/lib/src/peer-generation/unions.d.ts +3 -2
  72. package/build/lib/src/peer-generation/unions.js +6 -2
  73. package/build/lib/src/resolveNamedNode.d.ts +3 -0
  74. package/build/lib/src/resolveNamedNode.js +105 -0
  75. package/build/lib/src/util.d.ts +7 -0
  76. package/build/lib/src/util.js +39 -0
  77. package/build/lib/src/visitor.d.ts +0 -1
  78. package/build/lib/src/visitor.js +1 -7
  79. package/package.json +2 -2
  80. package/webidl2.js/dist/webidl2.js +35 -7
  81. package/build/lib/src/configMerge.d.ts +0 -2
  82. package/build/lib/src/configMerge.js +0 -42
@@ -14,9 +14,10 @@
14
14
  */
15
15
  import { warn } from 'console';
16
16
  import * as idl from '../idl';
17
+ import { resolveNamedNode } from '../resolveNamedNode';
17
18
  import { Language } from '../Language';
18
19
  import { createLanguageWriter } from '../LanguageWriters';
19
- import { BufferConvertor, CallbackConvertor, DateConvertor, MapConvertor, PointerConvertor, TupleConvertor, TypeAliasConvertor, AggregateConvertor, StringConvertor, ClassConvertor, ArrayConvertor, FunctionConvertor, OptionConvertor, NumberConvertor, NumericConvertor, CustomTypeConvertor, UnionConvertor, MaterializedClassConvertor, BooleanConvertor, EnumConvertor, UndefinedConvertor, VoidConvertor, ImportTypeConvertor, InterfaceConvertor, BigIntToU64Convertor, } from "../LanguageWriters/ArgConvertors";
20
+ import { BufferConvertor, CallbackConvertor, DateConvertor, MapConvertor, PointerConvertor, TupleConvertor, TypeAliasConvertor, AggregateConvertor, StringConvertor, ClassConvertor, ArrayConvertor, FunctionConvertor, OptionConvertor, NumberConvertor, NumericConvertor, CustomTypeConvertor, UnionConvertor, MaterializedClassConvertor, BooleanConvertor, EnumConvertor, UndefinedConvertor, VoidConvertor, ImportTypeConvertor, InterfaceConvertor, BigIntToU64Convertor, ObjectConvertor, } from "../LanguageWriters/ArgConvertors";
20
21
  import { CppNameConvertor } from '../LanguageWriters/convertors/CppConvertors';
21
22
  import { CJTypeNameConvertor } from '../LanguageWriters/convertors/CJConvertors';
22
23
  import { CppConvertor } from '../LanguageWriters/convertors/CppConvertors';
@@ -29,6 +30,8 @@ import { LayoutManager } from './LayoutManager';
29
30
  import { lib, query } from '../library';
30
31
  import { isMaterialized } from './isMaterialized';
31
32
  import { isInIdlizeInternal } from '../idlize';
33
+ import { isInCurrentModule } from './modules';
34
+ import { generatorConfiguration } from '../config';
32
35
  export const lenses = {
33
36
  globals: lib.lens(lib.select.files())
34
37
  .pipe(lib.select.nodes())
@@ -42,6 +45,8 @@ export const lenses = {
42
45
  };
43
46
  const next = queue.pop();
44
47
  next.forEach(node => {
48
+ if (!isInCurrentModule(node))
49
+ return;
45
50
  if (idl.isNamespace(node)) {
46
51
  queue.push(node.members);
47
52
  }
@@ -65,11 +70,13 @@ export class PeerLibrary {
65
70
  return this._cachedIdlLibrary;
66
71
  }
67
72
  this._cachedIdlLibrary = {
68
- files: this.files.map(file => file.file)
73
+ files: this.files.map(file => file)
69
74
  };
70
75
  return this._cachedIdlLibrary;
71
76
  }
72
- get globals() { return query(this.asIDLLibrary(), lenses.globals); }
77
+ get globals() {
78
+ return query(this.asIDLLibrary(), lenses.globals);
79
+ }
73
80
  initSyntheticEntries(file) {
74
81
  this._syntheticFile = file;
75
82
  }
@@ -82,18 +89,20 @@ export class PeerLibrary {
82
89
  get materializedToGenerate() {
83
90
  return Array.from(this.materializedClasses.values()).filter(it => it.needBeGenerated);
84
91
  }
85
- constructor(language, libraryPackages) {
92
+ constructor(language, useMemoM3 = false) {
86
93
  this.language = language;
87
- this.libraryPackages = libraryPackages;
94
+ this.useMemoM3 = useMemoM3;
88
95
  this.layout = LayoutManager.Empty();
89
96
  this._syntheticFile = idl.createFile([]);
90
97
  this.files = [];
98
+ this.auxFiles = [];
91
99
  this.builderClasses = new Map();
92
100
  this.materializedClasses = new Map();
93
101
  this.name = "";
94
102
  this.customComponentMethods = [];
95
103
  this.targetNameConvertorInstance = this.createTypeNameConvertor(this.language);
96
104
  this.interopNameConvertorInstance = new CppNameConvertor(this);
105
+ this._useFallback = true;
97
106
  }
98
107
  createLanguageWriter(language) {
99
108
  return createLanguageWriter(language !== null && language !== void 0 ? language : this.language, this);
@@ -138,80 +147,121 @@ export class PeerLibrary {
138
147
  this.context = context;
139
148
  }
140
149
  findFileByOriginalFilename(filename) {
141
- return this.files.find(it => it.originalFilename === filename);
150
+ return this.files.find(it => it.fileName === filename);
142
151
  }
143
152
  mapType(type) {
144
153
  return this.targetNameConvertorInstance.convert(type);
145
154
  }
146
- resolveTypeReference(type) {
147
- return this.resolveTypeReferenceScoped(type);
155
+ enableCache() {
156
+ this.referenceCache = new Map();
157
+ }
158
+ resolveTypeReference(type, singleStep) {
159
+ var _a, _b;
160
+ if ((_a = this.referenceCache) === null || _a === void 0 ? void 0 : _a.has(type))
161
+ return this.referenceCache.get(type);
162
+ let result = this.resolveNamedNode(type.name.split("."), type.parent);
163
+ if (!singleStep) {
164
+ const seen = new Set;
165
+ while (result) {
166
+ let nextResult = undefined;
167
+ if (idl.isImport(result))
168
+ nextResult = this.resolveImport(result);
169
+ else if (idl.isReferenceType(result))
170
+ nextResult = this.resolveNamedNode(result.name.split("."));
171
+ else if (idl.isTypedef(result) && idl.isReferenceType(result.type))
172
+ nextResult = this.resolveNamedNode(result.type.name.split("."));
173
+ if (!nextResult)
174
+ break;
175
+ if (seen.has(nextResult)) {
176
+ console.warn(`Cyclic referenceType: ${type.name}, seen: [${[...seen.values()].map(idl.getFQName).join(", ")}]`);
177
+ break;
178
+ }
179
+ seen.add(nextResult);
180
+ result = nextResult;
181
+ }
182
+ }
183
+ if (result && (idl.isImport(result) || idl.isNamespace(result)))
184
+ result = undefined;
185
+ if (result)
186
+ (_b = this.referenceCache) === null || _b === void 0 ? void 0 : _b.set(type, result);
187
+ return result;
188
+ }
189
+ disableFallback() {
190
+ this._useFallback = false;
148
191
  }
149
- resolveTypeReferenceScoped(type, pointOfView, rootEntries) {
150
- const entry = this._syntheticFile.entries.find(it => it.name === type.name);
192
+ resolveNamedNode(target, pov = undefined) {
193
+ const qualifiedName = target.join(".");
194
+ const entry = this._syntheticFile.entries.find(it => it.name === qualifiedName);
151
195
  if (entry)
152
196
  return entry;
153
- const qualifiedName = type.name.split(".");
154
- let pointOfViewNamespace = idl.fetchNamespaceFrom(type.parent);
155
- // TODO: Choose what to do if `rootEntries.some(it => idl.isNamespace(it))`
156
- // One of possible options - `rootEntries = rootEntries.flatMap(it => idl.isNamespace(it) ? it.members : it)` - cause error
157
- rootEntries !== null && rootEntries !== void 0 ? rootEntries : (rootEntries = this.files.flatMap(it => it.entries));
158
- if (1 === qualifiedName.length) {
159
- const predefined = rootEntries.filter(it => isInIdlizeInternal(it));
160
- const found = predefined.find(it => it.name === qualifiedName[0]);
197
+ if (1 === target.length) {
198
+ const predefined = this.files.flatMap(it => it.entries).filter(isInIdlizeInternal);
199
+ const found = predefined.find(it => it.name === target.at(-1));
161
200
  if (found)
162
201
  return found;
163
202
  }
164
- let doWork = true;
165
- while (doWork) {
166
- doWork = !!pointOfViewNamespace;
167
- let entries = pointOfViewNamespace
168
- ? [...pointOfViewNamespace.members]
169
- : [...rootEntries];
170
- for (let qualifiedNamePart = 0; qualifiedNamePart < qualifiedName.length; ++qualifiedNamePart) {
171
- const candidates = entries.filter(it => it.name === qualifiedName[qualifiedNamePart]);
172
- if (!candidates.length)
173
- break;
174
- if (qualifiedNamePart === qualifiedName.length - 1) {
175
- const target = candidates.length == 1
176
- ? candidates[0]
177
- : candidates.find(it => !idl.hasExtAttribute(it, idl.IDLExtendedAttributes.Import)); // probably the wrong logic here
178
- if (target && idl.isImport(target)) // Temporary disable Import declarations
179
- return undefined;
180
- return target;
181
- }
182
- entries = [];
183
- for (const candidate of candidates) {
184
- if (idl.isNamespace(candidate))
185
- entries.push(...candidate.members);
186
- else if (idl.isEnum(candidate))
187
- entries.push(...candidate.elements);
188
- else if (idl.isInterface(candidate))
189
- entries.push(...candidate.constants, ...candidate.properties, ...candidate.methods);
190
- }
203
+ const corpus = this.files.concat(this.auxFiles);
204
+ let result = resolveNamedNode(target, pov, corpus);
205
+ if (result && idl.isEntry(result))
206
+ return result;
207
+ if (1 == target.length) {
208
+ const stdScopes = generatorConfiguration().globalPackages.map(it => it.split('.'));
209
+ for (const stdScope of stdScopes) {
210
+ result = resolveNamedNode([...stdScope, ...target], undefined, corpus);
211
+ if (result && idl.isEntry(result))
212
+ return result;
191
213
  }
192
- pointOfViewNamespace = idl.fetchNamespaceFrom(pointOfViewNamespace === null || pointOfViewNamespace === void 0 ? void 0 : pointOfViewNamespace.parent);
193
214
  }
194
215
  // TODO: remove the next block after namespaces out of quarantine
195
- if (!pointOfView) {
216
+ if (this._useFallback) {
217
+ const povAsReadableString = pov
218
+ ? `'${idl.getFQName(pov)}'`
219
+ : "[root]";
220
+ // retry from root
221
+ pov = undefined;
196
222
  const resolveds = [];
223
+ for (let file of this.files) {
224
+ result = resolveNamedNode([...file.packageClause, ...target], pov, corpus);
225
+ if (result && idl.isEntry(result)) {
226
+ // too much spam
227
+ // console.warn(`WARNING: Type reference '${qualifiedName}' is not resolved from ${povAsReadableString} but resolved from some package '${file.packageClause().join(".")}'`)
228
+ resolveds.push(result);
229
+ }
230
+ }
231
+ // and from each namespace
197
232
  const traverseNamespaces = (entry) => {
198
233
  if (entry && idl.isNamespace(entry) && entry.members.length) {
199
- //console.log(`Try alien namespace '${idl.getNamespacesPathFor(entry.members[0]).map(obj => obj.name).join(".")}' to resolve name '${type.name}'`)
200
- const resolved = this.resolveTypeReferenceScoped(type, entry, rootEntries);
201
- if (resolved)
234
+ const resolved = resolveNamedNode([...idl.getNamespacesPathFor(entry).map(it => it.name), ...target], pov, corpus);
235
+ if (resolved) {
236
+ console.warn(`WARNING: Name '${qualifiedName}' is not resolved from ${povAsReadableString} but resolved from some namespace: '${idl.getNamespacesPathFor(resolved).map(obj => obj.name).join(".")}'`);
202
237
  resolveds.push(resolved);
238
+ }
203
239
  entry.members.forEach(traverseNamespaces);
204
240
  }
205
241
  };
206
242
  this.files.forEach(file => file.entries.forEach(traverseNamespaces));
207
- if (resolveds.length)
208
- console.log(`WARNING: Type reference '${type.name}' is not resolved without own namespace/pointOfView but resolved within some other namespace: '${idl.getNamespacesPathFor(resolveds[0]).map(obj => obj.name).join(".")}'`);
243
+ for (const resolved of resolveds)
244
+ if (idl.isEntry(resolved))
245
+ return resolved;
209
246
  } // end of block to remove
210
- return undefined; // empty result
247
+ return undefined;
211
248
  }
212
- hasInLibrary(entry) {
213
- var _a, _b;
214
- return !((_a = this.libraryPackages) === null || _a === void 0 ? void 0 : _a.length) || ((_b = this.libraryPackages) === null || _b === void 0 ? void 0 : _b.includes(idl.getPackageName(entry)));
249
+ resolveImport(target) {
250
+ let result = this.resolveNamedNode(target.clause);
251
+ if (result) {
252
+ if (idl.isReferenceType(result))
253
+ return this.resolveTypeReference(result);
254
+ if (idl.isImport(result)) {
255
+ if (result == target) {
256
+ console.log("Self-targeted Import?");
257
+ return undefined;
258
+ }
259
+ return this.resolveImport(result);
260
+ }
261
+ if (idl.isEntry(result))
262
+ return result;
263
+ }
264
+ return undefined;
215
265
  }
216
266
  typeConvertor(param, type, isOptionalParam = false) {
217
267
  if (isOptionalParam) {
@@ -234,6 +284,7 @@ export class PeerLibrary {
234
284
  case idl.IDLF32Type: return new NumericConvertor(param, type);
235
285
  case idl.IDLF64Type: return new NumericConvertor(param, type);
236
286
  case idl.IDLBigintType: return new BigIntToU64Convertor(param);
287
+ case idl.IDLSerializerBuffer: new PointerConvertor(param);
237
288
  case idl.IDLPointerType: return new PointerConvertor(param);
238
289
  case idl.IDLBufferType: return new BufferConvertor(param);
239
290
  case idl.IDLBooleanType: return new BooleanConvertor(param);
@@ -242,16 +293,16 @@ export class PeerLibrary {
242
293
  case idl.IDLUndefinedType: return new UndefinedConvertor(param);
243
294
  case idl.IDLVoidType: return new VoidConvertor(param);
244
295
  case idl.IDLUnknownType:
245
- case idl.IDLAnyType: return new CustomTypeConvertor(param, "Any", false, "Object");
296
+ case idl.IDLAnyType: return new ObjectConvertor(param, idl.IDLAnyType);
246
297
  case idl.IDLDate: return new DateConvertor(param);
298
+ case idl.IDLFunctionType: return new FunctionConvertor(this, param);
247
299
  default: throw new Error(`Unconverted primitive ${idl.DebugUtils.debugPrintType(type)}`);
248
300
  }
249
301
  }
250
302
  if (idl.isReferenceType(type)) {
251
- if (isImportAttr(type))
252
- return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
253
303
  // TODO: special cases for interop types.
254
- switch (type.name) {
304
+ // TODO: this types are not references! NativeModulePrinter must be fixed
305
+ switch (type.name.replaceAll('%TEXT%:', '')) { // this is really bad stub, to fix legacy references
255
306
  case 'KBoolean': return new BooleanConvertor(param);
256
307
  case 'KInt': return new NumericConvertor(param, idl.IDLI32Type);
257
308
  case 'KFloat': return new NumericConvertor(param, idl.IDLF32Type);
@@ -261,7 +312,12 @@ export class PeerLibrary {
261
312
  case 'number': return new NumberConvertor(param);
262
313
  case 'KPointer': return new PointerConvertor(param);
263
314
  }
315
+ if (generatorConfiguration().forceResource.includes(type.name)) {
316
+ return new ObjectConvertor(param, type);
317
+ }
264
318
  const decl = this.resolveTypeReference(type);
319
+ if (decl && isImportAttr(decl) || !decl && isImportAttr(type))
320
+ return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
265
321
  return this.declarationConvertor(param, type, decl);
266
322
  }
267
323
  if (idl.isUnionType(type)) {
@@ -280,15 +336,28 @@ export class PeerLibrary {
280
336
  throw new Error(`Cannot convert: ${type.kind}`);
281
337
  }
282
338
  declarationConvertor(param, type, declaration) {
339
+ if (generatorConfiguration().forceResource.includes(type.name)) {
340
+ return new ObjectConvertor(param, type);
341
+ }
283
342
  let customConv = this.customConvertor(param, type.name, type);
284
343
  if (customConv)
285
344
  return customConv;
286
- if (!declaration)
345
+ if (!declaration) {
287
346
  return new CustomTypeConvertor(param, this.targetNameConvertorInstance.convert(type), false, this.targetNameConvertorInstance.convert(type)); // assume some predefined type
347
+ }
288
348
  const declarationName = declaration.name;
289
349
  if (isImportAttr(declaration)) {
290
350
  return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
291
351
  }
352
+ if (idl.isImport(declaration)) {
353
+ const target = this.resolveImport(declaration);
354
+ if (target && idl.isEntry(target))
355
+ return this.declarationConvertor(param, type, target);
356
+ else {
357
+ warn(`Unable to resolve Import ${declaration.clause.join(".")} as ${declaration.name}`);
358
+ return new CustomTypeConvertor(param, declaration.name, false, declaration.name);
359
+ }
360
+ }
292
361
  if (idl.isEnum(declaration)) {
293
362
  return new EnumConvertor(param, declaration);
294
363
  }
@@ -327,11 +396,11 @@ export class PeerLibrary {
327
396
  customConvertor(param, typeName, type) {
328
397
  switch (typeName) {
329
398
  case `Object`:
330
- return new CustomTypeConvertor(param, "Object", false, "Object");
399
+ return new ObjectConvertor(param, idl.IDLObjectType);
331
400
  case `Date`:
332
401
  return new DateConvertor(param);
333
402
  case `Function`:
334
- return new FunctionConvertor(this, param, type);
403
+ return new FunctionConvertor(this, param);
335
404
  case `Record`:
336
405
  return new CustomTypeConvertor(param, "Record", false, "Record<string, string>");
337
406
  case `Optional`:
@@ -355,18 +424,12 @@ export class PeerLibrary {
355
424
  case "object":
356
425
  case "Object": return ArkCustomObject;
357
426
  }
358
- if (isImportAttr(type)) {
359
- return ArkCustomObject;
360
- }
361
427
  if (idl.isReferenceType(type)) {
362
428
  // TODO: remove all this!
363
- if (type.name === 'Dimension' || type.name === 'Length') {
364
- return ArkLength;
365
- }
366
429
  if (type.name === 'Date') {
367
430
  return ArkDate;
368
431
  }
369
- if (type.name === 'AnimationRange' || type.name === 'ContentModifier') {
432
+ if (type.name === 'AnimationRange') {
370
433
  return ArkCustomObject;
371
434
  }
372
435
  if (type.name === 'Function') {
@@ -387,6 +450,9 @@ export class PeerLibrary {
387
450
  : idl.isTypedef(decl) ? this.toDeclaration(decl.type)
388
451
  : decl;
389
452
  }
453
+ if (isImportAttr(type)) {
454
+ return ArkCustomObject;
455
+ }
390
456
  return type;
391
457
  }
392
458
  setFileLayout(strategy) {
@@ -396,7 +462,6 @@ export class PeerLibrary {
396
462
  export const ArkInt32 = idl.IDLI32Type;
397
463
  export const ArkInt64 = idl.IDLI64Type;
398
464
  export const ArkFunction = idl.IDLFunctionType;
399
- export const ArkLength = idl.IDLLengthType;
400
465
  export const ArkDate = idl.IDLDate;
401
466
  export const ArkCustomObject = idl.IDLCustomObjectType;
402
467
  export function cleanPrefix(name, prefix) {
@@ -1,6 +1,6 @@
1
1
  import * as idl from '../idl';
2
2
  export interface ReferenceResolver {
3
- resolveTypeReference(type: idl.IDLReferenceType, pointOfView?: idl.IDLEntry, rootEntries?: idl.IDLEntry[]): idl.IDLEntry | undefined;
3
+ resolveTypeReference(type: idl.IDLReferenceType, terminalImports?: boolean): idl.IDLEntry | undefined;
4
4
  toDeclaration(type: idl.IDLNode): idl.IDLNode;
5
5
  }
6
6
  export declare function createEmptyReferenceResolver(): ReferenceResolver;
@@ -25,9 +25,9 @@ export function createEmptyReferenceResolver() {
25
25
  /** Please do not store any global instances */
26
26
  export function createAlternativeReferenceResolver(mainResolver, alternatives) {
27
27
  return {
28
- resolveTypeReference(type, pointOfView, rootEntries) {
28
+ resolveTypeReference(type, terminalImports) {
29
29
  var _a;
30
- return (_a = mainResolver.resolveTypeReference(type, pointOfView, rootEntries)) !== null && _a !== void 0 ? _a : alternatives.get(type.name);
30
+ return (_a = mainResolver.resolveTypeReference(type, terminalImports)) !== null && _a !== void 0 ? _a : alternatives.get(type.name);
31
31
  },
32
32
  toDeclaration(type) {
33
33
  return mainResolver.toDeclaration(type);
@@ -2,6 +2,7 @@ import * as idl from "../../idl";
2
2
  import { DeclarationConvertor } from "../../LanguageWriters/nameConvertor";
3
3
  import { Language } from "../../Language";
4
4
  export declare class DeclarationNameConvertor implements DeclarationConvertor<string> {
5
+ convertImport(decl: idl.IDLImport): string;
5
6
  convertInterface(decl: idl.IDLInterface): string;
6
7
  convertEnum(decl: idl.IDLEnum): string;
7
8
  convertTypedef(decl: idl.IDLTypedef): string;
@@ -15,6 +15,10 @@
15
15
  import * as idl from "../../idl";
16
16
  import { Language } from "../../Language";
17
17
  export class DeclarationNameConvertor {
18
+ convertImport(decl) {
19
+ console.warn("Imports are not implemented yet");
20
+ return decl.name;
21
+ }
18
22
  convertInterface(decl) {
19
23
  return decl.name;
20
24
  }
@@ -50,10 +54,10 @@ export class TSFeatureNameConvertor extends DeclarationNameConvertor {
50
54
  TSFeatureNameConvertor.I = new TSFeatureNameConvertor();
51
55
  export class ETSDeclarationNameConvertor extends DeclarationNameConvertor {
52
56
  convertInterface(decl) {
53
- return idl.getFQName(decl);
57
+ return idl.getQualifiedName(decl, "namespace.name");
54
58
  }
55
59
  convertEnum(decl) {
56
- return idl.getFQName(decl);
60
+ return idl.getQualifiedName(decl, "namespace.name");
57
61
  }
58
62
  }
59
63
  ETSDeclarationNameConvertor.I = new ETSDeclarationNameConvertor();
@@ -1,9 +1,10 @@
1
1
  import * as idl from "../../idl";
2
2
  import { Language } from "../../Language";
3
3
  export declare function generateSyntheticIdlNodeName(type: idl.IDLType): string;
4
- export declare function qualifiedName(decl: idl.IDLNode, languageOrDelimiter: Language | string): string;
4
+ export declare function qualifiedName(decl: idl.IDLNode, languageOrDelimiter: Language | string, pattern: idl.QNPattern): string;
5
5
  export declare function collapseTypes(types: idl.IDLType[], name?: string): idl.IDLType;
6
6
  export declare function generifiedTypeName(refType: idl.IDLReferenceType | undefined, refName?: string): string | undefined;
7
+ export declare function sanitizeGenerics(genericDeclarationString: string): string;
7
8
  export declare function generateSyntheticUnionName(types: idl.IDLType[]): string;
8
9
  export declare function generateSyntheticFunctionName(parameters: idl.IDLParameter[], returnType: idl.IDLType, isAsync?: boolean): string;
9
10
  export declare function isImportAttr(decl: idl.IDLNode): boolean;
@@ -33,7 +33,7 @@ export function generateSyntheticIdlNodeName(type) {
33
33
  return `Opt_${generateSyntheticIdlNodeName(type.type)}`;
34
34
  throw `Can not compute type name of ${idl.IDLKind[type.kind]}`;
35
35
  }
36
- export function qualifiedName(decl, languageOrDelimiter) {
36
+ export function qualifiedName(decl, languageOrDelimiter, pattern) {
37
37
  if (!idl.isNamedNode(decl))
38
38
  throw new Error("internal error, name required for no-named node");
39
39
  const delimiter = typeof languageOrDelimiter === "string"
@@ -41,7 +41,7 @@ export function qualifiedName(decl, languageOrDelimiter) {
41
41
  : (languageOrDelimiter === Language.CPP ? '_' : '.');
42
42
  if (!idl.isEntry(decl))
43
43
  throw new Error(`Expected to have an IDLEntry, got ${idl.IDLKind[decl.kind]}`);
44
- return idl.getFQName(decl).split(".").join(delimiter);
44
+ return idl.getQualifiedName(decl, pattern).split(".").join(delimiter);
45
45
  }
46
46
  export function collapseTypes(types, name) {
47
47
  const seenNames = new Set();
@@ -61,6 +61,17 @@ export function generifiedTypeName(refType, refName) {
61
61
  const typeArgs = (_a = refType.typeArguments) === null || _a === void 0 ? void 0 : _a.map(it => idl.printType(it)).join(",");
62
62
  return `${refName ? refName : refType.name}${typeArgs ? `<${typeArgs}>` : ``}`;
63
63
  }
64
+ export function sanitizeGenerics(genericDeclarationString) {
65
+ const eqIdx = genericDeclarationString.indexOf('=');
66
+ if (eqIdx !== -1) {
67
+ genericDeclarationString = genericDeclarationString.substring(0, eqIdx);
68
+ }
69
+ const extendsIdx = genericDeclarationString.indexOf('extends');
70
+ if (extendsIdx !== -1) {
71
+ genericDeclarationString = genericDeclarationString.substring(0, extendsIdx);
72
+ }
73
+ return genericDeclarationString.trim();
74
+ }
64
75
  export function generateSyntheticUnionName(types) {
65
76
  return `Union_${types.map(it => generateSyntheticIdlNodeName(it)).join("_").replaceAll(".", "_")}`;
66
77
  }
@@ -0,0 +1,5 @@
1
+ import { ReferenceResolver } from './ReferenceResolver';
2
+ import { IDLType } from "../idl";
3
+ export declare function isEnumType(type: IDLType, resolver: ReferenceResolver): boolean;
4
+ export declare function isStringEnumType(type: IDLType, resolver: ReferenceResolver): boolean;
5
+ //# sourceMappingURL=isEnumType.d.ts.map
@@ -0,0 +1,29 @@
1
+ /*
2
+ * Copyright (c) 2025 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 { isReferenceType, isEnum, isStringEnum } from "../idl";
16
+ export function isEnumType(type, resolver) {
17
+ return toEnum(type, resolver) != undefined;
18
+ }
19
+ export function isStringEnumType(type, resolver) {
20
+ const enumNode = toEnum(type, resolver);
21
+ return enumNode ? isStringEnum(enumNode) : false;
22
+ }
23
+ function toEnum(type, resolver) {
24
+ if (!isReferenceType(type))
25
+ return undefined;
26
+ const resolved = resolver.resolveTypeReference(type);
27
+ return resolved && isEnum(resolved) ? resolved : undefined;
28
+ }
29
+ //# sourceMappingURL=isEnumType.js.map
@@ -16,20 +16,27 @@ import { generatorConfiguration } from '../config';
16
16
  import * as idl from '../idl';
17
17
  import { isBuilderClass } from './BuilderClass';
18
18
  export function isMaterialized(declaration, resolver) {
19
+ var _a;
19
20
  if (!idl.isInterfaceSubkind(declaration) && !idl.isClassSubkind(declaration))
20
21
  return false;
21
22
  if (idl.isHandwritten(declaration) || isBuilderClass(declaration))
22
23
  return false;
23
- for (const forceMaterialized of generatorConfiguration().forceMaterialized) {
24
- if (declaration.name == forceMaterialized)
25
- return true;
26
- }
27
- if (generatorConfiguration().forceCallback.includes(declaration.name)) {
24
+ if (generatorConfiguration().forceResource.includes(declaration.name)) {
28
25
  return false;
29
26
  }
30
- for (const ignore of generatorConfiguration().ignoreMaterialized) {
31
- if (declaration.name.endsWith(ignore))
27
+ if (generatorConfiguration().forceMaterialized.includes(declaration.name)) {
28
+ return true;
29
+ }
30
+ for (const ignore of ["Attribute", "Method", "Interface"]) {
31
+ if (declaration.name.endsWith(ignore)) {
32
32
  return false;
33
+ }
34
+ }
35
+ if (((_a = generatorConfiguration().forceCallback.get(declaration.name)) === null || _a === void 0 ? void 0 : _a.length) === 0) {
36
+ return false;
37
+ }
38
+ if (generatorConfiguration().ignoreMaterialized.includes(declaration.name)) {
39
+ return false;
33
40
  }
34
41
  // A materialized class is a class or an interface with methods
35
42
  // excluding components and related classes
@@ -46,11 +53,21 @@ export function isMaterialized(declaration, resolver) {
46
53
  }
47
54
  return false;
48
55
  }
56
+ function isSelfReturnMethod(method, entry, resolver) {
57
+ if (!idl.isReferenceType(method.returnType)) {
58
+ return false;
59
+ }
60
+ const found = resolver.resolveTypeReference(method.returnType);
61
+ if (!found) {
62
+ return false;
63
+ }
64
+ return idl.getFQName(found) === idl.getFQName(entry);
65
+ }
49
66
  export function isStaticMaterialized(declaration, resolver) {
50
67
  if (isMaterialized(declaration, resolver)) {
51
68
  if (declaration.properties.length || declaration.constructors.length)
52
69
  return false;
53
- if (!declaration.methods.every(it => it.isStatic))
70
+ if (!declaration.methods.every(it => it.isStatic && !isSelfReturnMethod(it, declaration, resolver)))
54
71
  return false;
55
72
  if (idl.hasSuperType(declaration)) {
56
73
  const superType = resolver.resolveTypeReference(idl.getSuperType(declaration));
@@ -0,0 +1,10 @@
1
+ import { ModuleConfiguration } from "../config";
2
+ import * as idl from "../idl";
3
+ export declare function isInModule(node: idl.IDLNode, module: ModuleConfiguration): boolean;
4
+ export declare function isInModule(packageName: string, module: ModuleConfiguration): boolean;
5
+ export declare function getModuleFor(node: idl.IDLNode): ModuleConfiguration;
6
+ export declare function getModuleFor(packageName: string): ModuleConfiguration;
7
+ export declare function currentModule(): ModuleConfiguration;
8
+ export declare function isInCurrentModule(node: idl.IDLNode): boolean;
9
+ export declare function isInCurrentModule(packageName: string): boolean;
10
+ //# sourceMappingURL=modules.d.ts.map
@@ -0,0 +1,38 @@
1
+ import { generatorConfiguration } from "../config";
2
+ import * as idl from "../idl";
3
+ export function isInModule(nodeOrPackage, module) {
4
+ if (typeof nodeOrPackage === 'object')
5
+ return isInModule(idl.getPackageName(nodeOrPackage), module);
6
+ return module.packages.some(modulePackage => nodeOrPackage.startsWith(modulePackage));
7
+ }
8
+ export function getModuleFor(nodeOrPackage) {
9
+ if (typeof nodeOrPackage === "object")
10
+ return getModuleFor(idl.getPackageName(nodeOrPackage));
11
+ const packageName = nodeOrPackage;
12
+ const config = generatorConfiguration();
13
+ const applicableModules = [...config.modules.values()].filter(module => isInModule(packageName, module));
14
+ if (applicableModules.length === 0) {
15
+ if (nodeOrPackage === '') {
16
+ console.error("WARNING: use current module for empty package");
17
+ return currentModule();
18
+ }
19
+ throw new Error(`Package ${packageName} is not listed in any module`);
20
+ }
21
+ if (applicableModules.length > 1)
22
+ throw new Error(`Package ${packageName} listed in ${applicableModules.length} packages: ${applicableModules.map(it => it.name).join(", ")}`);
23
+ return applicableModules[0];
24
+ }
25
+ export function currentModule() {
26
+ const conf = generatorConfiguration();
27
+ const result = conf.modules.get(conf.moduleName);
28
+ if (!result)
29
+ throw new Error(`Can not determine current module configuration ${conf.moduleName}`);
30
+ return result;
31
+ }
32
+ export function isInCurrentModule(nodeOrPackage) {
33
+ if (typeof nodeOrPackage === 'string')
34
+ return isInModule(nodeOrPackage, currentModule());
35
+ else
36
+ return isInModule(nodeOrPackage, currentModule());
37
+ }
38
+ //# sourceMappingURL=modules.js.map
@@ -1,5 +1,5 @@
1
1
  import { TypeConvertor } from "../LanguageWriters";
2
- import { IDLContainerType, IDLOptionalType, IDLPrimitiveType, IDLReferenceType, IDLType, IDLTypeParameterType, IDLUnionType } from '../idl';
2
+ import { IDLImport, IDLContainerType, IDLOptionalType, IDLPrimitiveType, IDLReferenceType, IDLType, IDLTypeParameterType, IDLUnionType } from '../idl';
3
3
  import { LanguageExpression, LanguageWriter } from "../LanguageWriters/LanguageWriter";
4
4
  import { ArgConvertor } from "../LanguageWriters/ArgConvertors";
5
5
  import { LibraryInterface } from "../LibraryInterface";
@@ -7,11 +7,12 @@ import { ReferenceResolver } from "./ReferenceResolver";
7
7
  export declare class UnionFlattener implements TypeConvertor<IDLType[]> {
8
8
  private resolver;
9
9
  constructor(resolver: ReferenceResolver);
10
+ convertImport(type: IDLImport): IDLType[];
10
11
  convertUnion(type: IDLUnionType): IDLType[];
11
12
  convertTypeReference(type: IDLReferenceType): IDLType[];
12
13
  convertOptional(type: IDLOptionalType): IDLType[];
13
14
  convertContainer(type: IDLContainerType): IDLType[];
14
- convertImport(type: IDLReferenceType, importClause: string): IDLType[];
15
+ convertTypeReferenceAsImport(type: IDLReferenceType, importClause: string): IDLType[];
15
16
  convertPrimitiveType(type: IDLPrimitiveType): IDLType[];
16
17
  convertTypeParameter(type: IDLTypeParameterType): IDLType[];
17
18
  }