@openrewrite/rewrite 8.62.0 → 8.62.2

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 (97) hide show
  1. package/dist/java/rpc.d.ts +3 -3
  2. package/dist/java/rpc.d.ts.map +1 -1
  3. package/dist/java/rpc.js +6 -6
  4. package/dist/java/rpc.js.map +1 -1
  5. package/dist/java/tree.d.ts +31 -33
  6. package/dist/java/tree.d.ts.map +1 -1
  7. package/dist/java/tree.js +125 -7
  8. package/dist/java/tree.js.map +1 -1
  9. package/dist/java/type.d.ts +70 -57
  10. package/dist/java/type.d.ts.map +1 -1
  11. package/dist/java/type.js +454 -25
  12. package/dist/java/type.js.map +1 -1
  13. package/dist/java/visitor.d.ts +4 -4
  14. package/dist/java/visitor.d.ts.map +1 -1
  15. package/dist/java/visitor.js +34 -28
  16. package/dist/java/visitor.js.map +1 -1
  17. package/dist/javascript/assertions.d.ts +3 -0
  18. package/dist/javascript/assertions.d.ts.map +1 -1
  19. package/dist/javascript/assertions.js +78 -1
  20. package/dist/javascript/assertions.js.map +1 -1
  21. package/dist/javascript/format.js +4 -4
  22. package/dist/javascript/format.js.map +1 -1
  23. package/dist/javascript/parser.d.ts +1 -1
  24. package/dist/javascript/parser.d.ts.map +1 -1
  25. package/dist/javascript/parser.js +38 -11
  26. package/dist/javascript/parser.js.map +1 -1
  27. package/dist/javascript/rpc.js +1 -4
  28. package/dist/javascript/rpc.js.map +1 -1
  29. package/dist/javascript/tree.d.ts +33 -35
  30. package/dist/javascript/tree.d.ts.map +1 -1
  31. package/dist/javascript/tree.js +70 -17
  32. package/dist/javascript/tree.js.map +1 -1
  33. package/dist/javascript/type-mapping.d.ts +44 -8
  34. package/dist/javascript/type-mapping.d.ts.map +1 -1
  35. package/dist/javascript/type-mapping.js +571 -101
  36. package/dist/javascript/type-mapping.js.map +1 -1
  37. package/dist/javascript/visitor.d.ts +2 -2
  38. package/dist/javascript/visitor.d.ts.map +1 -1
  39. package/dist/javascript/visitor.js.map +1 -1
  40. package/dist/json/tree.d.ts +0 -2
  41. package/dist/json/tree.d.ts.map +1 -1
  42. package/dist/json/tree.js +12 -2
  43. package/dist/json/tree.js.map +1 -1
  44. package/dist/reference.js +1 -1
  45. package/dist/reference.js.map +1 -1
  46. package/dist/rpc/chrome-profiler.d.ts +25 -0
  47. package/dist/rpc/chrome-profiler.d.ts.map +1 -0
  48. package/dist/rpc/chrome-profiler.js +405 -0
  49. package/dist/rpc/chrome-profiler.js.map +1 -0
  50. package/dist/rpc/queue.d.ts +0 -3
  51. package/dist/rpc/queue.d.ts.map +1 -1
  52. package/dist/rpc/queue.js +6 -6
  53. package/dist/rpc/queue.js.map +1 -1
  54. package/dist/rpc/request/parse.d.ts.map +1 -1
  55. package/dist/rpc/request/parse.js.map +1 -1
  56. package/dist/rpc/rewrite-rpc.d.ts +1 -0
  57. package/dist/rpc/rewrite-rpc.d.ts.map +1 -1
  58. package/dist/rpc/rewrite-rpc.js +1 -1
  59. package/dist/rpc/rewrite-rpc.js.map +1 -1
  60. package/dist/rpc/server.d.ts.map +1 -1
  61. package/dist/rpc/server.js +26 -1
  62. package/dist/rpc/server.js.map +1 -1
  63. package/dist/test/rewrite-test.d.ts +1 -1
  64. package/dist/test/rewrite-test.d.ts.map +1 -1
  65. package/dist/test/rewrite-test.js +18 -2
  66. package/dist/test/rewrite-test.js.map +1 -1
  67. package/dist/text/tree.d.ts +0 -2
  68. package/dist/text/tree.d.ts.map +1 -1
  69. package/dist/text/tree.js +4 -17
  70. package/dist/text/tree.js.map +1 -1
  71. package/dist/tree.d.ts +1 -0
  72. package/dist/tree.d.ts.map +1 -1
  73. package/dist/tree.js +14 -0
  74. package/dist/tree.js.map +1 -1
  75. package/dist/version.txt +1 -1
  76. package/package.json +3 -3
  77. package/src/java/rpc.ts +18 -15
  78. package/src/java/tree.ts +68 -38
  79. package/src/java/type.ts +475 -74
  80. package/src/java/visitor.ts +45 -39
  81. package/src/javascript/assertions.ts +52 -1
  82. package/src/javascript/format.ts +4 -4
  83. package/src/javascript/parser.ts +51 -18
  84. package/src/javascript/rpc.ts +8 -10
  85. package/src/javascript/tree.ts +34 -35
  86. package/src/javascript/type-mapping.ts +582 -47
  87. package/src/javascript/visitor.ts +5 -5
  88. package/src/json/tree.ts +1 -2
  89. package/src/reference.ts +1 -1
  90. package/src/rpc/chrome-profiler.ts +373 -0
  91. package/src/rpc/queue.ts +8 -12
  92. package/src/rpc/request/parse.ts +1 -1
  93. package/src/rpc/rewrite-rpc.ts +3 -2
  94. package/src/rpc/server.ts +30 -1
  95. package/src/test/rewrite-test.ts +19 -3
  96. package/src/text/tree.ts +0 -1
  97. package/src/tree.ts +15 -0
package/src/java/type.ts CHANGED
@@ -13,16 +13,19 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import {asRef} from "../rpc";
16
+ import {asRef, RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
17
+ import {immerable} from "immer";
17
18
 
18
- export interface JavaType {
19
+ export interface Type {
19
20
  readonly kind: string;
20
21
  }
21
22
 
22
- export namespace JavaType {
23
+ export namespace Type {
23
24
  export const Kind = {
24
25
  Annotation: "org.openrewrite.java.tree.JavaType$Annotation",
25
26
  AnnotationElementValue: "org.openrewrite.java.tree.JavaType$Annotation$ElementValue",
27
+ SingleElementValue: "org.openrewrite.java.tree.JavaType$Annotation$SingleElementValue",
28
+ ArrayElementValue: "org.openrewrite.java.tree.JavaType$Annotation$ArrayElementValue",
26
29
  Array: "org.openrewrite.java.tree.JavaType$Array",
27
30
  Class: "org.openrewrite.java.tree.JavaType$Class",
28
31
  GenericTypeVariable: "org.openrewrite.java.tree.JavaType$GenericTypeVariable",
@@ -36,17 +39,19 @@ export namespace JavaType {
36
39
  Variable: "org.openrewrite.java.tree.JavaType$Variable",
37
40
  }
38
41
 
39
- export interface Class extends JavaType, FullyQualified {
42
+ export interface Class extends Type, FullyQualified {
40
43
  readonly kind: typeof Kind.Class,
41
- readonly classKind: Class.Kind;
42
- readonly fullyQualifiedName: string;
43
- readonly typeParameters: JavaType[];
44
- readonly supertype?: JavaType.Class;
45
- readonly owningClass?: JavaType.Class;
46
- readonly annotations: JavaType.Annotation[];
47
- readonly interfaces: JavaType.Class[];
48
- readonly members: JavaType.Variable[];
49
- readonly methods: JavaType.Method[];
44
+ classKind: Class.Kind;
45
+ fullyQualifiedName: string;
46
+ typeParameters: Type[];
47
+ supertype?: Type.Class;
48
+ owningClass?: Type.Class;
49
+ annotations: Type.Annotation[];
50
+ interfaces: Type.Class[];
51
+ members: Type.Variable[];
52
+ methods: Type.Method[];
53
+
54
+ toJSON?(): string;
50
55
  }
51
56
 
52
57
  export namespace Class {
@@ -60,52 +65,64 @@ export namespace JavaType {
60
65
  }
61
66
  }
62
67
 
63
- export interface Annotation extends JavaType, FullyQualified {
68
+ export interface Annotation extends Type, FullyQualified {
64
69
  readonly kind: typeof Kind.Annotation,
65
- readonly type: JavaType.FullyQualified;
66
- readonly values: Annotation.ElementValue[];
70
+ type: Type.FullyQualified;
71
+ values: Annotation.ElementValue[];
67
72
  }
68
73
 
69
74
  export namespace Annotation {
70
- export interface ElementValue {
71
- readonly kind: typeof Kind.AnnotationElementValue;
72
- readonly element: JavaType;
73
- readonly value: any;
75
+ export type ElementValue = SingleElementValue | ArrayElementValue;
76
+
77
+ export interface SingleElementValue {
78
+ readonly kind: typeof Kind.SingleElementValue;
79
+ element: Type;
80
+ constantValue?: any;
81
+ referenceValue?: Type;
82
+ }
83
+
84
+ export interface ArrayElementValue {
85
+ readonly kind: typeof Kind.ArrayElementValue;
86
+ element: Type;
87
+ constantValues?: any[];
88
+ referenceValues?: Type[];
74
89
  }
75
90
  }
76
91
 
77
- export interface Method extends JavaType {
92
+ export interface Method extends Type {
78
93
  readonly kind: typeof Kind.Method;
79
- readonly declaringType: JavaType.FullyQualified;
80
- readonly name: string;
81
- readonly returnType: JavaType;
82
- readonly parameterNames: string[];
83
- readonly parameterTypes: JavaType[];
84
- readonly thrownExceptions: JavaType[];
85
- readonly annotations: JavaType.Annotation[];
86
- readonly defaultValue?: string[];
87
- readonly declaredFormalTypeNames: string[];
88
- }
89
-
90
- export interface Variable extends JavaType {
94
+ declaringType: Type.FullyQualified;
95
+ name: string;
96
+ returnType: Type;
97
+ parameterNames: string[];
98
+ parameterTypes: Type[];
99
+ thrownExceptions: Type[];
100
+ annotations: Type.Annotation[];
101
+ defaultValue?: string[];
102
+ declaredFormalTypeNames: string[];
103
+ }
104
+
105
+ export interface Variable extends Type {
91
106
  readonly kind: typeof Kind.Variable;
92
- readonly name: string;
93
- readonly owner?: JavaType;
94
- readonly type: JavaType;
95
- readonly annotations: JavaType.Annotation[];
107
+ name: string;
108
+ owner?: Type;
109
+ type: Type;
110
+ annotations: Type.Annotation[];
111
+
112
+ toJSON?(): string;
96
113
  }
97
114
 
98
- export interface Parameterized extends JavaType, FullyQualified {
115
+ export interface Parameterized extends Type, FullyQualified {
99
116
  readonly kind: typeof Kind.Parameterized;
100
- readonly type: JavaType.FullyQualified;
101
- readonly typeParameters: JavaType[];
117
+ type: Type.FullyQualified;
118
+ typeParameters: Type[];
102
119
  }
103
120
 
104
- export interface GenericTypeVariable extends JavaType {
121
+ export interface GenericTypeVariable extends Type {
105
122
  readonly kind: typeof Kind.GenericTypeVariable;
106
- readonly name: string;
107
- readonly variance: GenericTypeVariable.Variance;
108
- readonly bounds: JavaType[];
123
+ name: string;
124
+ variance: GenericTypeVariable.Variance;
125
+ bounds: Type[];
109
126
  }
110
127
 
111
128
  export namespace GenericTypeVariable {
@@ -116,17 +133,17 @@ export namespace JavaType {
116
133
  }
117
134
  }
118
135
 
119
- export interface Array extends JavaType, FullyQualified {
136
+ export interface Array extends Type, FullyQualified {
120
137
  readonly kind: typeof Kind.Array;
121
- readonly elemType: JavaType;
122
- readonly annotations: JavaType.Annotation[];
138
+ elemType: Type;
139
+ annotations: Type.Annotation[];
123
140
  }
124
141
 
125
142
 
126
- export class Primitive implements JavaType {
143
+ export class Primitive implements Type {
127
144
  private constructor(
128
145
  public readonly keyword: string,
129
- public readonly kind = JavaType.Kind.Primitive
146
+ public readonly kind = Type.Kind.Primitive
130
147
  ) {
131
148
  }
132
149
 
@@ -194,58 +211,442 @@ export namespace JavaType {
194
211
  }
195
212
  }
196
213
 
197
- export interface Union extends JavaType {
214
+ export interface Union extends Type {
198
215
  readonly kind: typeof Kind.Union;
199
- readonly bounds: JavaType[];
216
+ bounds: Type[];
200
217
  }
201
218
 
202
- export interface Intersection extends JavaType {
219
+ export interface Intersection extends Type {
203
220
  readonly kind: typeof Kind.Intersection;
204
- readonly bounds: JavaType[];
221
+ bounds: Type[];
205
222
  }
206
223
 
207
- export interface ShallowClass extends JavaType.Class {
224
+ export interface ShallowClass extends Type.Class {
208
225
  readonly kind: typeof Kind.ShallowClass;
209
226
  }
210
227
 
211
- export const unknownType: JavaType = asRef({
212
- kind: JavaType.Kind.Unknown
228
+ export const unknownType: Type = asRef({
229
+ kind: Type.Kind.Unknown
213
230
  });
214
231
 
215
- export function isPrimitive(type?: JavaType): type is JavaType.Primitive {
216
- return type?.kind === JavaType.Kind.Primitive;
232
+ export function isPrimitive(type?: Type): type is Type.Primitive {
233
+ return type?.kind === Type.Kind.Primitive;
217
234
  }
218
235
 
219
- export function isClass(type?: JavaType): type is JavaType.Class {
220
- return type?.kind === JavaType.Kind.Class;
236
+ export function isClass(type?: Type): type is Type.Class {
237
+ return type?.kind === Type.Kind.Class;
221
238
  }
222
239
 
223
- export function isArray(type?: JavaType): type is JavaType.Array {
224
- return type?.kind === JavaType.Kind.Array;
240
+ export function isArray(type?: Type): type is Type.Array {
241
+ return type?.kind === Type.Kind.Array;
225
242
  }
226
243
 
227
- export function isParameterized(type?: JavaType): type is JavaType.Parameterized {
228
- return type?.kind === JavaType.Kind.Parameterized;
244
+ export function isParameterized(type?: Type): type is Type.Parameterized {
245
+ return type?.kind === Type.Kind.Parameterized;
229
246
  }
230
247
 
231
- export interface FullyQualified extends JavaType {
248
+ export interface FullyQualified extends Type {
232
249
  }
233
250
 
234
251
  export namespace FullyQualified {
235
252
  export function getFullyQualifiedName(javaType: FullyQualified): string {
236
253
  switch (javaType.kind) {
237
- case JavaType.Kind.Class:
238
- return (javaType as JavaType.Class).fullyQualifiedName;
239
- case JavaType.Kind.Parameterized:
240
- return getFullyQualifiedName((javaType as JavaType.Parameterized).type);
241
- case JavaType.Kind.Annotation:
242
- return getFullyQualifiedName((javaType as JavaType.Annotation).type);
243
- case JavaType.Kind.ShallowClass:
244
- return (javaType as JavaType.ShallowClass).fullyQualifiedName;
245
- case JavaType.Kind.Unknown:
254
+ case Type.Kind.Class:
255
+ return (javaType as Type.Class).fullyQualifiedName;
256
+ case Type.Kind.Parameterized:
257
+ return getFullyQualifiedName((javaType as Type.Parameterized).type);
258
+ case Type.Kind.Annotation:
259
+ return getFullyQualifiedName((javaType as Type.Annotation).type);
260
+ case Type.Kind.ShallowClass:
261
+ return (javaType as Type.ShallowClass).fullyQualifiedName;
262
+ case Type.Kind.Unknown:
246
263
  return "<unknown>";
247
264
  }
248
265
  throw new Error("Cannot get fully qualified name of type: " + JSON.stringify(javaType));
249
266
  }
250
267
  }
268
+
269
+ // Track type variable names and parameterized types to prevent infinite recursion
270
+ let typeVariableNameStack: Set<string> | null = null;
271
+ let parameterizedStack: Set<Type> | null = null;
272
+
273
+ export function signature(type: Type | undefined | null): string {
274
+ if (!type) {
275
+ return "<null>";
276
+ }
277
+ switch (type.kind) {
278
+ case Type.Kind.Array: {
279
+ const arr = type as Type.Array;
280
+ return signature(arr.elemType) + "[]";
281
+ }
282
+ case Type.Kind.Class:
283
+ case Type.Kind.ShallowClass: {
284
+ const clazz = type as Type.Class;
285
+ return clazz.fullyQualifiedName;
286
+ }
287
+ case Type.Kind.GenericTypeVariable: {
288
+ const generic = type as Type.GenericTypeVariable;
289
+ let result = "Generic{" + generic.name;
290
+
291
+ // Initialize stack if needed
292
+ if (typeVariableNameStack === null) {
293
+ typeVariableNameStack = new Set<string>();
294
+ }
295
+
296
+ // Check for recursion in type variable names
297
+ if (generic.name !== "?" && typeVariableNameStack.has(generic.name)) {
298
+ return result + "}";
299
+ }
300
+
301
+ // Add to stack to track
302
+ if (generic.name !== "?") {
303
+ typeVariableNameStack.add(generic.name);
304
+ }
305
+
306
+ try {
307
+ if (!generic.bounds || generic.bounds.length === 0) {
308
+ return result + "}";
309
+ }
310
+
311
+ // Filter out bounds that would cause cycles through parameterized types
312
+ const safeBounds = generic.bounds.filter(b => {
313
+ return !parameterizedStack || !parameterizedStack.has(b);
314
+ });
315
+
316
+ if (safeBounds.length > 0) {
317
+ const bounds = safeBounds.map(b => signature(b)).join(" & ");
318
+ result += " extends " + bounds;
319
+ }
320
+
321
+ return result + "}";
322
+ } finally {
323
+ // Remove from stack when done
324
+ if (generic.name !== "?") {
325
+ typeVariableNameStack.delete(generic.name);
326
+ }
327
+ }
328
+ }
329
+ case Type.Kind.Intersection: {
330
+ const intersection = type as Type.Intersection;
331
+ return (intersection.bounds || []).map(b => signature(b)).join(" & ");
332
+ }
333
+ case Type.Kind.Method: {
334
+ const method = type as Type.Method;
335
+ const declaringType = signature(method.declaringType);
336
+ const params = (method.parameterTypes || []).map(p => signature(p)).join(", ");
337
+ return declaringType + "{name=" + method.name + ",return=" + signature(method.returnType) + ",parameters=[" + params + "]}";
338
+ }
339
+ case Type.Kind.Parameterized: {
340
+ const parameterized = type as Type.Parameterized;
341
+
342
+ // Initialize stack if needed
343
+ if (parameterizedStack === null) {
344
+ parameterizedStack = new Set<Type>();
345
+ }
346
+
347
+ // Add to stack to track cycles
348
+ parameterizedStack.add(parameterized);
349
+
350
+ try {
351
+ const baseType = signature(parameterized.type);
352
+ if (!parameterized.typeParameters || parameterized.typeParameters.length === 0) {
353
+ return baseType;
354
+ }
355
+ const params = parameterized.typeParameters.map(p => signature(p)).join(", ");
356
+ return baseType + "<" + params + ">";
357
+ } finally {
358
+ // Remove from stack when done
359
+ parameterizedStack.delete(parameterized);
360
+ }
361
+ }
362
+ case Type.Kind.Primitive: {
363
+ const primitive = type as Type.Primitive;
364
+ return primitive.keyword;
365
+ }
366
+ case Type.Kind.Union: {
367
+ const union = type as Type.Union;
368
+ return (union.bounds || []).map(b => signature(b)).join(" | ");
369
+ }
370
+ case Type.Kind.Unknown: {
371
+ return "<unknown>";
372
+ }
373
+ case Type.Kind.Variable: {
374
+ const variable = type as Type.Variable;
375
+ const ownerSig = variable.owner ? signature(variable.owner) + "{" : "";
376
+ const closeBrace = variable.owner ? "}" : "";
377
+ return ownerSig + "name=" + variable.name + ",type=" + signature(variable.type) + closeBrace;
378
+ }
379
+ case Type.Kind.Annotation: {
380
+ const annotation = type as Type.Annotation;
381
+ return "@" + signature(annotation.type);
382
+ }
383
+ default:
384
+ return "<unknown>";
385
+ }
386
+ }
251
387
  }
388
+
389
+ RpcCodecs.registerCodec(Type.Kind.Primitive, {
390
+ async rpcSend(after: Type.Primitive, q: RpcSendQueue): Promise<void> {
391
+ await q.getAndSend(after, p => p.keyword);
392
+ },
393
+ async rpcReceive(before: Type.Primitive, q: RpcReceiveQueue): Promise<Type.Primitive> {
394
+ const keyword: string = await q.receive(before.keyword);
395
+ return Type.Primitive.fromKeyword(keyword)!;
396
+ }
397
+ });
398
+
399
+ RpcCodecs.registerCodec(Type.Kind.Class, {
400
+ async rpcSend(after: Type.Class, q: RpcSendQueue): Promise<void> {
401
+ await q.getAndSend(after, c => c.classKind);
402
+ await q.getAndSend(after, c => c.fullyQualifiedName);
403
+ await q.getAndSendList(after, c => (c.typeParameters || []).map(t => asRef(t)), t => Type.signature(t));
404
+ await q.getAndSend(after, c => asRef(c.supertype));
405
+ await q.getAndSend(after, c => asRef(c.owningClass));
406
+ await q.getAndSendList(after, c => (c.annotations || []).map(a => asRef(a)), t => Type.signature(t));
407
+ await q.getAndSendList(after, c => (c.interfaces || []).map(i => asRef(i)), t => Type.signature(t));
408
+ await q.getAndSendList(after, c => (c.members || []).map(m => asRef(m)), t => Type.signature(t));
409
+ await q.getAndSendList(after, c => (c.methods || []).map(m => asRef(m)), t => Type.signature(t));
410
+ },
411
+ async rpcReceive(before: Type.Class, q: RpcReceiveQueue): Promise<Type.Class> {
412
+ // Mutate the before object in place to preserve reference identity
413
+ before.classKind = await q.receive(before.classKind);
414
+ before.fullyQualifiedName = await q.receive(before.fullyQualifiedName);
415
+ before.typeParameters = await q.receiveList(before.typeParameters) || [];
416
+ before.supertype = await q.receive(before.supertype);
417
+ before.owningClass = await q.receive(before.owningClass);
418
+ before.annotations = await q.receiveList(before.annotations) || [];
419
+ before.interfaces = await q.receiveList(before.interfaces) || [];
420
+ before.members = await q.receiveList(before.members) || [];
421
+ before.methods = await q.receiveList(before.methods) || [];
422
+ (before as any).toJSON = function () {
423
+ return Type.signature(this);
424
+ };
425
+ // Mark as non-draftable to prevent immer from processing circular references
426
+ (before as any)[immerable] = false;
427
+
428
+ return before;
429
+ }
430
+ });
431
+
432
+ RpcCodecs.registerCodec(Type.Kind.Variable, {
433
+ async rpcSend(after: Type.Variable, q: RpcSendQueue): Promise<void> {
434
+ await q.getAndSend(after, v => v.name);
435
+ await q.getAndSend(after, v => v.owner ? asRef(v.owner) : undefined);
436
+ await q.getAndSend(after, v => asRef(v.type));
437
+ await q.getAndSendList(after, v => (v.annotations || []).map(v2 => asRef(v2)), t => Type.signature(t));
438
+ },
439
+ async rpcReceive(before: Type.Variable, q: RpcReceiveQueue): Promise<Type.Variable> {
440
+ // Mutate the before object in place to preserve reference identity
441
+ before.name = await q.receive(before.name);
442
+ before.owner = await q.receive(before.owner);
443
+ before.type = await q.receive(before.type);
444
+ before.annotations = await q.receiveList(before.annotations) || [];
445
+ return before;
446
+ }
447
+ });
448
+
449
+ RpcCodecs.registerCodec(Type.Kind.Annotation, {
450
+ async rpcSend(after: Type.Annotation, q: RpcSendQueue): Promise<void> {
451
+ await q.getAndSend(after, a => asRef(a.type));
452
+ await q.getAndSendList(after, a => (a.values || []).map(v => asRef(v)), v => {
453
+ let value: any;
454
+ if (v.kind === Type.Kind.SingleElementValue) {
455
+ const single = v as Type.Annotation.SingleElementValue;
456
+ value = single.constantValue !== undefined ? single.constantValue : single.referenceValue;
457
+ } else {
458
+ const array = v as Type.Annotation.ArrayElementValue;
459
+ value = array.constantValues || array.referenceValues;
460
+ }
461
+ return `${Type.signature(v.element)}:${value == null ? "null" : value.toString()}`;
462
+ });
463
+ },
464
+ async rpcReceive(before: Type.Annotation, q: RpcReceiveQueue): Promise<Type.Annotation> {
465
+ // Mutate the before object in place to preserve reference identity
466
+ before.type = await q.receive(before.type);
467
+ before.values = await q.receiveList(before.values) || [];
468
+ return before;
469
+ }
470
+ });
471
+
472
+ RpcCodecs.registerCodec(Type.Kind.SingleElementValue, {
473
+ async rpcSend(after: Type.Annotation.SingleElementValue, q: RpcSendQueue): Promise<void> {
474
+ await q.getAndSend(after, e => asRef(e.element));
475
+ await q.getAndSend(after, e => e.constantValue);
476
+ await q.getAndSend(after, e => asRef(e.referenceValue));
477
+ },
478
+ async rpcReceive(before: Type.Annotation.SingleElementValue | undefined, q: RpcReceiveQueue): Promise<Type.Annotation.SingleElementValue> {
479
+ if (!before) {
480
+ return {
481
+ kind: Type.Kind.SingleElementValue,
482
+ element: (await q.receive(undefined) as unknown) as Type,
483
+ constantValue: await q.receive(undefined),
484
+ referenceValue: await q.receive(undefined)
485
+ };
486
+ }
487
+ // Mutate the before object in place to preserve reference identity
488
+ before.element = await q.receive(before.element);
489
+ before.constantValue = await q.receive(before.constantValue);
490
+ before.referenceValue = await q.receive(before.referenceValue);
491
+ return before;
492
+ }
493
+ });
494
+
495
+ RpcCodecs.registerCodec(Type.Kind.ArrayElementValue, {
496
+ async rpcSend(after: Type.Annotation.ArrayElementValue, q: RpcSendQueue): Promise<void> {
497
+ await q.getAndSend(after, e => asRef(e.element));
498
+ await q.getAndSendList(after, e => e.constantValues || [], v => v == null ? "null" : v.toString());
499
+ await q.getAndSendList(after, e => (e.referenceValues || []).map(r => asRef(r)), t => Type.signature(t));
500
+ },
501
+ async rpcReceive(before: Type.Annotation.ArrayElementValue | undefined, q: RpcReceiveQueue): Promise<Type.Annotation.ArrayElementValue> {
502
+ if (!before) {
503
+ return {
504
+ kind: Type.Kind.ArrayElementValue,
505
+ element: (await q.receive(undefined) as unknown) as Type,
506
+ constantValues: await q.receiveList(undefined),
507
+ referenceValues: await q.receiveList(undefined)
508
+ };
509
+ }
510
+ // Mutate the before object in place to preserve reference identity
511
+ before.element = await q.receive(before.element);
512
+ before.constantValues = await q.receiveList(before.constantValues);
513
+ before.referenceValues = await q.receiveList(before.referenceValues);
514
+ return before;
515
+ }
516
+ });
517
+
518
+ RpcCodecs.registerCodec(Type.Kind.Method, {
519
+ async rpcSend(after: Type.Method, q: RpcSendQueue): Promise<void> {
520
+ await q.getAndSend(after, m => asRef(m.declaringType));
521
+ await q.getAndSend(after, m => m.name);
522
+ await q.getAndSend(after, m => asRef(m.returnType));
523
+ await q.getAndSendList(after, m => m.parameterNames || [], v => v);
524
+ await q.getAndSendList(after, m => (m.parameterTypes || []).map(t => asRef(t)), t => Type.signature(t));
525
+ await q.getAndSendList(after, m => (m.thrownExceptions || []).map(t => asRef(t)), t => Type.signature(t));
526
+ await q.getAndSendList(after, m => (m.annotations || []).map(a => asRef(a)), t => Type.signature(t));
527
+ await q.getAndSendList(after, m => m.defaultValue || undefined, v => v);
528
+ await q.getAndSendList(after, m => m.declaredFormalTypeNames || [], v => v);
529
+ },
530
+ async rpcReceive(before: Type.Method, q: RpcReceiveQueue): Promise<Type.Method> {
531
+ // Mutate the before object in place to preserve reference identity
532
+ before.declaringType = await q.receive(before.declaringType);
533
+ before.name = await q.receive(before.name);
534
+ before.returnType = await q.receive(before.returnType);
535
+ before.parameterNames = await q.receiveList(before.parameterNames) || [];
536
+ before.parameterTypes = await q.receiveList(before.parameterTypes) || [];
537
+ before.thrownExceptions = await q.receiveList(before.thrownExceptions) || [];
538
+ before.annotations = await q.receiveList(before.annotations) || [];
539
+ before.defaultValue = await q.receiveList(before.defaultValue);
540
+ before.declaredFormalTypeNames = await q.receiveList(before.declaredFormalTypeNames) || [];
541
+ return before;
542
+ }
543
+ });
544
+
545
+ RpcCodecs.registerCodec(Type.Kind.Array, {
546
+ async rpcSend(after: Type.Array, q: RpcSendQueue): Promise<void> {
547
+ await q.getAndSend(after, a => asRef(a.elemType));
548
+ await q.getAndSendList(after, a => (a.annotations || []).map(ann => asRef(ann)), t => Type.signature(t));
549
+ },
550
+ async rpcReceive(before: Type.Array, q: RpcReceiveQueue): Promise<Type.Array> {
551
+ // Mutate the before object in place to preserve reference identity
552
+ before.elemType = await q.receive(before.elemType);
553
+ before.annotations = await q.receiveList(before.annotations) || [];
554
+ return before;
555
+ }
556
+ });
557
+
558
+ RpcCodecs.registerCodec(Type.Kind.Parameterized, {
559
+ async rpcSend(after: Type.Parameterized, q: RpcSendQueue): Promise<void> {
560
+ await q.getAndSend(after, p => asRef(p.type));
561
+ await q.getAndSendList(after, p => (p.typeParameters || []).map(t => asRef(t)), t => Type.signature(t));
562
+ },
563
+ async rpcReceive(before: Type.Parameterized, q: RpcReceiveQueue): Promise<Type.Parameterized> {
564
+ // Mutate the before object in place to preserve reference identity
565
+ before.type = await q.receive(before.type);
566
+ before.typeParameters = await q.receiveList(before.typeParameters) || [];
567
+ return before;
568
+ }
569
+ });
570
+
571
+ RpcCodecs.registerCodec(Type.Kind.GenericTypeVariable, {
572
+ async rpcSend(after: Type.GenericTypeVariable, q: RpcSendQueue): Promise<void> {
573
+ await q.getAndSend(after, g => g.name);
574
+ // Convert TypeScript enum to Java enum string
575
+ await q.getAndSend(after, g => {
576
+ switch (g.variance) {
577
+ case Type.GenericTypeVariable.Variance.Covariant:
578
+ return 'COVARIANT';
579
+ case Type.GenericTypeVariable.Variance.Contravariant:
580
+ return 'CONTRAVARIANT';
581
+ case Type.GenericTypeVariable.Variance.Invariant:
582
+ default:
583
+ return 'INVARIANT';
584
+ }
585
+ });
586
+ await q.getAndSendList(after, g => (g.bounds || []).map(b => asRef(b)), t => Type.signature(t));
587
+ },
588
+ async rpcReceive(before: Type.GenericTypeVariable, q: RpcReceiveQueue): Promise<Type.GenericTypeVariable> {
589
+ // Mutate the before object in place to preserve reference identity
590
+ before.name = await q.receive(before.name);
591
+ const varianceStr = await q.receive(before.variance) as any as string;
592
+ // Convert Java enum string to TypeScript enum
593
+ switch (varianceStr) {
594
+ case 'COVARIANT':
595
+ before.variance = Type.GenericTypeVariable.Variance.Covariant;
596
+ break;
597
+ case 'CONTRAVARIANT':
598
+ before.variance = Type.GenericTypeVariable.Variance.Contravariant;
599
+ break;
600
+ case 'INVARIANT':
601
+ default:
602
+ before.variance = Type.GenericTypeVariable.Variance.Invariant;
603
+ break;
604
+ }
605
+ before.bounds = await q.receiveList(before.bounds) || [];
606
+ return before;
607
+ }
608
+ });
609
+
610
+ RpcCodecs.registerCodec(Type.Kind.Union, {
611
+ async rpcSend(after: Type.Union, q: RpcSendQueue): Promise<void> {
612
+ await q.getAndSendList(after, u => (u.bounds || []).map(b => asRef(b)), t => Type.signature(t));
613
+ },
614
+ async rpcReceive(before: Type.Union, q: RpcReceiveQueue): Promise<Type.Union> {
615
+ // Mutate the before object in place to preserve reference identity
616
+ before.bounds = await q.receiveList(before.bounds) || [];
617
+ return before;
618
+ }
619
+ });
620
+
621
+ RpcCodecs.registerCodec(Type.Kind.Intersection, {
622
+ async rpcSend(after: Type.Intersection, q: RpcSendQueue): Promise<void> {
623
+ await q.getAndSendList(after, i => (i.bounds || []).map(b => asRef(b)), t => Type.signature(t));
624
+ },
625
+ async rpcReceive(before: Type.Intersection, q: RpcReceiveQueue): Promise<Type.Intersection> {
626
+ // Mutate the before object in place to preserve reference identity
627
+ before.bounds = await q.receiveList(before.bounds) || [];
628
+ return before;
629
+ }
630
+ });
631
+
632
+ RpcCodecs.registerCodec(Type.Kind.ShallowClass, {
633
+ async rpcSend(after: Type.ShallowClass, q: RpcSendQueue): Promise<void> {
634
+ await q.getAndSend(after, c => c.fullyQualifiedName);
635
+ await q.getAndSend(after, c => asRef(c.owningClass));
636
+ },
637
+ async rpcReceive(before: Type.ShallowClass, q: RpcReceiveQueue): Promise<Type.ShallowClass> {
638
+ before.classKind = Type.Class.Kind.Class;
639
+ before.fullyQualifiedName = await q.receive(before.fullyQualifiedName);
640
+ before.owningClass = await q.receive(before.owningClass);
641
+ return before;
642
+ }
643
+ });
644
+
645
+ RpcCodecs.registerCodec(Type.Kind.Unknown, {
646
+ async rpcSend(_after: Type, _q: RpcSendQueue): Promise<void> {
647
+ // Unknown type has no additional data
648
+ },
649
+ async rpcReceive(_before: Type, _q: RpcReceiveQueue): Promise<Type> {
650
+ return Type.unknownType;
651
+ }
652
+ });