@idlizer/core 2.1.2 → 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 (79) hide show
  1. package/build/lib/src/LanguageWriters/ArgConvertors.d.ts +3 -3
  2. package/build/lib/src/LanguageWriters/ArgConvertors.js +36 -30
  3. package/build/lib/src/LanguageWriters/LanguageWriter.d.ts +26 -13
  4. package/build/lib/src/LanguageWriters/LanguageWriter.js +26 -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 +20 -12
  9. package/build/lib/src/LanguageWriters/convertors/ETSConvertors.js +7 -17
  10. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.d.ts +4 -2
  11. package/build/lib/src/LanguageWriters/convertors/InteropConvertors.js +9 -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 +47 -28
  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 +12 -9
  19. package/build/lib/src/LanguageWriters/writers/CJLanguageWriter.js +10 -37
  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 +9 -9
  23. package/build/lib/src/LanguageWriters/writers/CppLanguageWriter.js +15 -24
  24. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.d.ts +14 -8
  25. package/build/lib/src/LanguageWriters/writers/ETSLanguageWriter.js +18 -18
  26. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.d.ts +4 -6
  27. package/build/lib/src/LanguageWriters/writers/JavaLanguageWriter.js +15 -14
  28. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.d.ts +7 -5
  29. package/build/lib/src/LanguageWriters/writers/TsLanguageWriter.js +22 -43
  30. package/build/lib/src/LibraryInterface.d.ts +1 -4
  31. package/build/lib/src/config.d.ts +206 -66
  32. package/build/lib/src/config.js +7 -3
  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 +30 -18
  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 +25 -17
  42. package/build/lib/src/idl.js +363 -109
  43. package/build/lib/src/idlize.d.ts +2 -1
  44. package/build/lib/src/idlize.js +82 -26
  45. package/build/lib/src/index.d.ts +4 -3
  46. package/build/lib/src/index.js +3 -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 -7
  59. package/build/lib/src/peer-generation/PeerLibrary.js +129 -65
  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/isMaterialized.js +25 -8
  67. package/build/lib/src/peer-generation/unions.d.ts +3 -2
  68. package/build/lib/src/peer-generation/unions.js +6 -2
  69. package/build/lib/src/resolveNamedNode.d.ts +3 -0
  70. package/build/lib/src/resolveNamedNode.js +105 -0
  71. package/build/lib/src/util.d.ts +6 -0
  72. package/build/lib/src/util.js +33 -0
  73. package/build/lib/src/visitor.d.ts +0 -1
  74. package/build/lib/src/visitor.js +1 -7
  75. package/package.json +2 -2
  76. package/webidl2.js/LICENSE +21 -0
  77. package/webidl2.js/README.md +827 -0
  78. package/webidl2.js/dist/package.json +3 -0
  79. package/webidl2.js/dist/webidl2.js +35 -7
@@ -14,6 +14,7 @@
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
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";
@@ -30,6 +31,7 @@ import { lib, query } from '../library';
30
31
  import { isMaterialized } from './isMaterialized';
31
32
  import { isInIdlizeInternal } from '../idlize';
32
33
  import { isInCurrentModule } from './modules';
34
+ import { generatorConfiguration } from '../config';
33
35
  export const lenses = {
34
36
  globals: lib.lens(lib.select.files())
35
37
  .pipe(lib.select.nodes())
@@ -68,7 +70,7 @@ export class PeerLibrary {
68
70
  return this._cachedIdlLibrary;
69
71
  }
70
72
  this._cachedIdlLibrary = {
71
- files: this.files.map(file => file.file)
73
+ files: this.files.map(file => file)
72
74
  };
73
75
  return this._cachedIdlLibrary;
74
76
  }
@@ -87,17 +89,20 @@ export class PeerLibrary {
87
89
  get materializedToGenerate() {
88
90
  return Array.from(this.materializedClasses.values()).filter(it => it.needBeGenerated);
89
91
  }
90
- constructor(language) {
92
+ constructor(language, useMemoM3 = false) {
91
93
  this.language = language;
94
+ this.useMemoM3 = useMemoM3;
92
95
  this.layout = LayoutManager.Empty();
93
96
  this._syntheticFile = idl.createFile([]);
94
97
  this.files = [];
98
+ this.auxFiles = [];
95
99
  this.builderClasses = new Map();
96
100
  this.materializedClasses = new Map();
97
101
  this.name = "";
98
102
  this.customComponentMethods = [];
99
103
  this.targetNameConvertorInstance = this.createTypeNameConvertor(this.language);
100
104
  this.interopNameConvertorInstance = new CppNameConvertor(this);
105
+ this._useFallback = true;
101
106
  }
102
107
  createLanguageWriter(language) {
103
108
  return createLanguageWriter(language !== null && language !== void 0 ? language : this.language, this);
@@ -142,76 +147,121 @@ export class PeerLibrary {
142
147
  this.context = context;
143
148
  }
144
149
  findFileByOriginalFilename(filename) {
145
- return this.files.find(it => it.originalFilename === filename);
150
+ return this.files.find(it => it.fileName === filename);
146
151
  }
147
152
  mapType(type) {
148
153
  return this.targetNameConvertorInstance.convert(type);
149
154
  }
150
- resolveTypeReference(type) {
151
- return this.resolveTypeReferenceScoped(type);
155
+ enableCache() {
156
+ this.referenceCache = new Map();
152
157
  }
153
- resolveTypeReferenceScoped(type, pointOfView, rootEntries) {
154
- const entry = this._syntheticFile.entries.find(it => it.name === type.name);
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;
191
+ }
192
+ resolveNamedNode(target, pov = undefined) {
193
+ const qualifiedName = target.join(".");
194
+ const entry = this._syntheticFile.entries.find(it => it.name === qualifiedName);
155
195
  if (entry)
156
196
  return entry;
157
- const qualifiedName = type.name.split(".");
158
- let pointOfViewNamespace = idl.fetchNamespaceFrom(type.parent);
159
- // TODO: Choose what to do if `rootEntries.some(it => idl.isNamespace(it))`
160
- // One of possible options - `rootEntries = rootEntries.flatMap(it => idl.isNamespace(it) ? it.members : it)` - cause error
161
- rootEntries !== null && rootEntries !== void 0 ? rootEntries : (rootEntries = this.files.flatMap(it => it.entries));
162
- if (1 === qualifiedName.length) {
163
- const predefined = rootEntries.filter(it => isInIdlizeInternal(it));
164
- 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));
165
200
  if (found)
166
201
  return found;
167
202
  }
168
- let doWork = true;
169
- while (doWork) {
170
- doWork = !!pointOfViewNamespace;
171
- let entries = pointOfViewNamespace
172
- ? [...pointOfViewNamespace.members]
173
- : [...rootEntries];
174
- for (let qualifiedNamePart = 0; qualifiedNamePart < qualifiedName.length; ++qualifiedNamePart) {
175
- const candidates = entries.filter(it => it.name === qualifiedName[qualifiedNamePart]);
176
- if (!candidates.length)
177
- break;
178
- if (qualifiedNamePart === qualifiedName.length - 1) {
179
- const target = candidates.length == 1
180
- ? candidates[0]
181
- : candidates.find(it => !idl.hasExtAttribute(it, idl.IDLExtendedAttributes.Import)); // probably the wrong logic here
182
- if (target && idl.isImport(target)) // Temporary disable Import declarations
183
- return undefined;
184
- return target;
185
- }
186
- entries = [];
187
- for (const candidate of candidates) {
188
- if (idl.isNamespace(candidate))
189
- entries.push(...candidate.members);
190
- else if (idl.isEnum(candidate))
191
- entries.push(...candidate.elements);
192
- else if (idl.isInterface(candidate))
193
- entries.push(...candidate.constants, ...candidate.properties, ...candidate.methods);
194
- }
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;
195
213
  }
196
- pointOfViewNamespace = idl.fetchNamespaceFrom(pointOfViewNamespace === null || pointOfViewNamespace === void 0 ? void 0 : pointOfViewNamespace.parent);
197
214
  }
198
215
  // TODO: remove the next block after namespaces out of quarantine
199
- if (!pointOfView) {
216
+ if (this._useFallback) {
217
+ const povAsReadableString = pov
218
+ ? `'${idl.getFQName(pov)}'`
219
+ : "[root]";
220
+ // retry from root
221
+ pov = undefined;
200
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
201
232
  const traverseNamespaces = (entry) => {
202
233
  if (entry && idl.isNamespace(entry) && entry.members.length) {
203
- //console.log(`Try alien namespace '${idl.getNamespacesPathFor(entry.members[0]).map(obj => obj.name).join(".")}' to resolve name '${type.name}'`)
204
- const resolved = this.resolveTypeReferenceScoped(type, entry, rootEntries);
205
- 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(".")}'`);
206
237
  resolveds.push(resolved);
238
+ }
207
239
  entry.members.forEach(traverseNamespaces);
208
240
  }
209
241
  };
210
242
  this.files.forEach(file => file.entries.forEach(traverseNamespaces));
211
- if (resolveds.length)
212
- 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;
213
246
  } // end of block to remove
214
- return undefined; // empty result
247
+ return undefined;
248
+ }
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) {
@@ -243,16 +293,16 @@ export class PeerLibrary {
243
293
  case idl.IDLUndefinedType: return new UndefinedConvertor(param);
244
294
  case idl.IDLVoidType: return new VoidConvertor(param);
245
295
  case idl.IDLUnknownType:
246
- case idl.IDLAnyType: return new ObjectConvertor(param);
296
+ case idl.IDLAnyType: return new ObjectConvertor(param, idl.IDLAnyType);
247
297
  case idl.IDLDate: return new DateConvertor(param);
298
+ case idl.IDLFunctionType: return new FunctionConvertor(this, param);
248
299
  default: throw new Error(`Unconverted primitive ${idl.DebugUtils.debugPrintType(type)}`);
249
300
  }
250
301
  }
251
302
  if (idl.isReferenceType(type)) {
252
- if (isImportAttr(type))
253
- return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
254
303
  // TODO: special cases for interop types.
255
- 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
256
306
  case 'KBoolean': return new BooleanConvertor(param);
257
307
  case 'KInt': return new NumericConvertor(param, idl.IDLI32Type);
258
308
  case 'KFloat': return new NumericConvertor(param, idl.IDLF32Type);
@@ -262,7 +312,12 @@ export class PeerLibrary {
262
312
  case 'number': return new NumberConvertor(param);
263
313
  case 'KPointer': return new PointerConvertor(param);
264
314
  }
315
+ if (generatorConfiguration().forceResource.includes(type.name)) {
316
+ return new ObjectConvertor(param, type);
317
+ }
265
318
  const decl = this.resolveTypeReference(type);
319
+ if (decl && isImportAttr(decl) || !decl && isImportAttr(type))
320
+ return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
266
321
  return this.declarationConvertor(param, type, decl);
267
322
  }
268
323
  if (idl.isUnionType(type)) {
@@ -281,15 +336,28 @@ export class PeerLibrary {
281
336
  throw new Error(`Cannot convert: ${type.kind}`);
282
337
  }
283
338
  declarationConvertor(param, type, declaration) {
339
+ if (generatorConfiguration().forceResource.includes(type.name)) {
340
+ return new ObjectConvertor(param, type);
341
+ }
284
342
  let customConv = this.customConvertor(param, type.name, type);
285
343
  if (customConv)
286
344
  return customConv;
287
- if (!declaration)
345
+ if (!declaration) {
288
346
  return new CustomTypeConvertor(param, this.targetNameConvertorInstance.convert(type), false, this.targetNameConvertorInstance.convert(type)); // assume some predefined type
347
+ }
289
348
  const declarationName = declaration.name;
290
349
  if (isImportAttr(declaration)) {
291
350
  return new ImportTypeConvertor(param, this.targetNameConvertorInstance.convert(type));
292
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
+ }
293
361
  if (idl.isEnum(declaration)) {
294
362
  return new EnumConvertor(param, declaration);
295
363
  }
@@ -328,11 +396,11 @@ export class PeerLibrary {
328
396
  customConvertor(param, typeName, type) {
329
397
  switch (typeName) {
330
398
  case `Object`:
331
- return new CustomTypeConvertor(param, "Object", false, "Object");
399
+ return new ObjectConvertor(param, idl.IDLObjectType);
332
400
  case `Date`:
333
401
  return new DateConvertor(param);
334
402
  case `Function`:
335
- return new FunctionConvertor(this, param, type);
403
+ return new FunctionConvertor(this, param);
336
404
  case `Record`:
337
405
  return new CustomTypeConvertor(param, "Record", false, "Record<string, string>");
338
406
  case `Optional`:
@@ -356,18 +424,12 @@ export class PeerLibrary {
356
424
  case "object":
357
425
  case "Object": return ArkCustomObject;
358
426
  }
359
- if (isImportAttr(type)) {
360
- return ArkCustomObject;
361
- }
362
427
  if (idl.isReferenceType(type)) {
363
428
  // TODO: remove all this!
364
- if (type.name === 'Dimension' || type.name === 'Length') {
365
- return ArkLength;
366
- }
367
429
  if (type.name === 'Date') {
368
430
  return ArkDate;
369
431
  }
370
- if (type.name === 'AnimationRange' || type.name === 'ContentModifier') {
432
+ if (type.name === 'AnimationRange') {
371
433
  return ArkCustomObject;
372
434
  }
373
435
  if (type.name === 'Function') {
@@ -388,6 +450,9 @@ export class PeerLibrary {
388
450
  : idl.isTypedef(decl) ? this.toDeclaration(decl.type)
389
451
  : decl;
390
452
  }
453
+ if (isImportAttr(type)) {
454
+ return ArkCustomObject;
455
+ }
391
456
  return type;
392
457
  }
393
458
  setFileLayout(strategy) {
@@ -397,7 +462,6 @@ export class PeerLibrary {
397
462
  export const ArkInt32 = idl.IDLI32Type;
398
463
  export const ArkInt64 = idl.IDLI64Type;
399
464
  export const ArkFunction = idl.IDLFunctionType;
400
- export const ArkLength = idl.IDLLengthType;
401
465
  export const ArkDate = idl.IDLDate;
402
466
  export const ArkCustomObject = idl.IDLCustomObjectType;
403
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
  }
@@ -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));
@@ -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
  }
@@ -21,6 +21,10 @@ export class UnionFlattener {
21
21
  constructor(resolver) {
22
22
  this.resolver = resolver;
23
23
  }
24
+ convertImport(type) {
25
+ console.warn("Imports are not implemented yet");
26
+ return [];
27
+ }
24
28
  convertUnion(type) {
25
29
  return type.types.flatMap(it => convertType(this, it));
26
30
  }
@@ -34,7 +38,7 @@ export class UnionFlattener {
34
38
  convertContainer(type) {
35
39
  return [type];
36
40
  }
37
- convertImport(type, importClause) {
41
+ convertTypeReferenceAsImport(type, importClause) {
38
42
  return [type];
39
43
  }
40
44
  convertPrimitiveType(type) {
@@ -111,8 +115,8 @@ export class UnionRuntimeTypeChecker {
111
115
  }
112
116
  }
113
117
  export function flattenUnionType(library, type) {
114
- const unionFlattener = new UnionFlattener(library);
115
118
  if (isUnionType(type)) {
119
+ const unionFlattener = new UnionFlattener(library);
116
120
  const allTypes = type.types.flatMap(it => convertType(unionFlattener, it));
117
121
  const uniqueTypes = new Set(allTypes);
118
122
  return uniqueTypes.size === allTypes.length ? type : collapseTypes(Array.from(uniqueTypes));
@@ -0,0 +1,3 @@
1
+ import { IDLFile, IDLNode, IDLNamedNode } from "./idl";
2
+ export declare function resolveNamedNode(target: string[], pov: IDLNode | undefined, corpus: IDLFile[]): IDLNamedNode | undefined;
3
+ //# sourceMappingURL=resolveNamedNode.d.ts.map
@@ -0,0 +1,105 @@
1
+ /*
2
+ * Copyright (c) 2024 Huawei Device Co., Ltd.
3
+ * Licensed under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License.
5
+ * You may obtain a copy of the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS,
11
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ * See the License for the specific language governing permissions and
13
+ * limitations under the License.
14
+ */
15
+ import { isReferenceType, hasExtAttribute, IDLExtendedAttributes } from "./idl";
16
+ import { isFile, isNamedNode, isNamespace, isEnum, isInterface, isImport } from "./idl";
17
+ export function resolveNamedNode(target, pov, corpus) {
18
+ let result;
19
+ let povScope = [];
20
+ while (pov) {
21
+ if (isFile(pov)) {
22
+ if (result = resolveDownFromFile(target, pov, corpus))
23
+ return result;
24
+ const importUsings = pov.entries.filter(it => isImport(it) && !it.name).map(it => it);
25
+ for (const importUsing of importUsings)
26
+ if (result = resolveDownFromRoot([...importUsing.clause, ...target], corpus))
27
+ return result;
28
+ povScope = pov.packageClause.slice();
29
+ break;
30
+ }
31
+ else {
32
+ if (result = resolveDownFromNode(target, pov, false, corpus))
33
+ return result;
34
+ }
35
+ pov = pov.parent;
36
+ }
37
+ for (;;) {
38
+ if (result = resolveDownFromRoot([...povScope, ...target], corpus))
39
+ return result;
40
+ if (povScope.length)
41
+ povScope.pop();
42
+ else
43
+ break;
44
+ }
45
+ return undefined;
46
+ }
47
+ function resolveDownFromNode(target, pov, withSelf, corpus) {
48
+ if (withSelf && isNamedNode(pov)) {
49
+ if (isReferenceType(pov) || !pov.name.length)
50
+ return undefined;
51
+ let nameMatched = target[0] === pov.name;
52
+ if (!nameMatched)
53
+ nameMatched = target[0] === "default" && hasExtAttribute(pov, IDLExtendedAttributes.DefaultExport);
54
+ if (!nameMatched)
55
+ return undefined;
56
+ target = target.slice(1);
57
+ if (isImport(pov)) {
58
+ return resolveDownFromRoot([...pov.clause, ...target], corpus);
59
+ }
60
+ if (!target.length)
61
+ return pov;
62
+ }
63
+ let candidates;
64
+ if (isNamespace(pov))
65
+ candidates = pov.members;
66
+ else if (isEnum(pov))
67
+ candidates = pov.elements;
68
+ else if (isInterface(pov))
69
+ candidates = pov.constants;
70
+ else
71
+ return undefined;
72
+ let result;
73
+ for (const candidate of candidates) {
74
+ if (result = resolveDownFromNode(target, candidate, true, corpus))
75
+ return result;
76
+ }
77
+ return undefined;
78
+ }
79
+ function resolveDownFromFile(target, pov, corpus) {
80
+ let result;
81
+ for (const candidate of pov.entries) {
82
+ if (result = resolveDownFromNode(target, candidate, true, corpus))
83
+ return result;
84
+ }
85
+ return undefined;
86
+ }
87
+ function resolveDownFromRoot(target, corpus) {
88
+ let result;
89
+ for (const file of corpus) {
90
+ if (file.packageClause.length >= target.length)
91
+ continue;
92
+ let match = true;
93
+ for (let index = 0; index < file.packageClause.length; ++index)
94
+ if (file.packageClause[index] !== target[index]) {
95
+ match = false;
96
+ break;
97
+ }
98
+ if (!match)
99
+ continue;
100
+ if (result = resolveDownFromFile(target.slice(file.packageClause.length), file, corpus))
101
+ return result;
102
+ }
103
+ return undefined;
104
+ }
105
+ //# sourceMappingURL=resolveNamedNode.js.map