@tsonic/frontend 0.0.1

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 (145) hide show
  1. package/package.json +53 -0
  2. package/src/dependency-graph.ts +18 -0
  3. package/src/dotnet-metadata.ts +121 -0
  4. package/src/graph/builder.ts +81 -0
  5. package/src/graph/circular.ts +58 -0
  6. package/src/graph/extraction/exports.ts +55 -0
  7. package/src/graph/extraction/imports.ts +81 -0
  8. package/src/graph/extraction/index.ts +7 -0
  9. package/src/graph/extraction/orchestrator.ts +99 -0
  10. package/src/graph/extraction.ts +10 -0
  11. package/src/graph/helpers.ts +51 -0
  12. package/src/graph/index.ts +17 -0
  13. package/src/graph/types.ts +13 -0
  14. package/src/index.ts +80 -0
  15. package/src/ir/binding-resolution.test.ts +585 -0
  16. package/src/ir/builder/exports.ts +78 -0
  17. package/src/ir/builder/helpers.ts +27 -0
  18. package/src/ir/builder/imports.ts +153 -0
  19. package/src/ir/builder/index.ts +10 -0
  20. package/src/ir/builder/orchestrator.ts +178 -0
  21. package/src/ir/builder/statements.ts +55 -0
  22. package/src/ir/builder/types.ts +8 -0
  23. package/src/ir/builder/validation.ts +129 -0
  24. package/src/ir/builder.test.ts +581 -0
  25. package/src/ir/builder.ts +14 -0
  26. package/src/ir/converters/expressions/access.ts +99 -0
  27. package/src/ir/converters/expressions/calls.ts +137 -0
  28. package/src/ir/converters/expressions/collections.ts +84 -0
  29. package/src/ir/converters/expressions/functions.ts +62 -0
  30. package/src/ir/converters/expressions/helpers.ts +264 -0
  31. package/src/ir/converters/expressions/index.ts +43 -0
  32. package/src/ir/converters/expressions/literals.ts +22 -0
  33. package/src/ir/converters/expressions/operators.ts +147 -0
  34. package/src/ir/converters/expressions/other.ts +60 -0
  35. package/src/ir/converters/statements/control/blocks.ts +22 -0
  36. package/src/ir/converters/statements/control/conditionals.ts +67 -0
  37. package/src/ir/converters/statements/control/exceptions.ts +43 -0
  38. package/src/ir/converters/statements/control/index.ts +17 -0
  39. package/src/ir/converters/statements/control/loops.ts +99 -0
  40. package/src/ir/converters/statements/control.ts +17 -0
  41. package/src/ir/converters/statements/declarations/classes/constructors.ts +120 -0
  42. package/src/ir/converters/statements/declarations/classes/index.ts +12 -0
  43. package/src/ir/converters/statements/declarations/classes/methods.ts +61 -0
  44. package/src/ir/converters/statements/declarations/classes/orchestrator.ts +166 -0
  45. package/src/ir/converters/statements/declarations/classes/override-detection.ts +116 -0
  46. package/src/ir/converters/statements/declarations/classes/properties.ts +63 -0
  47. package/src/ir/converters/statements/declarations/classes.ts +6 -0
  48. package/src/ir/converters/statements/declarations/enums.ts +29 -0
  49. package/src/ir/converters/statements/declarations/functions.ts +39 -0
  50. package/src/ir/converters/statements/declarations/index.ts +14 -0
  51. package/src/ir/converters/statements/declarations/interfaces.ts +131 -0
  52. package/src/ir/converters/statements/declarations/registry.ts +45 -0
  53. package/src/ir/converters/statements/declarations/type-aliases.ts +25 -0
  54. package/src/ir/converters/statements/declarations/variables.ts +60 -0
  55. package/src/ir/converters/statements/declarations.ts +16 -0
  56. package/src/ir/converters/statements/helpers.ts +174 -0
  57. package/src/ir/converters/statements/index.ts +40 -0
  58. package/src/ir/expression-converter.ts +207 -0
  59. package/src/ir/generic-validator.ts +100 -0
  60. package/src/ir/hierarchical-bindings-e2e.test.ts +163 -0
  61. package/src/ir/index.ts +6 -0
  62. package/src/ir/statement-converter.ts +128 -0
  63. package/src/ir/type-converter/arrays.ts +20 -0
  64. package/src/ir/type-converter/converter.ts +10 -0
  65. package/src/ir/type-converter/functions.ts +22 -0
  66. package/src/ir/type-converter/index.ts +11 -0
  67. package/src/ir/type-converter/inference.ts +122 -0
  68. package/src/ir/type-converter/literals.ts +40 -0
  69. package/src/ir/type-converter/objects.ts +107 -0
  70. package/src/ir/type-converter/orchestrator.ts +85 -0
  71. package/src/ir/type-converter/patterns.ts +73 -0
  72. package/src/ir/type-converter/primitives.ts +57 -0
  73. package/src/ir/type-converter/references.ts +64 -0
  74. package/src/ir/type-converter/unions-intersections.ts +34 -0
  75. package/src/ir/type-converter.ts +13 -0
  76. package/src/ir/types/expressions.ts +215 -0
  77. package/src/ir/types/guards.ts +39 -0
  78. package/src/ir/types/helpers.ts +135 -0
  79. package/src/ir/types/index.ts +108 -0
  80. package/src/ir/types/ir-types.ts +96 -0
  81. package/src/ir/types/module.ts +57 -0
  82. package/src/ir/types/statements.ts +238 -0
  83. package/src/ir/types.ts +97 -0
  84. package/src/metadata/bindings-loader.test.ts +144 -0
  85. package/src/metadata/bindings-loader.ts +357 -0
  86. package/src/metadata/index.ts +15 -0
  87. package/src/metadata/library-loader.ts +153 -0
  88. package/src/metadata/loader.test.ts +156 -0
  89. package/src/metadata/loader.ts +382 -0
  90. package/src/program/bindings.test.ts +512 -0
  91. package/src/program/bindings.ts +253 -0
  92. package/src/program/config.ts +30 -0
  93. package/src/program/creation.ts +249 -0
  94. package/src/program/dependency-graph.ts +245 -0
  95. package/src/program/diagnostics.ts +103 -0
  96. package/src/program/index.ts +19 -0
  97. package/src/program/metadata.ts +68 -0
  98. package/src/program/queries.ts +18 -0
  99. package/src/program/types.ts +38 -0
  100. package/src/program.ts +13 -0
  101. package/src/resolver/dotnet-import-resolver.ts +226 -0
  102. package/src/resolver/import-resolution.ts +177 -0
  103. package/src/resolver/index.ts +18 -0
  104. package/src/resolver/namespace.test.ts +86 -0
  105. package/src/resolver/namespace.ts +42 -0
  106. package/src/resolver/naming.ts +38 -0
  107. package/src/resolver/path-resolution.ts +22 -0
  108. package/src/resolver/types.ts +15 -0
  109. package/src/resolver.test.ts +155 -0
  110. package/src/resolver.ts +14 -0
  111. package/src/symbol-table/builder.ts +114 -0
  112. package/src/symbol-table/creation.ts +42 -0
  113. package/src/symbol-table/helpers.ts +18 -0
  114. package/src/symbol-table/index.ts +13 -0
  115. package/src/symbol-table/queries.ts +42 -0
  116. package/src/symbol-table/types.ts +28 -0
  117. package/src/symbol-table.ts +14 -0
  118. package/src/types/bindings.ts +172 -0
  119. package/src/types/diagnostic.test.ts +164 -0
  120. package/src/types/diagnostic.ts +153 -0
  121. package/src/types/explicit-views.test.ts +113 -0
  122. package/src/types/explicit-views.ts +218 -0
  123. package/src/types/metadata.ts +229 -0
  124. package/src/types/module.ts +99 -0
  125. package/src/types/nested-types.test.ts +194 -0
  126. package/src/types/nested-types.ts +215 -0
  127. package/src/types/parameter-modifiers.ts +173 -0
  128. package/src/types/ref-parameters.test.ts +192 -0
  129. package/src/types/ref-parameters.ts +268 -0
  130. package/src/types/result.test.ts +157 -0
  131. package/src/types/result.ts +48 -0
  132. package/src/types/support-types.test.ts +81 -0
  133. package/src/types/support-types.ts +288 -0
  134. package/src/types/test-harness.ts +180 -0
  135. package/src/validation/exports.ts +98 -0
  136. package/src/validation/features.ts +89 -0
  137. package/src/validation/generics.ts +40 -0
  138. package/src/validation/helpers.ts +31 -0
  139. package/src/validation/imports.ts +97 -0
  140. package/src/validation/index.ts +11 -0
  141. package/src/validation/orchestrator.ts +51 -0
  142. package/src/validation/static-safety.ts +267 -0
  143. package/src/validator.test.ts +468 -0
  144. package/src/validator.ts +15 -0
  145. package/tsconfig.json +13 -0
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Tests for binding manifest loading and registry
3
+ */
4
+
5
+ import { describe, it, beforeEach, afterEach } from "mocha";
6
+ import { expect } from "chai";
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import * as os from "node:os";
10
+ import { BindingRegistry, loadBindings } from "./bindings.js";
11
+
12
+ describe("Binding System", () => {
13
+ describe("BindingRegistry", () => {
14
+ it("should add and retrieve bindings", () => {
15
+ const registry = new BindingRegistry();
16
+
17
+ registry.addBindings("/test/manifest.json", {
18
+ bindings: {
19
+ console: {
20
+ kind: "global",
21
+ assembly: "Tsonic.Runtime",
22
+ type: "Tsonic.Runtime.console",
23
+ },
24
+ fs: {
25
+ kind: "module",
26
+ assembly: "Tsonic.NodeApi",
27
+ type: "Tsonic.NodeApi.fs",
28
+ },
29
+ },
30
+ });
31
+
32
+ const consoleBinding = registry.getBinding("console");
33
+ expect(consoleBinding).to.deep.equal({
34
+ kind: "global",
35
+ assembly: "Tsonic.Runtime",
36
+ type: "Tsonic.Runtime.console",
37
+ });
38
+
39
+ const fsBinding = registry.getBinding("fs");
40
+ expect(fsBinding).to.deep.equal({
41
+ kind: "module",
42
+ assembly: "Tsonic.NodeApi",
43
+ type: "Tsonic.NodeApi.fs",
44
+ });
45
+ });
46
+
47
+ it("should return undefined for non-existent bindings", () => {
48
+ const registry = new BindingRegistry();
49
+ const binding = registry.getBinding("nonexistent");
50
+ expect(binding).to.equal(undefined);
51
+ });
52
+
53
+ it("should return all bindings", () => {
54
+ const registry = new BindingRegistry();
55
+
56
+ registry.addBindings("/test/manifest.json", {
57
+ bindings: {
58
+ console: {
59
+ kind: "global",
60
+ assembly: "Tsonic.Runtime",
61
+ type: "Tsonic.Runtime.console",
62
+ },
63
+ Math: {
64
+ kind: "global",
65
+ assembly: "Tsonic.Runtime",
66
+ type: "Tsonic.Runtime.Math",
67
+ },
68
+ },
69
+ });
70
+
71
+ const allBindings = registry.getAllBindings();
72
+ expect(allBindings).to.have.lengthOf(2);
73
+ expect(allBindings.map((b) => b[0]).sort()).to.deep.equal([
74
+ "Math",
75
+ "console",
76
+ ]);
77
+ });
78
+
79
+ it("should clear all bindings", () => {
80
+ const registry = new BindingRegistry();
81
+
82
+ registry.addBindings("/test/manifest.json", {
83
+ bindings: {
84
+ console: {
85
+ kind: "global",
86
+ assembly: "Tsonic.Runtime",
87
+ type: "Tsonic.Runtime.console",
88
+ },
89
+ },
90
+ });
91
+
92
+ expect(registry.getAllBindings()).to.have.lengthOf(1);
93
+
94
+ registry.clear();
95
+ expect(registry.getAllBindings()).to.have.lengthOf(0);
96
+ expect(registry.getBinding("console")).to.equal(undefined);
97
+ });
98
+
99
+ it("should handle multiple manifest files", () => {
100
+ const registry = new BindingRegistry();
101
+
102
+ registry.addBindings("/test/runtime.json", {
103
+ bindings: {
104
+ console: {
105
+ kind: "global",
106
+ assembly: "Tsonic.Runtime",
107
+ type: "Tsonic.Runtime.console",
108
+ },
109
+ },
110
+ });
111
+
112
+ registry.addBindings("/test/node.json", {
113
+ bindings: {
114
+ fs: {
115
+ kind: "module",
116
+ assembly: "Tsonic.NodeApi",
117
+ type: "Tsonic.NodeApi.fs",
118
+ },
119
+ },
120
+ });
121
+
122
+ expect(registry.getAllBindings()).to.have.lengthOf(2);
123
+ expect(registry.getBinding("console")).not.to.equal(undefined);
124
+ expect(registry.getBinding("fs")).not.to.equal(undefined);
125
+ });
126
+ });
127
+
128
+ describe("loadBindings", () => {
129
+ let tempDir: string;
130
+
131
+ beforeEach(() => {
132
+ // Create a temporary directory for test files
133
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tsonic-bindings-test-"));
134
+ });
135
+
136
+ afterEach(() => {
137
+ // Clean up temporary directory
138
+ fs.rmSync(tempDir, { recursive: true, force: true });
139
+ });
140
+
141
+ it("should load bindings from a manifest file in typeRoot", () => {
142
+ // Create a test binding manifest
143
+ const manifestPath = path.join(tempDir, "test.bindings.json");
144
+ const manifest = {
145
+ bindings: {
146
+ console: {
147
+ kind: "global",
148
+ assembly: "Tsonic.Runtime",
149
+ type: "Tsonic.Runtime.console",
150
+ },
151
+ },
152
+ };
153
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
154
+
155
+ const registry = loadBindings([tempDir]);
156
+
157
+ const binding = registry.getBinding("console");
158
+ expect(binding).to.deep.equal({
159
+ kind: "global",
160
+ assembly: "Tsonic.Runtime",
161
+ type: "Tsonic.Runtime.console",
162
+ });
163
+ });
164
+
165
+ it("should load bindings from manifest next to .d.ts file", () => {
166
+ // Create a subdirectory structure
167
+ const subDir = path.join(tempDir, "types");
168
+ fs.mkdirSync(subDir, { recursive: true });
169
+
170
+ // Create .d.ts and .bindings.json files
171
+ fs.writeFileSync(path.join(subDir, "runtime.d.ts"), "");
172
+ const manifest = {
173
+ bindings: {
174
+ Math: {
175
+ kind: "global",
176
+ assembly: "Tsonic.Runtime",
177
+ type: "Tsonic.Runtime.Math",
178
+ },
179
+ },
180
+ };
181
+ fs.writeFileSync(
182
+ path.join(subDir, "runtime.bindings.json"),
183
+ JSON.stringify(manifest, null, 2)
184
+ );
185
+
186
+ const registry = loadBindings([tempDir]);
187
+
188
+ const binding = registry.getBinding("Math");
189
+ expect(binding).to.deep.equal({
190
+ kind: "global",
191
+ assembly: "Tsonic.Runtime",
192
+ type: "Tsonic.Runtime.Math",
193
+ });
194
+ });
195
+
196
+ it("should handle non-existent typeRoots gracefully", () => {
197
+ const registry = loadBindings(["/nonexistent/path"]);
198
+ expect(registry.getAllBindings()).to.have.lengthOf(0);
199
+ });
200
+
201
+ it("should load from multiple typeRoots", () => {
202
+ // Create two separate directories
203
+ const dir1 = path.join(tempDir, "dir1");
204
+ const dir2 = path.join(tempDir, "dir2");
205
+ fs.mkdirSync(dir1);
206
+ fs.mkdirSync(dir2);
207
+
208
+ // Create manifest in first directory
209
+ const manifest1 = {
210
+ bindings: {
211
+ console: {
212
+ kind: "global",
213
+ assembly: "Tsonic.Runtime",
214
+ type: "Tsonic.Runtime.console",
215
+ },
216
+ },
217
+ };
218
+ fs.writeFileSync(
219
+ path.join(dir1, "runtime.bindings.json"),
220
+ JSON.stringify(manifest1, null, 2)
221
+ );
222
+
223
+ // Create manifest in second directory
224
+ const manifest2 = {
225
+ bindings: {
226
+ fs: {
227
+ kind: "module",
228
+ assembly: "Tsonic.NodeApi",
229
+ type: "Tsonic.NodeApi.fs",
230
+ },
231
+ },
232
+ };
233
+ fs.writeFileSync(
234
+ path.join(dir2, "node.bindings.json"),
235
+ JSON.stringify(manifest2, null, 2)
236
+ );
237
+
238
+ const registry = loadBindings([dir1, dir2]);
239
+
240
+ expect(registry.getAllBindings()).to.have.lengthOf(2);
241
+ expect(registry.getBinding("console")).not.to.equal(undefined);
242
+ expect(registry.getBinding("fs")).not.to.equal(undefined);
243
+ });
244
+
245
+ it("should handle malformed JSON gracefully", () => {
246
+ const manifestPath = path.join(tempDir, "bad.bindings.json");
247
+ fs.writeFileSync(manifestPath, "{ invalid json }");
248
+
249
+ // Should not throw, just skip the bad file
250
+ const registry = loadBindings([tempDir]);
251
+ expect(registry.getAllBindings()).to.have.lengthOf(0);
252
+ });
253
+
254
+ it("should distinguish between global and module bindings", () => {
255
+ const manifest = {
256
+ bindings: {
257
+ console: {
258
+ kind: "global",
259
+ assembly: "Tsonic.Runtime",
260
+ type: "Tsonic.Runtime.console",
261
+ },
262
+ fs: {
263
+ kind: "module",
264
+ assembly: "Tsonic.NodeApi",
265
+ type: "Tsonic.NodeApi.fs",
266
+ },
267
+ },
268
+ };
269
+ fs.writeFileSync(
270
+ path.join(tempDir, "mixed.bindings.json"),
271
+ JSON.stringify(manifest, null, 2)
272
+ );
273
+
274
+ const registry = loadBindings([tempDir]);
275
+
276
+ const consoleBinding = registry.getBinding("console");
277
+ expect(consoleBinding?.kind).to.equal("global");
278
+
279
+ const fsBinding = registry.getBinding("fs");
280
+ expect(fsBinding?.kind).to.equal("module");
281
+ });
282
+ });
283
+
284
+ describe("Hierarchical Binding Manifests", () => {
285
+ it("should add and retrieve hierarchical namespace bindings", () => {
286
+ const registry = new BindingRegistry();
287
+
288
+ registry.addBindings("/test/system-linq.json", {
289
+ assembly: "System.Linq",
290
+ namespaces: [
291
+ {
292
+ name: "System.Linq",
293
+ alias: "systemLinq",
294
+ types: [
295
+ {
296
+ name: "Enumerable",
297
+ alias: "enumerable",
298
+ kind: "class",
299
+ members: [],
300
+ },
301
+ ],
302
+ },
303
+ ],
304
+ });
305
+
306
+ const namespace = registry.getNamespace("systemLinq");
307
+ expect(namespace).to.not.equal(undefined);
308
+ expect(namespace?.name).to.equal("System.Linq");
309
+ expect(namespace?.types).to.have.lengthOf(1);
310
+ });
311
+
312
+ it("should retrieve type bindings from hierarchical manifest", () => {
313
+ const registry = new BindingRegistry();
314
+
315
+ registry.addBindings("/test/system-linq.json", {
316
+ assembly: "System.Linq",
317
+ namespaces: [
318
+ {
319
+ name: "System.Linq",
320
+ alias: "systemLinq",
321
+ types: [
322
+ {
323
+ name: "Enumerable",
324
+ alias: "enumerable",
325
+ kind: "class",
326
+ members: [],
327
+ },
328
+ ],
329
+ },
330
+ ],
331
+ });
332
+
333
+ const type = registry.getType("enumerable");
334
+ expect(type).to.not.equal(undefined);
335
+ expect(type?.name).to.equal("Enumerable");
336
+ expect(type?.kind).to.equal("class");
337
+ });
338
+
339
+ it("should retrieve member bindings from hierarchical manifest", () => {
340
+ const registry = new BindingRegistry();
341
+
342
+ registry.addBindings("/test/system-linq.json", {
343
+ assembly: "System.Linq",
344
+ namespaces: [
345
+ {
346
+ name: "System.Linq",
347
+ alias: "systemLinq",
348
+ types: [
349
+ {
350
+ name: "Enumerable",
351
+ alias: "enumerable",
352
+ kind: "class",
353
+ members: [
354
+ {
355
+ kind: "method",
356
+ name: "SelectMany",
357
+ alias: "selectMany",
358
+ binding: {
359
+ assembly: "System.Linq",
360
+ type: "System.Linq.Enumerable",
361
+ member: "SelectMany",
362
+ },
363
+ },
364
+ ],
365
+ },
366
+ ],
367
+ },
368
+ ],
369
+ });
370
+
371
+ const member = registry.getMember("enumerable", "selectMany");
372
+ expect(member).to.not.equal(undefined);
373
+ expect(member?.name).to.equal("SelectMany");
374
+ expect(member?.binding.type).to.equal("System.Linq.Enumerable");
375
+ expect(member?.binding.member).to.equal("SelectMany");
376
+ });
377
+
378
+ it("should handle multiple namespaces in one manifest", () => {
379
+ const registry = new BindingRegistry();
380
+
381
+ registry.addBindings("/test/multi-namespace.json", {
382
+ assembly: "MyLib",
383
+ namespaces: [
384
+ {
385
+ name: "MyLib.Namespace1",
386
+ alias: "ns1",
387
+ types: [],
388
+ },
389
+ {
390
+ name: "MyLib.Namespace2",
391
+ alias: "ns2",
392
+ types: [],
393
+ },
394
+ ],
395
+ });
396
+
397
+ expect(registry.getNamespace("ns1")).to.not.equal(undefined);
398
+ expect(registry.getNamespace("ns2")).to.not.equal(undefined);
399
+ expect(registry.getAllNamespaces()).to.have.lengthOf(2);
400
+ });
401
+
402
+ it("should support both legacy and hierarchical manifests", () => {
403
+ const registry = new BindingRegistry();
404
+
405
+ // Add legacy manifest
406
+ registry.addBindings("/test/legacy.json", {
407
+ bindings: {
408
+ console: {
409
+ kind: "global",
410
+ assembly: "Tsonic.Runtime",
411
+ type: "Tsonic.Runtime.console",
412
+ },
413
+ },
414
+ });
415
+
416
+ // Add hierarchical manifest
417
+ registry.addBindings("/test/hierarchical.json", {
418
+ assembly: "System.Linq",
419
+ namespaces: [
420
+ {
421
+ name: "System.Linq",
422
+ alias: "systemLinq",
423
+ types: [],
424
+ },
425
+ ],
426
+ });
427
+
428
+ // Both should work
429
+ expect(registry.getBinding("console")).to.not.equal(undefined);
430
+ expect(registry.getNamespace("systemLinq")).to.not.equal(undefined);
431
+ });
432
+
433
+ it("should return undefined for non-existent hierarchical bindings", () => {
434
+ const registry = new BindingRegistry();
435
+
436
+ expect(registry.getNamespace("nonexistent")).to.equal(undefined);
437
+ expect(registry.getType("nonexistent")).to.equal(undefined);
438
+ expect(registry.getMember("nonexistent", "member")).to.equal(undefined);
439
+ });
440
+
441
+ it("should clear hierarchical bindings along with simple bindings", () => {
442
+ const registry = new BindingRegistry();
443
+
444
+ registry.addBindings("/test/mixed.json", {
445
+ assembly: "Test",
446
+ namespaces: [
447
+ {
448
+ name: "Test.NS",
449
+ alias: "ns",
450
+ types: [],
451
+ },
452
+ ],
453
+ });
454
+
455
+ expect(registry.getAllNamespaces()).to.have.lengthOf(1);
456
+
457
+ registry.clear();
458
+
459
+ expect(registry.getAllNamespaces()).to.have.lengthOf(0);
460
+ expect(registry.getNamespace("ns")).to.equal(undefined);
461
+ });
462
+
463
+ it("should index member bindings by type.member key", () => {
464
+ const registry = new BindingRegistry();
465
+
466
+ registry.addBindings("/test/members.json", {
467
+ assembly: "MyLib",
468
+ namespaces: [
469
+ {
470
+ name: "MyLib",
471
+ alias: "myLib",
472
+ types: [
473
+ {
474
+ name: "TypeA",
475
+ alias: "typeA",
476
+ kind: "class",
477
+ members: [
478
+ {
479
+ kind: "method",
480
+ name: "Method1",
481
+ alias: "method1",
482
+ binding: {
483
+ assembly: "MyLib",
484
+ type: "MyLib.TypeA",
485
+ member: "Method1",
486
+ },
487
+ },
488
+ {
489
+ kind: "method",
490
+ name: "Method2",
491
+ alias: "method2",
492
+ binding: {
493
+ assembly: "MyLib",
494
+ type: "MyLib.TypeA",
495
+ member: "Method2",
496
+ },
497
+ },
498
+ ],
499
+ },
500
+ ],
501
+ },
502
+ ],
503
+ });
504
+
505
+ const member1 = registry.getMember("typeA", "method1");
506
+ const member2 = registry.getMember("typeA", "method2");
507
+
508
+ expect(member1?.name).to.equal("Method1");
509
+ expect(member2?.name).to.equal("Method2");
510
+ });
511
+ });
512
+ });