@openrewrite/rewrite 8.63.0 → 8.63.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 (134) hide show
  1. package/dist/java/index.d.ts +1 -0
  2. package/dist/java/index.d.ts.map +1 -1
  3. package/dist/java/index.js +1 -0
  4. package/dist/java/index.js.map +1 -1
  5. package/dist/java/rpc.d.ts +2 -0
  6. package/dist/java/rpc.d.ts.map +1 -1
  7. package/dist/java/rpc.js +749 -410
  8. package/dist/java/rpc.js.map +1 -1
  9. package/dist/java/tree.d.ts +1 -1
  10. package/dist/java/tree.d.ts.map +1 -1
  11. package/dist/java/type-visitor.d.ts +48 -0
  12. package/dist/java/type-visitor.d.ts.map +1 -0
  13. package/dist/java/type-visitor.js +260 -0
  14. package/dist/java/type-visitor.js.map +1 -0
  15. package/dist/java/type.d.ts +2 -0
  16. package/dist/java/type.d.ts.map +1 -1
  17. package/dist/java/type.js +0 -317
  18. package/dist/java/type.js.map +1 -1
  19. package/dist/java/visitor.d.ts.map +1 -1
  20. package/dist/java/visitor.js +579 -363
  21. package/dist/java/visitor.js.map +1 -1
  22. package/dist/javascript/preconditions.d.ts +1 -1
  23. package/dist/javascript/preconditions.d.ts.map +1 -1
  24. package/dist/javascript/preconditions.js +7 -6
  25. package/dist/javascript/preconditions.js.map +1 -1
  26. package/dist/javascript/rpc.js +430 -350
  27. package/dist/javascript/rpc.js.map +1 -1
  28. package/dist/javascript/tree.d.ts +1 -1
  29. package/dist/javascript/tree.d.ts.map +1 -1
  30. package/dist/javascript/type-mapping.d.ts.map +1 -1
  31. package/dist/javascript/type-mapping.js +7 -0
  32. package/dist/javascript/type-mapping.js.map +1 -1
  33. package/dist/javascript/visitor.d.ts.map +1 -1
  34. package/dist/javascript/visitor.js +504 -309
  35. package/dist/javascript/visitor.js.map +1 -1
  36. package/dist/json/visitor.d.ts.map +1 -1
  37. package/dist/json/visitor.js +46 -21
  38. package/dist/json/visitor.js.map +1 -1
  39. package/dist/rpc/queue.d.ts +7 -4
  40. package/dist/rpc/queue.d.ts.map +1 -1
  41. package/dist/rpc/queue.js +22 -32
  42. package/dist/rpc/queue.js.map +1 -1
  43. package/dist/rpc/request/generate.d.ts.map +1 -1
  44. package/dist/rpc/request/generate.js +2 -3
  45. package/dist/rpc/request/generate.js.map +1 -1
  46. package/dist/rpc/request/get-languages.d.ts.map +1 -1
  47. package/dist/rpc/request/get-languages.js +4 -3
  48. package/dist/rpc/request/get-languages.js.map +1 -1
  49. package/dist/rpc/request/get-object.d.ts +1 -1
  50. package/dist/rpc/request/get-object.d.ts.map +1 -1
  51. package/dist/rpc/request/get-object.js +8 -7
  52. package/dist/rpc/request/get-object.js.map +1 -1
  53. package/dist/rpc/request/get-recipes.d.ts.map +1 -1
  54. package/dist/rpc/request/get-recipes.js +2 -2
  55. package/dist/rpc/request/get-recipes.js.map +1 -1
  56. package/dist/rpc/request/index.d.ts +1 -0
  57. package/dist/rpc/request/index.d.ts.map +1 -1
  58. package/dist/rpc/request/index.js +1 -0
  59. package/dist/rpc/request/index.js.map +1 -1
  60. package/dist/rpc/request/install-recipes.d.ts.map +1 -1
  61. package/dist/rpc/request/install-recipes.js +30 -21
  62. package/dist/rpc/request/install-recipes.js.map +1 -1
  63. package/dist/rpc/request/metrics.d.ts +10 -10
  64. package/dist/rpc/request/metrics.d.ts.map +1 -1
  65. package/dist/rpc/request/metrics.js +38 -31
  66. package/dist/rpc/request/metrics.js.map +1 -1
  67. package/dist/rpc/request/parse.d.ts.map +1 -1
  68. package/dist/rpc/request/parse.js +10 -12
  69. package/dist/rpc/request/parse.js.map +1 -1
  70. package/dist/rpc/request/prepare-recipe.d.ts.map +1 -1
  71. package/dist/rpc/request/prepare-recipe.js +4 -4
  72. package/dist/rpc/request/prepare-recipe.js.map +1 -1
  73. package/dist/rpc/request/print.d.ts +1 -1
  74. package/dist/rpc/request/print.d.ts.map +1 -1
  75. package/dist/rpc/request/print.js +10 -6
  76. package/dist/rpc/request/print.js.map +1 -1
  77. package/dist/rpc/request/trace-get-object.d.ts +5 -0
  78. package/dist/rpc/request/trace-get-object.d.ts.map +1 -0
  79. package/dist/rpc/request/trace-get-object.js +3 -0
  80. package/dist/rpc/request/trace-get-object.js.map +1 -0
  81. package/dist/rpc/request/visit.d.ts.map +1 -1
  82. package/dist/rpc/request/visit.js +2 -3
  83. package/dist/rpc/request/visit.js.map +1 -1
  84. package/dist/rpc/rewrite-rpc.d.ts +2 -3
  85. package/dist/rpc/rewrite-rpc.d.ts.map +1 -1
  86. package/dist/rpc/rewrite-rpc.js +14 -5
  87. package/dist/rpc/rewrite-rpc.js.map +1 -1
  88. package/dist/rpc/server.d.ts.map +1 -1
  89. package/dist/rpc/server.js +15 -44
  90. package/dist/rpc/server.js.map +1 -1
  91. package/dist/rpc/trace.d.ts +1 -1
  92. package/dist/rpc/trace.d.ts.map +1 -1
  93. package/dist/rpc/trace.js +3 -3
  94. package/dist/rpc/trace.js.map +1 -1
  95. package/dist/util.d.ts +6 -0
  96. package/dist/util.d.ts.map +1 -1
  97. package/dist/util.js +14 -0
  98. package/dist/util.js.map +1 -1
  99. package/dist/version.txt +1 -1
  100. package/package.json +1 -1
  101. package/src/java/index.ts +1 -0
  102. package/src/java/rpc.ts +726 -537
  103. package/src/java/tree.ts +1 -1
  104. package/src/java/type-visitor.ts +241 -0
  105. package/src/java/type.ts +13 -277
  106. package/src/java/visitor.ts +581 -378
  107. package/src/javascript/preconditions.ts +7 -6
  108. package/src/javascript/rpc.ts +431 -360
  109. package/src/javascript/tree.ts +1 -1
  110. package/src/javascript/type-mapping.ts +7 -0
  111. package/src/javascript/visitor.ts +505 -310
  112. package/src/json/visitor.ts +47 -22
  113. package/src/rpc/queue.ts +20 -17
  114. package/src/rpc/request/generate.ts +31 -25
  115. package/src/rpc/request/get-languages.ts +18 -10
  116. package/src/rpc/request/get-object.ts +42 -34
  117. package/src/rpc/request/get-recipes.ts +15 -8
  118. package/src/rpc/request/index.ts +1 -0
  119. package/src/rpc/request/install-recipes.ts +96 -79
  120. package/src/rpc/request/metrics.ts +54 -48
  121. package/src/rpc/request/parse.ts +31 -25
  122. package/src/rpc/request/prepare-recipe.ts +31 -23
  123. package/src/rpc/request/print.ts +28 -14
  124. package/src/rpc/request/trace-get-object.ts +4 -0
  125. package/src/rpc/request/visit.ts +22 -16
  126. package/src/rpc/rewrite-rpc.ts +23 -10
  127. package/src/rpc/server.ts +17 -52
  128. package/src/rpc/trace.ts +3 -3
  129. package/src/util.ts +14 -0
  130. package/dist/rpc/chrome-profiler.d.ts +0 -25
  131. package/dist/rpc/chrome-profiler.d.ts.map +0 -1
  132. package/dist/rpc/chrome-profiler.js +0 -405
  133. package/dist/rpc/chrome-profiler.js.map +0 -1
  134. package/src/rpc/chrome-profiler.ts +0 -373
@@ -17,17 +17,17 @@ import {JavaScriptVisitor} from "./visitor";
17
17
  import {asRef, RpcCodec, RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
18
18
  import {isJavaScript, JS, JSX} from "./tree";
19
19
  import {Expression, J, Statement, Type, TypedTree, TypeTree} from "../java";
20
- import {createDraft, finishDraft} from "immer";
21
20
  import {JavaReceiver, JavaSender, registerJLanguageCodecs} from "../java/rpc";
22
21
  import {Cursor, Tree} from "../tree";
22
+ import {updateIfChanged} from "../util";
23
23
  import ComputedPropertyName = JS.ComputedPropertyName;
24
24
 
25
25
  class JavaScriptSender extends JavaScriptVisitor<RpcSendQueue> {
26
- private javaSender: JavaScriptSenderDelegate;
26
+ private delegate: JavaScriptDelegateSender;
27
27
 
28
28
  constructor() {
29
29
  super();
30
- this.javaSender = new JavaScriptSenderDelegate(this);
30
+ this.delegate = new JavaScriptDelegateSender(this);
31
31
  }
32
32
 
33
33
  override async visit<R extends J>(tree: Tree, p: RpcSendQueue, parent?: Cursor): Promise<R | undefined> {
@@ -35,7 +35,7 @@ class JavaScriptSender extends JavaScriptVisitor<RpcSendQueue> {
35
35
  return super.visit(tree, p, parent);
36
36
  }
37
37
 
38
- return this.javaSender.visit(tree, p, parent);
38
+ return this.delegate.visit(tree, p, parent);
39
39
  }
40
40
 
41
41
  override async preVisit(j: JS, q: RpcSendQueue): Promise<J | undefined> {
@@ -507,27 +507,27 @@ class JavaScriptSender extends JavaScriptVisitor<RpcSendQueue> {
507
507
  }
508
508
 
509
509
  override async visitRightPadded<T extends J | boolean>(right: J.RightPadded<T>, q: RpcSendQueue): Promise<J.RightPadded<T>> {
510
- return this.javaSender.visitRightPadded(right, q);
510
+ return this.delegate.visitRightPadded(right, q);
511
511
  }
512
512
 
513
513
  override async visitLeftPadded<T extends J | J.Space | number | string | boolean>(left: J.LeftPadded<T>, q: RpcSendQueue): Promise<J.LeftPadded<T>> {
514
- return this.javaSender.visitLeftPadded(left, q);
514
+ return this.delegate.visitLeftPadded(left, q);
515
515
  }
516
516
 
517
517
  override async visitContainer<T extends J>(container: J.Container<T>, q: RpcSendQueue): Promise<J.Container<T>> {
518
- return this.javaSender.visitContainer(container, q);
518
+ return this.delegate.visitContainer(container, q);
519
519
  }
520
520
 
521
521
  override async visitSpace(space: J.Space, q: RpcSendQueue): Promise<J.Space> {
522
- return this.javaSender.visitSpace(space, q);
522
+ return this.delegate.visitSpace(space, q);
523
523
  }
524
524
 
525
525
  override async visitType(javaType: Type | undefined, q: RpcSendQueue): Promise<Type | undefined> {
526
- return this.javaSender.visitType(javaType, q);
526
+ return this.delegate.visitType(javaType, q);
527
527
  }
528
528
  }
529
529
 
530
- class JavaScriptSenderDelegate extends JavaSender {
530
+ class JavaScriptDelegateSender extends JavaSender {
531
531
  private javascriptSender: JavaScriptSender;
532
532
 
533
533
  constructor(javascriptSender: JavaScriptSender) {
@@ -547,583 +547,654 @@ class JavaScriptSenderDelegate extends JavaSender {
547
547
  }
548
548
 
549
549
  class JavaScriptReceiver extends JavaScriptVisitor<RpcReceiveQueue> {
550
- private javaReceiverDelegate: JavaReceiver;
550
+ private delegate: JavaReceiver;
551
551
 
552
552
  constructor() {
553
553
  super();
554
- this.javaReceiverDelegate = new JavaScriptReceiverDelegate(this);
554
+ this.delegate = new JavaScriptDelegateReceiver(this);
555
555
  }
556
556
 
557
557
  async visit<R extends J>(tree: Tree, p: RpcReceiveQueue, parent?: Cursor): Promise<R | undefined> {
558
558
  if (isJavaScript(tree)) {
559
559
  return super.visit(tree, p, parent);
560
560
  }
561
- return this.javaReceiverDelegate.visit(tree, p, parent);
561
+ return this.delegate.visit(tree, p, parent);
562
562
  }
563
563
 
564
564
  override async preVisit(j: JS, q: RpcReceiveQueue): Promise<J | undefined> {
565
- const draft = createDraft(j);
566
-
567
- draft.id = await q.receive(j.id);
568
- draft.prefix = await q.receive(j.prefix, space => this.visitSpace(space, q));
569
- draft.markers = await q.receive(j.markers);
570
-
571
- return finishDraft(draft);
565
+ const updates = {
566
+ id: await q.receive(j.id),
567
+ prefix: await q.receive(j.prefix, space => this.visitSpace(space, q)),
568
+ markers: await q.receive(j.markers)
569
+ };
570
+ return updateIfChanged(j, updates);
572
571
  }
573
572
 
574
573
  override async visitJsCompilationUnit(cu: JS.CompilationUnit, q: RpcReceiveQueue): Promise<J | undefined> {
575
- const draft = createDraft(cu);
576
-
577
- draft.sourcePath = await q.receive(cu.sourcePath);
578
- draft.charsetName = await q.receive(cu.charsetName);
579
- draft.charsetBomMarked = await q.receive(cu.charsetBomMarked);
580
- draft.checksum = await q.receive(cu.checksum);
581
- draft.fileAttributes = await q.receive(cu.fileAttributes);
582
- draft.statements = await q.receiveListDefined(cu.statements, stmt => this.visitRightPadded(stmt, q));
583
- draft.eof = await q.receive(cu.eof, space => this.visitSpace(space, q));
584
-
585
- return finishDraft(draft);
574
+ const updates = {
575
+ sourcePath: await q.receive(cu.sourcePath),
576
+ charsetName: await q.receive(cu.charsetName),
577
+ charsetBomMarked: await q.receive(cu.charsetBomMarked),
578
+ checksum: await q.receive(cu.checksum),
579
+ fileAttributes: await q.receive(cu.fileAttributes),
580
+ statements: await q.receiveListDefined(cu.statements, stmt => this.visitRightPadded(stmt, q)),
581
+ eof: await q.receive(cu.eof, space => this.visitSpace(space, q))
582
+ };
583
+ return updateIfChanged(cu, updates);
586
584
  }
587
585
 
588
586
  override async visitAlias(alias: JS.Alias, q: RpcReceiveQueue): Promise<J | undefined> {
589
- const draft = createDraft(alias);
590
- draft.propertyName = await q.receive(draft.propertyName, el => this.visitRightPadded(el, q));
591
- draft.alias = await q.receive(draft.alias, el => this.visitDefined<Expression>(el, q));
592
- return finishDraft(draft);
587
+ const updates = {
588
+ propertyName: await q.receive(alias.propertyName, el => this.visitRightPadded(el, q)),
589
+ alias: await q.receive(alias.alias, el => this.visitDefined<Expression>(el, q))
590
+ };
591
+ return updateIfChanged(alias, updates);
593
592
  }
594
593
 
595
594
  override async visitArrowFunction(arrowFunction: JS.ArrowFunction, q: RpcReceiveQueue): Promise<J | undefined> {
596
- const draft = createDraft(arrowFunction);
597
- draft.leadingAnnotations = await q.receiveListDefined(draft.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q));
598
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
599
- draft.typeParameters = await q.receive(draft.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q));
600
- draft.lambda = await q.receive(draft.lambda, el => this.visitDefined<J.Lambda>(el, q));
601
- draft.returnTypeExpression = await q.receive(draft.returnTypeExpression, el => this.visitDefined<TypeTree>(el, q));
602
- return finishDraft(draft);
595
+ const updates = {
596
+ leadingAnnotations: await q.receiveListDefined(arrowFunction.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q)),
597
+ modifiers: await q.receiveListDefined(arrowFunction.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
598
+ typeParameters: await q.receive(arrowFunction.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q)),
599
+ lambda: await q.receive(arrowFunction.lambda, el => this.visitDefined<J.Lambda>(el, q)),
600
+ returnTypeExpression: await q.receive(arrowFunction.returnTypeExpression, el => this.visitDefined<TypeTree>(el, q))
601
+ };
602
+ return updateIfChanged(arrowFunction, updates);
603
603
  }
604
604
 
605
- override async visitAwait(await_: JS.Await, q: RpcReceiveQueue): Promise<J | undefined> {
606
- const draft = createDraft(await_);
607
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
608
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
609
- return finishDraft(draft);
605
+ override async visitAwait(anAwait: JS.Await, q: RpcReceiveQueue): Promise<J | undefined> {
606
+ const updates = {
607
+ expression: await q.receive(anAwait.expression, el => this.visitDefined<Expression>(el, q)),
608
+ type: await q.receive(anAwait.type, el => this.visitType(el, q))
609
+ };
610
+ return updateIfChanged(anAwait, updates);
610
611
  }
611
612
 
612
613
  override async visitConditionalType(conditionalType: JS.ConditionalType, q: RpcReceiveQueue): Promise<J | undefined> {
613
- const draft = createDraft(conditionalType);
614
- draft.checkType = await q.receive(draft.checkType, el => this.visitDefined<Expression>(el, q));
615
- draft.condition = await q.receive(draft.condition, el => this.visitLeftPadded(el, q));
616
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
617
- return finishDraft(draft);
614
+ const updates = {
615
+ checkType: await q.receive(conditionalType.checkType, el => this.visitDefined<Expression>(el, q)),
616
+ condition: await q.receive(conditionalType.condition, el => this.visitLeftPadded(el, q)),
617
+ type: await q.receive(conditionalType.type, el => this.visitType(el, q))
618
+ };
619
+ return updateIfChanged(conditionalType, updates);
618
620
  }
619
621
 
620
622
  override async visitDelete(delete_: JS.Delete, q: RpcReceiveQueue): Promise<J | undefined> {
621
- const draft = createDraft(delete_);
622
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
623
- return finishDraft(draft);
623
+ const updates = {
624
+ expression: await q.receive(delete_.expression, el => this.visitDefined<Expression>(el, q))
625
+ };
626
+ return updateIfChanged(delete_, updates);
624
627
  }
625
628
 
626
629
  override async visitExpressionStatement(expressionStatement: JS.ExpressionStatement, q: RpcReceiveQueue): Promise<J | undefined> {
627
- const draft = createDraft(expressionStatement);
628
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
629
- return finishDraft(draft);
630
+ const updates = {
631
+ expression: await q.receive(expressionStatement.expression, el => this.visitDefined<Expression>(el, q))
632
+ };
633
+ return updateIfChanged(expressionStatement, updates);
630
634
  }
631
635
 
632
636
  override async visitExpressionWithTypeArguments(expressionWithTypeArguments: JS.ExpressionWithTypeArguments, q: RpcReceiveQueue): Promise<J | undefined> {
633
- const draft = createDraft(expressionWithTypeArguments);
634
- draft.clazz = await q.receive(draft.clazz, el => this.visitDefined<J>(el, q));
635
- draft.typeArguments = await q.receive(draft.typeArguments, el => this.visitContainer(el, q));
636
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
637
- return finishDraft(draft);
637
+ const updates = {
638
+ clazz: await q.receive(expressionWithTypeArguments.clazz, el => this.visitDefined<J>(el, q)),
639
+ typeArguments: await q.receive(expressionWithTypeArguments.typeArguments, el => this.visitContainer(el, q)),
640
+ type: await q.receive(expressionWithTypeArguments.type, el => this.visitType(el, q))
641
+ };
642
+ return updateIfChanged(expressionWithTypeArguments, updates);
638
643
  }
639
644
 
640
645
  override async visitFunctionCall(functionCall: JS.FunctionCall, q: RpcReceiveQueue): Promise<J | undefined> {
641
- const draft = createDraft(functionCall);
642
-
643
- draft.function = await q.receive(functionCall.function, select => this.visitRightPadded(select, q));
644
- draft.typeParameters = await q.receive(functionCall.typeParameters, typeParams => this.visitContainer(typeParams, q));
645
- draft.arguments = await q.receive(functionCall.arguments, args => this.visitContainer(args, q));
646
- draft.methodType = await q.receive(functionCall.methodType, type => this.visitType(type, q) as unknown as Type.Method);
647
-
648
- return finishDraft(draft);
646
+ const updates = {
647
+ function: await q.receive(functionCall.function, select => this.visitRightPadded(select, q)),
648
+ typeParameters: await q.receive(functionCall.typeParameters, typeParams => this.visitContainer(typeParams, q)),
649
+ arguments: await q.receive(functionCall.arguments, args => this.visitContainer(args, q)),
650
+ methodType: await q.receive(functionCall.methodType, type => this.visitType(type, q) as unknown as Type.Method)
651
+ };
652
+ return updateIfChanged(functionCall, updates);
649
653
  }
650
654
 
651
655
  override async visitFunctionType(functionType: JS.FunctionType, q: RpcReceiveQueue): Promise<J | undefined> {
652
- const draft = createDraft(functionType);
653
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
654
- draft.constructorType = await q.receive(draft.constructorType, el => this.visitLeftPadded(el, q));
655
- draft.typeParameters = await q.receive(draft.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q));
656
- draft.parameters = await q.receive(draft.parameters, el => this.visitContainer(el, q));
657
- draft.returnType = await q.receive(draft.returnType, el => this.visitLeftPadded(el, q));
658
- return finishDraft(draft);
656
+ const updates = {
657
+ modifiers: await q.receiveListDefined(functionType.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
658
+ constructorType: await q.receive(functionType.constructorType, el => this.visitLeftPadded(el, q)),
659
+ typeParameters: await q.receive(functionType.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q)),
660
+ parameters: await q.receive(functionType.parameters, el => this.visitContainer(el, q)),
661
+ returnType: await q.receive(functionType.returnType, el => this.visitLeftPadded(el, q))
662
+ };
663
+ return updateIfChanged(functionType, updates);
659
664
  }
660
665
 
661
666
  override async visitInferType(inferType: JS.InferType, q: RpcReceiveQueue): Promise<J | undefined> {
662
- const draft = createDraft(inferType);
663
- draft.typeParameter = await q.receive(draft.typeParameter, el => this.visitLeftPadded(el, q));
664
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
665
- return finishDraft(draft);
667
+ const updates = {
668
+ typeParameter: await q.receive(inferType.typeParameter, el => this.visitLeftPadded(el, q)),
669
+ type: await q.receive(inferType.type, el => this.visitType(el, q))
670
+ };
671
+ return updateIfChanged(inferType, updates);
666
672
  }
667
673
 
668
674
  override async visitImportType(importType: JS.ImportType, q: RpcReceiveQueue): Promise<J | undefined> {
669
- const draft = createDraft(importType);
670
- draft.hasTypeof = await q.receive(draft.hasTypeof, el => this.visitRightPadded(el, q));
671
- draft.argumentAndAttributes = await q.receive(draft.argumentAndAttributes, el => this.visitContainer(el, q));
672
- draft.qualifier = await q.receive(draft.qualifier, el => this.visitLeftPadded(el, q));
673
- draft.typeArguments = await q.receive(draft.typeArguments, el => this.visitContainer(el, q));
674
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
675
- return finishDraft(draft);
675
+ const updates = {
676
+ hasTypeof: await q.receive(importType.hasTypeof, el => this.visitRightPadded(el, q)),
677
+ argumentAndAttributes: await q.receive(importType.argumentAndAttributes, el => this.visitContainer(el, q)),
678
+ qualifier: await q.receive(importType.qualifier, el => this.visitLeftPadded(el, q)),
679
+ typeArguments: await q.receive(importType.typeArguments, el => this.visitContainer(el, q)),
680
+ type: await q.receive(importType.type, el => this.visitType(el, q))
681
+ };
682
+ return updateIfChanged(importType, updates);
676
683
  }
677
684
 
678
685
  override async visitImportDeclaration(jsImport: JS.Import, q: RpcReceiveQueue): Promise<J | undefined> {
679
- const draft = createDraft(jsImport);
680
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
681
- draft.importClause = await q.receive(draft.importClause, el => this.visitDefined<JS.ImportClause>(el, q));
682
- draft.moduleSpecifier = await q.receive(draft.moduleSpecifier, el => this.visitLeftPadded(el, q));
683
- draft.attributes = await q.receive(draft.attributes, el => this.visitDefined<JS.ImportAttributes>(el, q));
684
- draft.initializer = await q.receive(draft.initializer, el => this.visitLeftPadded(el, q));
685
- return finishDraft(draft);
686
+ const updates = {
687
+ modifiers: await q.receiveListDefined(jsImport.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
688
+ importClause: await q.receive(jsImport.importClause, el => this.visitDefined<JS.ImportClause>(el, q)),
689
+ moduleSpecifier: await q.receive(jsImport.moduleSpecifier, el => this.visitLeftPadded(el, q)),
690
+ attributes: await q.receive(jsImport.attributes, el => this.visitDefined<JS.ImportAttributes>(el, q)),
691
+ initializer: await q.receive(jsImport.initializer, el => this.visitLeftPadded(el, q))
692
+ };
693
+ return updateIfChanged(jsImport, updates);
686
694
  }
687
695
 
688
696
  override async visitImportClause(jsImportClause: JS.ImportClause, q: RpcReceiveQueue): Promise<J | undefined> {
689
- const draft = createDraft(jsImportClause);
690
- draft.typeOnly = await q.receive(draft.typeOnly);
691
- draft.name = await q.receive(draft.name, el => this.visitRightPadded(el, q));
692
- draft.namedBindings = await q.receive(draft.namedBindings, el => this.visitDefined<Expression>(el, q));
693
- return finishDraft(draft);
697
+ const updates = {
698
+ typeOnly: await q.receive(jsImportClause.typeOnly),
699
+ name: await q.receive(jsImportClause.name, el => this.visitRightPadded(el, q)),
700
+ namedBindings: await q.receive(jsImportClause.namedBindings, el => this.visitDefined<Expression>(el, q))
701
+ };
702
+ return updateIfChanged(jsImportClause, updates);
694
703
  }
695
704
 
696
705
  override async visitNamedImports(namedImports: JS.NamedImports, q: RpcReceiveQueue): Promise<J | undefined> {
697
- const draft = createDraft(namedImports);
698
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
699
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
700
- return finishDraft(draft);
706
+ const updates = {
707
+ elements: await q.receive(namedImports.elements, el => this.visitContainer(el, q)),
708
+ type: await q.receive(namedImports.type, el => this.visitType(el, q))
709
+ };
710
+ return updateIfChanged(namedImports, updates);
701
711
  }
702
712
 
703
713
  override async visitImportSpecifier(jsImportSpecifier: JS.ImportSpecifier, q: RpcReceiveQueue): Promise<J | undefined> {
704
- const draft = createDraft(jsImportSpecifier);
705
- draft.importType = await q.receive(draft.importType, el => this.visitLeftPadded(el, q));
706
- draft.specifier = await q.receive(draft.specifier, el => this.visitDefined<JS.Alias | J.Identifier>(el, q));
707
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
708
- return finishDraft(draft);
714
+ const updates = {
715
+ importType: await q.receive(jsImportSpecifier.importType, el => this.visitLeftPadded(el, q)),
716
+ specifier: await q.receive(jsImportSpecifier.specifier, el => this.visitDefined<JS.Alias | J.Identifier>(el, q)),
717
+ type: await q.receive(jsImportSpecifier.type, el => this.visitType(el, q))
718
+ };
719
+ return updateIfChanged(jsImportSpecifier, updates);
709
720
  }
710
721
 
711
722
  override async visitImportAttributes(importAttributes: JS.ImportAttributes, q: RpcReceiveQueue): Promise<J | undefined> {
712
- const draft = createDraft(importAttributes);
713
- draft.token = await q.receive(draft.token);
714
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
715
- return finishDraft(draft);
723
+ const updates = {
724
+ token: await q.receive(importAttributes.token),
725
+ elements: await q.receive(importAttributes.elements, el => this.visitContainer(el, q))
726
+ };
727
+ return updateIfChanged(importAttributes, updates);
716
728
  }
717
729
 
718
730
  override async visitImportTypeAttributes(importTypeAttributes: JS.ImportTypeAttributes, q: RpcReceiveQueue): Promise<J | undefined> {
719
- const draft = createDraft(importTypeAttributes);
720
- draft.token = await q.receive(draft.token, el => this.visitRightPadded(el, q));
721
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
722
- draft.end = await q.receive(draft.end, el => this.visitSpace(el, q));
723
- return finishDraft(draft);
731
+ const updates = {
732
+ token: await q.receive(importTypeAttributes.token, el => this.visitRightPadded(el, q)),
733
+ elements: await q.receive(importTypeAttributes.elements, el => this.visitContainer(el, q)),
734
+ end: await q.receive(importTypeAttributes.end, el => this.visitSpace(el, q))
735
+ };
736
+ return updateIfChanged(importTypeAttributes, updates);
724
737
  }
725
738
 
726
739
  override async visitImportAttribute(importAttribute: JS.ImportAttribute, q: RpcReceiveQueue): Promise<J | undefined> {
727
- const draft = createDraft(importAttribute);
728
- draft.name = await q.receive(draft.name, el => this.visitDefined<Expression>(el, q));
729
- draft.value = await q.receive(draft.value, el => this.visitLeftPadded(el, q));
730
- return finishDraft(draft);
740
+ const updates = {
741
+ name: await q.receive(importAttribute.name, el => this.visitDefined<Expression>(el, q)),
742
+ value: await q.receive(importAttribute.value, el => this.visitLeftPadded(el, q))
743
+ };
744
+ return updateIfChanged(importAttribute, updates);
731
745
  }
732
746
 
733
747
  override async visitBinaryExtensions(binary: JS.Binary, q: RpcReceiveQueue): Promise<J | undefined> {
734
- const draft = createDraft(binary);
735
- draft.left = await q.receive(draft.left, el => this.visitDefined<Expression>(el, q));
736
- draft.operator = await q.receive(draft.operator, el => this.visitLeftPadded(el, q));
737
- draft.right = await q.receive(draft.right, el => this.visitDefined<Expression>(el, q));
738
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
739
- return finishDraft(draft);
748
+ const updates = {
749
+ left: await q.receive(binary.left, el => this.visitDefined<Expression>(el, q)),
750
+ operator: await q.receive(binary.operator, el => this.visitLeftPadded(el, q)),
751
+ right: await q.receive(binary.right, el => this.visitDefined<Expression>(el, q)),
752
+ type: await q.receive(binary.type, el => this.visitType(el, q))
753
+ };
754
+ return updateIfChanged(binary, updates);
740
755
  }
741
756
 
742
757
  override async visitLiteralType(literalType: JS.LiteralType, q: RpcReceiveQueue): Promise<J | undefined> {
743
- const draft = createDraft(literalType);
744
- draft.literal = await q.receive(draft.literal, el => this.visitDefined<Expression>(el, q));
745
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
746
- return finishDraft(draft);
758
+ const updates = {
759
+ literal: await q.receive(literalType.literal, el => this.visitDefined<Expression>(el, q)),
760
+ type: await q.receive(literalType.type, el => this.visitType(el, q))
761
+ };
762
+ return updateIfChanged(literalType, updates);
747
763
  }
748
764
 
749
765
  override async visitMappedType(mappedType: JS.MappedType, q: RpcReceiveQueue): Promise<J | undefined> {
750
- const draft = createDraft(mappedType);
751
- draft.prefixToken = await q.receive(draft.prefixToken, el => this.visitLeftPadded(el, q));
752
- draft.hasReadonly = await q.receive(draft.hasReadonly, el => this.visitLeftPadded(el, q));
753
- draft.keysRemapping = await q.receive(draft.keysRemapping, el => this.visitDefined<JS.MappedType.KeysRemapping>(el, q));
754
- draft.suffixToken = await q.receive(draft.suffixToken, el => this.visitLeftPadded(el, q));
755
- draft.hasQuestionToken = await q.receive(draft.hasQuestionToken, el => this.visitLeftPadded(el, q));
756
- draft.valueType = await q.receive(draft.valueType, el => this.visitContainer(el, q));
757
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
758
- return finishDraft(draft);
766
+ const updates = {
767
+ prefixToken: await q.receive(mappedType.prefixToken, el => this.visitLeftPadded(el, q)),
768
+ hasReadonly: await q.receive(mappedType.hasReadonly, el => this.visitLeftPadded(el, q)),
769
+ keysRemapping: await q.receive(mappedType.keysRemapping, el => this.visitDefined<JS.MappedType.KeysRemapping>(el, q)),
770
+ suffixToken: await q.receive(mappedType.suffixToken, el => this.visitLeftPadded(el, q)),
771
+ hasQuestionToken: await q.receive(mappedType.hasQuestionToken, el => this.visitLeftPadded(el, q)),
772
+ valueType: await q.receive(mappedType.valueType, el => this.visitContainer(el, q)),
773
+ type: await q.receive(mappedType.type, el => this.visitType(el, q))
774
+ };
775
+ return updateIfChanged(mappedType, updates);
759
776
  }
760
777
 
761
778
  override async visitMappedTypeKeysRemapping(keysRemapping: JS.MappedType.KeysRemapping, q: RpcReceiveQueue): Promise<J | undefined> {
762
- const draft = createDraft(keysRemapping);
763
- draft.typeParameter = await q.receive(draft.typeParameter, el => this.visitRightPadded(el, q));
764
- draft.nameType = await q.receive(draft.nameType, el => this.visitRightPadded(el, q));
765
- return finishDraft(draft);
779
+ const updates = {
780
+ typeParameter: await q.receive(keysRemapping.typeParameter, el => this.visitRightPadded(el, q)),
781
+ nameType: await q.receive(keysRemapping.nameType, el => this.visitRightPadded(el, q))
782
+ };
783
+ return updateIfChanged(keysRemapping, updates);
766
784
  }
767
785
 
768
786
  override async visitMappedTypeParameter(mappedTypeParameter: JS.MappedType.Parameter, q: RpcReceiveQueue): Promise<J | undefined> {
769
- const draft = createDraft(mappedTypeParameter);
770
- draft.name = await q.receive(draft.name, el => this.visitDefined<Expression>(el, q));
771
- draft.iterateType = await q.receive(draft.iterateType, el => this.visitLeftPadded(el, q));
772
- return finishDraft(draft);
787
+ const updates = {
788
+ name: await q.receive(mappedTypeParameter.name, el => this.visitDefined<Expression>(el, q)),
789
+ iterateType: await q.receive(mappedTypeParameter.iterateType, el => this.visitLeftPadded(el, q))
790
+ };
791
+ return updateIfChanged(mappedTypeParameter, updates);
773
792
  }
774
793
 
775
794
  override async visitObjectBindingPattern(objectBindingPattern: JS.ObjectBindingPattern, q: RpcReceiveQueue): Promise<J | undefined> {
776
- const draft = createDraft(objectBindingPattern);
777
- draft.leadingAnnotations = await q.receiveListDefined(draft.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q));
778
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
779
- draft.typeExpression = await q.receive(draft.typeExpression, el => this.visitDefined<TypeTree>(el, q));
780
- draft.bindings = await q.receive(draft.bindings, el => this.visitContainer(el, q));
781
- draft.initializer = await q.receive(draft.initializer, el => this.visitLeftPadded(el, q));
782
- return finishDraft(draft);
795
+ const updates = {
796
+ leadingAnnotations: await q.receiveListDefined(objectBindingPattern.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q)),
797
+ modifiers: await q.receiveListDefined(objectBindingPattern.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
798
+ typeExpression: await q.receive(objectBindingPattern.typeExpression, el => this.visitDefined<TypeTree>(el, q)),
799
+ bindings: await q.receive(objectBindingPattern.bindings, el => this.visitContainer(el, q)),
800
+ initializer: await q.receive(objectBindingPattern.initializer, el => this.visitLeftPadded(el, q))
801
+ };
802
+ return updateIfChanged(objectBindingPattern, updates);
783
803
  }
784
804
 
785
805
  override async visitPropertyAssignment(propertyAssignment: JS.PropertyAssignment, q: RpcReceiveQueue): Promise<J | undefined> {
786
- const draft = createDraft(propertyAssignment);
787
- draft.name = await q.receive(draft.name, el => this.visitRightPadded(el, q));
788
- draft.assigmentToken = await q.receive(draft.assigmentToken);
789
- draft.initializer = await q.receive(draft.initializer, el => this.visitDefined<Expression>(el, q));
790
- return finishDraft(draft);
806
+ const updates = {
807
+ name: await q.receive(propertyAssignment.name, el => this.visitRightPadded(el, q)),
808
+ assigmentToken: await q.receive(propertyAssignment.assigmentToken),
809
+ initializer: await q.receive(propertyAssignment.initializer, el => this.visitDefined<Expression>(el, q))
810
+ };
811
+ return updateIfChanged(propertyAssignment, updates);
791
812
  }
792
813
 
793
814
  override async visitSatisfiesExpression(satisfiesExpression: JS.SatisfiesExpression, q: RpcReceiveQueue): Promise<J | undefined> {
794
- const draft = createDraft(satisfiesExpression);
795
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<J>(el, q));
796
- draft.satisfiesType = await q.receive(draft.satisfiesType, el => this.visitLeftPadded(el, q));
797
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
798
- return finishDraft(draft);
815
+ const updates = {
816
+ expression: await q.receive(satisfiesExpression.expression, el => this.visitDefined<J>(el, q)),
817
+ satisfiesType: await q.receive(satisfiesExpression.satisfiesType, el => this.visitLeftPadded(el, q)),
818
+ type: await q.receive(satisfiesExpression.type, el => this.visitType(el, q))
819
+ };
820
+ return updateIfChanged(satisfiesExpression, updates);
799
821
  }
800
822
 
801
823
  override async visitScopedVariableDeclarations(scopedVariableDeclarations: JS.ScopedVariableDeclarations, q: RpcReceiveQueue): Promise<J | undefined> {
802
- const draft = createDraft(scopedVariableDeclarations);
803
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
804
- draft.variables = await q.receiveListDefined(draft.variables, el => this.visitRightPadded(el, q));
805
- return finishDraft(draft);
824
+ const updates = {
825
+ modifiers: await q.receiveListDefined(scopedVariableDeclarations.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
826
+ variables: await q.receiveListDefined(scopedVariableDeclarations.variables, el => this.visitRightPadded(el, q))
827
+ };
828
+ return updateIfChanged(scopedVariableDeclarations, updates);
806
829
  }
807
830
 
808
831
  override async visitStatementExpression(statementExpression: JS.StatementExpression, q: RpcReceiveQueue): Promise<J | undefined> {
809
- const draft = createDraft(statementExpression);
810
- draft.statement = await q.receive(draft.statement, el => this.visitDefined<Statement>(el, q));
811
- return finishDraft(draft);
832
+ const updates = {
833
+ statement: await q.receive(statementExpression.statement, el => this.visitDefined<Statement>(el, q))
834
+ };
835
+ return updateIfChanged(statementExpression, updates);
812
836
  }
813
837
 
814
838
  override async visitTaggedTemplateExpression(taggedTemplateExpression: JS.TaggedTemplateExpression, q: RpcReceiveQueue): Promise<J | undefined> {
815
- const draft = createDraft(taggedTemplateExpression);
816
- draft.tag = await q.receive(draft.tag, el => this.visitRightPadded(el, q));
817
- draft.typeArguments = await q.receive(draft.typeArguments, el => this.visitContainer(el, q));
818
- draft.templateExpression = await q.receive(draft.templateExpression, el => this.visitDefined<Expression>(el, q));
819
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
820
- return finishDraft(draft);
839
+ const updates = {
840
+ tag: await q.receive(taggedTemplateExpression.tag, el => this.visitRightPadded(el, q)),
841
+ typeArguments: await q.receive(taggedTemplateExpression.typeArguments, el => this.visitContainer(el, q)),
842
+ templateExpression: await q.receive(taggedTemplateExpression.templateExpression, el => this.visitDefined<Expression>(el, q)),
843
+ type: await q.receive(taggedTemplateExpression.type, el => this.visitType(el, q))
844
+ };
845
+ return updateIfChanged(taggedTemplateExpression, updates);
821
846
  }
822
847
 
823
848
  override async visitTemplateExpression(templateExpression: JS.TemplateExpression, q: RpcReceiveQueue): Promise<J | undefined> {
824
- const draft = createDraft(templateExpression);
825
- draft.head = await q.receive(draft.head, el => this.visitDefined<J.Literal>(el, q));
826
- draft.spans = await q.receiveListDefined(draft.spans, el => this.visitRightPadded(el, q));
827
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
828
- return finishDraft(draft);
849
+ const updates = {
850
+ head: await q.receive(templateExpression.head, el => this.visitDefined<J.Literal>(el, q)),
851
+ spans: await q.receiveListDefined(templateExpression.spans, el => this.visitRightPadded(el, q)),
852
+ type: await q.receive(templateExpression.type, el => this.visitType(el, q))
853
+ };
854
+ return updateIfChanged(templateExpression, updates);
829
855
  }
830
856
 
831
857
  override async visitTemplateExpressionSpan(span: JS.TemplateExpression.Span, q: RpcReceiveQueue): Promise<J | undefined> {
832
- const draft = createDraft(span);
833
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<J>(el, q));
834
- draft.tail = await q.receive(draft.tail, el => this.visitDefined<J.Literal>(el, q));
835
- return finishDraft(draft);
858
+ const updates = {
859
+ expression: await q.receive(span.expression, el => this.visitDefined<J>(el, q)),
860
+ tail: await q.receive(span.tail, el => this.visitDefined<J.Literal>(el, q))
861
+ };
862
+ return updateIfChanged(span, updates);
836
863
  }
837
864
 
838
865
  override async visitTuple(tuple: JS.Tuple, q: RpcReceiveQueue): Promise<J | undefined> {
839
- const draft = createDraft(tuple);
840
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
841
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
842
- return finishDraft(draft);
866
+ const updates = {
867
+ elements: await q.receive(tuple.elements, el => this.visitContainer(el, q)),
868
+ type: await q.receive(tuple.type, el => this.visitType(el, q))
869
+ };
870
+ return updateIfChanged(tuple, updates);
843
871
  }
844
872
 
845
873
  override async visitTypeDeclaration(typeDeclaration: JS.TypeDeclaration, q: RpcReceiveQueue): Promise<J | undefined> {
846
- const draft = createDraft(typeDeclaration);
847
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
848
- draft.name = await q.receive(draft.name, el => this.visitLeftPadded(el, q));
849
- draft.typeParameters = await q.receive(draft.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q));
850
- draft.initializer = await q.receive(draft.initializer, el => this.visitLeftPadded(el, q));
851
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
852
- return finishDraft(draft);
874
+ const updates = {
875
+ modifiers: await q.receiveListDefined(typeDeclaration.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
876
+ name: await q.receive(typeDeclaration.name, el => this.visitLeftPadded(el, q)),
877
+ typeParameters: await q.receive(typeDeclaration.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q)),
878
+ initializer: await q.receive(typeDeclaration.initializer, el => this.visitLeftPadded(el, q)),
879
+ type: await q.receive(typeDeclaration.type, el => this.visitType(el, q))
880
+ };
881
+ return updateIfChanged(typeDeclaration, updates);
853
882
  }
854
883
 
855
884
  override async visitTypeOf(typeOf: JS.TypeOf, q: RpcReceiveQueue): Promise<J | undefined> {
856
- const draft = createDraft(typeOf);
857
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
858
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
859
- return finishDraft(draft);
885
+ const updates = {
886
+ expression: await q.receive(typeOf.expression, el => this.visitDefined<Expression>(el, q)),
887
+ type: await q.receive(typeOf.type, el => this.visitType(el, q))
888
+ };
889
+ return updateIfChanged(typeOf, updates);
860
890
  }
861
891
 
862
892
  override async visitTypeTreeExpression(typeTreeExpression: JS.TypeTreeExpression, q: RpcReceiveQueue): Promise<J | undefined> {
863
- const draft = createDraft(typeTreeExpression);
864
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
865
- return finishDraft(draft);
893
+ const updates = {
894
+ expression: await q.receive(typeTreeExpression.expression, el => this.visitDefined<Expression>(el, q))
895
+ };
896
+ return updateIfChanged(typeTreeExpression, updates);
866
897
  }
867
898
 
868
899
  override async visitAs(as_: JS.As, q: RpcReceiveQueue): Promise<J | undefined> {
869
- const draft = createDraft(as_);
870
- draft.left = await q.receive(draft.left, el => this.visitRightPadded<Expression>(el, q));
871
- draft.right = await q.receive(draft.right, el => this.visitDefined<Expression>(el, q));
872
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
873
- return finishDraft(draft);
900
+ const updates = {
901
+ left: await q.receive(as_.left, el => this.visitRightPadded<Expression>(el, q)),
902
+ right: await q.receive(as_.right, el => this.visitDefined<Expression>(el, q)),
903
+ type: await q.receive(as_.type, el => this.visitType(el, q))
904
+ };
905
+ return updateIfChanged(as_, updates);
874
906
  }
875
907
 
876
908
  override async visitAssignmentOperationExtensions(assignmentOperation: JS.AssignmentOperation, q: RpcReceiveQueue): Promise<J | undefined> {
877
- const draft = createDraft(assignmentOperation);
878
- draft.variable = await q.receive(draft.variable, el => this.visitDefined<Expression>(el, q));
879
- draft.operator = await q.receive(draft.operator, el => this.visitLeftPadded(el, q));
880
- draft.assignment = await q.receive(draft.assignment, el => this.visitDefined<Expression>(el, q));
881
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
882
- return finishDraft(draft);
909
+ const updates = {
910
+ variable: await q.receive(assignmentOperation.variable, el => this.visitDefined<Expression>(el, q)),
911
+ operator: await q.receive(assignmentOperation.operator, el => this.visitLeftPadded(el, q)),
912
+ assignment: await q.receive(assignmentOperation.assignment, el => this.visitDefined<Expression>(el, q)),
913
+ type: await q.receive(assignmentOperation.type, el => this.visitType(el, q))
914
+ };
915
+ return updateIfChanged(assignmentOperation, updates);
883
916
  }
884
917
 
885
918
  override async visitIndexedAccessType(indexedAccessType: JS.IndexedAccessType, q: RpcReceiveQueue): Promise<J | undefined> {
886
- const draft = createDraft(indexedAccessType);
887
- draft.objectType = await q.receive(draft.objectType, el => this.visitDefined<TypeTree>(el, q));
888
- draft.indexType = await q.receive(draft.indexType, el => this.visitDefined<TypeTree>(el, q));
889
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
890
- return finishDraft(draft);
919
+ const updates = {
920
+ objectType: await q.receive(indexedAccessType.objectType, el => this.visitDefined<TypeTree>(el, q)),
921
+ indexType: await q.receive(indexedAccessType.indexType, el => this.visitDefined<TypeTree>(el, q)),
922
+ type: await q.receive(indexedAccessType.type, el => this.visitType(el, q))
923
+ };
924
+ return updateIfChanged(indexedAccessType, updates);
891
925
  }
892
926
 
893
927
  override async visitIndexedAccessTypeIndexType(indexType: JS.IndexedAccessType.IndexType, q: RpcReceiveQueue): Promise<J | undefined> {
894
- const draft = createDraft(indexType);
895
- draft.element = await q.receive(draft.element, el => this.visitRightPadded(el, q));
896
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
897
- return finishDraft(draft);
928
+ const updates = {
929
+ element: await q.receive(indexType.element, el => this.visitRightPadded(el, q)),
930
+ type: await q.receive(indexType.type, el => this.visitType(el, q))
931
+ };
932
+ return updateIfChanged(indexType, updates);
898
933
  }
899
934
 
900
935
  override async visitTypeQuery(typeQuery: JS.TypeQuery, q: RpcReceiveQueue): Promise<J | undefined> {
901
- const draft = createDraft(typeQuery);
902
- draft.typeExpression = await q.receive(draft.typeExpression, el => this.visitDefined<TypeTree>(el, q));
903
- draft.typeArguments = await q.receive(draft.typeArguments, el => this.visitContainer(el, q));
904
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
905
- return finishDraft(draft);
936
+ const updates = {
937
+ typeExpression: await q.receive(typeQuery.typeExpression, el => this.visitDefined<TypeTree>(el, q)),
938
+ typeArguments: await q.receive(typeQuery.typeArguments, el => this.visitContainer(el, q)),
939
+ type: await q.receive(typeQuery.type, el => this.visitType(el, q))
940
+ };
941
+ return updateIfChanged(typeQuery, updates);
906
942
  }
907
943
 
908
944
  override async visitTypeInfo(typeInfo: JS.TypeInfo, q: RpcReceiveQueue): Promise<J | undefined> {
909
- const draft = createDraft(typeInfo);
910
- draft.typeIdentifier = await q.receive(draft.typeIdentifier, el => this.visitDefined<TypeTree>(el, q));
911
- return finishDraft(draft);
945
+ const updates = {
946
+ typeIdentifier: await q.receive(typeInfo.typeIdentifier, el => this.visitDefined<TypeTree>(el, q))
947
+ };
948
+ return updateIfChanged(typeInfo, updates);
912
949
  }
913
950
 
914
951
  override async visitComputedPropertyName(computedPropertyName: JS.ComputedPropertyName, q: RpcReceiveQueue): Promise<J | undefined> {
915
- const draft = createDraft(computedPropertyName);
916
- draft.expression = await q.receive(draft.expression, el => this.visitRightPadded(el, q));
917
- return finishDraft(draft);
952
+ const updates = {
953
+ expression: await q.receive(computedPropertyName.expression, el => this.visitRightPadded(el, q))
954
+ };
955
+ return updateIfChanged(computedPropertyName, updates);
918
956
  }
919
957
 
920
958
  override async visitTypeOperator(typeOperator: JS.TypeOperator, q: RpcReceiveQueue): Promise<J | undefined> {
921
- const draft = createDraft(typeOperator);
922
- draft.operator = await q.receive(draft.operator);
923
- draft.expression = await q.receive(draft.expression, el => this.visitLeftPadded(el, q));
924
- return finishDraft(draft);
959
+ const updates = {
960
+ operator: await q.receive(typeOperator.operator),
961
+ expression: await q.receive(typeOperator.expression, el => this.visitLeftPadded(el, q))
962
+ };
963
+ return updateIfChanged(typeOperator, updates);
925
964
  }
926
965
 
927
966
  override async visitTypePredicate(typePredicate: JS.TypePredicate, q: RpcReceiveQueue): Promise<J | undefined> {
928
- const draft = createDraft(typePredicate);
929
- draft.asserts = await q.receive(draft.asserts, el => this.visitLeftPadded(el, q));
930
- draft.parameterName = await q.receive(draft.parameterName, el => this.visitDefined<J.Identifier>(el, q));
931
- draft.expression = await q.receive(draft.expression, el => this.visitLeftPadded(el, q));
932
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
933
- return finishDraft(draft);
967
+ const updates = {
968
+ asserts: await q.receive(typePredicate.asserts, el => this.visitLeftPadded(el, q)),
969
+ parameterName: await q.receive(typePredicate.parameterName, el => this.visitDefined<J.Identifier>(el, q)),
970
+ expression: await q.receive(typePredicate.expression, el => this.visitLeftPadded(el, q)),
971
+ type: await q.receive(typePredicate.type, el => this.visitType(el, q))
972
+ };
973
+ return updateIfChanged(typePredicate, updates);
934
974
  }
935
975
 
936
976
  override async visitUnion(union: JS.Union, q: RpcReceiveQueue): Promise<J | undefined> {
937
- const draft = createDraft(union);
938
- draft.types = await q.receiveListDefined(draft.types, el => this.visitRightPadded(el, q));
939
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
940
- return finishDraft(draft);
977
+ const updates = {
978
+ types: await q.receiveListDefined(union.types, el => this.visitRightPadded(el, q)),
979
+ type: await q.receive(union.type, el => this.visitType(el, q))
980
+ };
981
+ return updateIfChanged(union, updates);
941
982
  }
942
983
 
943
984
  override async visitIntersection(intersection: JS.Intersection, q: RpcReceiveQueue): Promise<J | undefined> {
944
- const draft = createDraft(intersection);
945
- draft.types = await q.receiveListDefined(draft.types, el => this.visitRightPadded(el, q));
946
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
947
- return finishDraft(draft);
985
+ const updates = {
986
+ types: await q.receiveListDefined(intersection.types, el => this.visitRightPadded(el, q)),
987
+ type: await q.receive(intersection.type, el => this.visitType(el, q))
988
+ };
989
+ return updateIfChanged(intersection, updates);
948
990
  }
949
991
 
950
992
  override async visitVoid(void_: JS.Void, q: RpcReceiveQueue): Promise<J | undefined> {
951
- const draft = createDraft(void_);
952
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<Expression>(el, q));
953
- return finishDraft(draft);
993
+ const updates = {
994
+ expression: await q.receive(void_.expression, el => this.visitDefined<Expression>(el, q))
995
+ };
996
+ return updateIfChanged(void_, updates);
954
997
  }
955
998
 
956
999
  override async visitWithStatement(withStatement: JS.WithStatement, q: RpcReceiveQueue): Promise<J | undefined> {
957
- const draft = createDraft(withStatement);
958
- draft.expression = await q.receive(draft.expression, el => this.visitDefined<J.ControlParentheses<Expression>>(el, q));
959
- draft.body = await q.receive(draft.body, el => this.visitRightPadded(el, q));
960
- return finishDraft(draft);
1000
+ const updates = {
1001
+ expression: await q.receive(withStatement.expression, el => this.visitDefined<J.ControlParentheses<Expression>>(el, q)),
1002
+ body: await q.receive(withStatement.body, el => this.visitRightPadded(el, q))
1003
+ };
1004
+ return updateIfChanged(withStatement, updates);
961
1005
  }
962
1006
 
963
1007
  override async visitJsxTag(tag: JSX.Tag, q: RpcReceiveQueue): Promise<J | undefined> {
964
- const draft = createDraft(tag);
965
- draft.openName = await q.receive(draft.openName, el => this.visitLeftPadded(el, q));
966
- draft.typeArguments = await q.receive(draft.typeArguments, el => this.visitContainer(el, q));
967
- draft.afterName = await q.receive(draft.afterName, space => this.visitSpace(space, q));
968
- draft.attributes = await q.receiveListDefined(draft.attributes, attr => this.visitRightPadded(attr, q));
969
-
970
- draft.selfClosing = await q.receive(draft.selfClosing, space => this.visitSpace(space, q));
971
- draft.children = await q.receiveListDefined(draft.children, child => this.visit(child, q));
972
- draft.closingName = await q.receive(draft.closingName, el => this.visitLeftPadded(el, q));
973
- draft.afterClosingName = await q.receive(draft.afterClosingName, el => this.visitSpace(el, q));
974
-
975
- return finishDraft(draft);
1008
+ if ('selfClosing' in tag) {
1009
+ // Self-closing tag
1010
+ const updates = {
1011
+ openName: await q.receive(tag.openName, el => this.visitLeftPadded(el, q)),
1012
+ typeArguments: await q.receive(tag.typeArguments, el => this.visitContainer(el, q)),
1013
+ afterName: await q.receive(tag.afterName, space => this.visitSpace(space, q)),
1014
+ attributes: await q.receiveListDefined(tag.attributes, attr => this.visitRightPadded(attr, q)),
1015
+ selfClosing: await q.receive(tag.selfClosing, space => this.visitSpace(space, q))
1016
+ };
1017
+ return updateIfChanged(tag, updates);
1018
+ } else {
1019
+ // Tag with children
1020
+ const updates = {
1021
+ openName: await q.receive(tag.openName, el => this.visitLeftPadded(el, q)),
1022
+ typeArguments: await q.receive(tag.typeArguments, el => this.visitContainer(el, q)),
1023
+ afterName: await q.receive(tag.afterName, space => this.visitSpace(space, q)),
1024
+ attributes: await q.receiveListDefined(tag.attributes, attr => this.visitRightPadded(attr, q)),
1025
+ children: await q.receiveListDefined(tag.children, child => this.visit(child, q)),
1026
+ closingName: await q.receive(tag.closingName, el => this.visitLeftPadded(el, q)),
1027
+ afterClosingName: await q.receive(tag.afterClosingName, el => this.visitSpace(el, q))
1028
+ };
1029
+ return updateIfChanged(tag, updates);
1030
+ }
976
1031
  }
977
1032
 
978
1033
  override async visitJsxAttribute(attribute: JSX.Attribute, q: RpcReceiveQueue): Promise<J | undefined> {
979
- const draft = createDraft(attribute);
980
- draft.key = await q.receive(draft.key, el => this.visitDefined<J.Identifier | JSX.NamespacedName>(el, q));
981
- draft.value = await q.receive(draft.value, el => this.visitLeftPadded(el, q));
982
- return finishDraft(draft);
1034
+ const updates = {
1035
+ key: await q.receive(attribute.key, el => this.visitDefined<J.Identifier | JSX.NamespacedName>(el, q)),
1036
+ value: await q.receive(attribute.value, el => this.visitLeftPadded(el, q))
1037
+ };
1038
+ return updateIfChanged(attribute, updates);
983
1039
  }
984
1040
 
985
1041
  override async visitJsxSpreadAttribute(spreadAttribute: JSX.SpreadAttribute, q: RpcReceiveQueue): Promise<J | undefined> {
986
- const draft = createDraft(spreadAttribute);
987
- draft.dots = await q.receive(draft.dots, space => this.visitSpace(space, q));
988
- draft.expression = await q.receive(draft.expression, el => this.visitRightPadded(el, q));
989
- return finishDraft(draft);
1042
+ const updates = {
1043
+ dots: await q.receive(spreadAttribute.dots, space => this.visitSpace(space, q)),
1044
+ expression: await q.receive(spreadAttribute.expression, el => this.visitRightPadded(el, q))
1045
+ };
1046
+ return updateIfChanged(spreadAttribute, updates);
990
1047
  }
991
1048
 
992
1049
  override async visitJsxEmbeddedExpression(embeddedExpression: JSX.EmbeddedExpression, q: RpcReceiveQueue): Promise<J | undefined> {
993
- const draft = createDraft(embeddedExpression);
994
- draft.expression = await q.receive(draft.expression, el => this.visitRightPadded(el, q));
995
- return finishDraft(draft);
1050
+ const updates = {
1051
+ expression: await q.receive(embeddedExpression.expression, el => this.visitRightPadded(el, q))
1052
+ };
1053
+ return updateIfChanged(embeddedExpression, updates);
996
1054
  }
997
1055
 
998
1056
  override async visitJsxNamespacedName(namespacedName: JSX.NamespacedName, q: RpcReceiveQueue): Promise<J | undefined> {
999
- const draft = createDraft(namespacedName);
1000
- draft.namespace = await q.receive(draft.namespace, el => this.visitDefined<J.Identifier>(el, q));
1001
- draft.name = await q.receive(draft.name, el => this.visitLeftPadded(el, q));
1002
- return finishDraft(draft);
1057
+ const updates = {
1058
+ namespace: await q.receive(namespacedName.namespace, el => this.visitDefined<J.Identifier>(el, q)),
1059
+ name: await q.receive(namespacedName.name, el => this.visitLeftPadded(el, q))
1060
+ };
1061
+ return updateIfChanged(namespacedName, updates);
1003
1062
  }
1004
1063
 
1005
1064
  override async visitIndexSignatureDeclaration(indexSignatureDeclaration: JS.IndexSignatureDeclaration, q: RpcReceiveQueue): Promise<J | undefined> {
1006
- const draft = createDraft(indexSignatureDeclaration);
1007
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
1008
- draft.parameters = await q.receive(draft.parameters, el => this.visitContainer(el, q));
1009
- draft.typeExpression = await q.receive(draft.typeExpression, el => this.visitLeftPadded(el, q));
1010
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
1011
- return finishDraft(draft);
1065
+ const updates = {
1066
+ modifiers: await q.receiveListDefined(indexSignatureDeclaration.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
1067
+ parameters: await q.receive(indexSignatureDeclaration.parameters, el => this.visitContainer(el, q)),
1068
+ typeExpression: await q.receive(indexSignatureDeclaration.typeExpression, el => this.visitLeftPadded(el, q)),
1069
+ type: await q.receive(indexSignatureDeclaration.type, el => this.visitType(el, q))
1070
+ };
1071
+ return updateIfChanged(indexSignatureDeclaration, updates);
1012
1072
  }
1013
1073
 
1014
1074
  override async visitComputedPropertyMethodDeclaration(computedPropMethod: JS.ComputedPropertyMethodDeclaration, q: RpcReceiveQueue): Promise<J | undefined> {
1015
- const draft = createDraft(computedPropMethod);
1016
- draft.leadingAnnotations = await q.receiveListDefined(draft.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q));
1017
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
1018
- draft.typeParameters = await q.receive(draft.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q));
1019
- draft.returnTypeExpression = await q.receive(draft.returnTypeExpression, el => this.visitDefined<TypeTree>(el, q));
1020
- draft.name = await q.receive(draft.name, el => this.visitDefined<ComputedPropertyName>(el, q));
1021
- draft.parameters = await q.receive(draft.parameters, el => this.visitContainer(el, q));
1022
- draft.body = await q.receive(draft.body, el => this.visitDefined<J.Block>(el, q));
1023
- draft.methodType = await q.receive(draft.methodType, el => this.visitType(el, q) as any as Type.Method);
1024
- return finishDraft(draft);
1075
+ const updates = {
1076
+ leadingAnnotations: await q.receiveListDefined(computedPropMethod.leadingAnnotations, el => this.visitDefined<J.Annotation>(el, q)),
1077
+ modifiers: await q.receiveListDefined(computedPropMethod.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
1078
+ typeParameters: await q.receive(computedPropMethod.typeParameters, el => this.visitDefined<J.TypeParameters>(el, q)),
1079
+ returnTypeExpression: await q.receive(computedPropMethod.returnTypeExpression, el => this.visitDefined<TypeTree>(el, q)),
1080
+ name: await q.receive(computedPropMethod.name, el => this.visitDefined<ComputedPropertyName>(el, q)),
1081
+ parameters: await q.receive(computedPropMethod.parameters, el => this.visitContainer(el, q)),
1082
+ body: await q.receive(computedPropMethod.body, el => this.visitDefined<J.Block>(el, q)),
1083
+ methodType: await q.receive(computedPropMethod.methodType, el => this.visitType(el, q) as any as Type.Method)
1084
+ };
1085
+ return updateIfChanged(computedPropMethod, updates);
1025
1086
  }
1026
1087
 
1027
1088
  override async visitForOfLoop(forOfLoop: JS.ForOfLoop, q: RpcReceiveQueue): Promise<J | undefined> {
1028
- const draft = createDraft(forOfLoop);
1029
- draft.await = await q.receive(draft.await, space => this.visitSpace(space, q));
1030
- draft.loop = await q.receive(draft.loop, el => this.visitDefined<J.ForEachLoop>(el, q));
1031
- return finishDraft(draft);
1089
+ const updates = {
1090
+ await: await q.receive(forOfLoop.await, space => this.visitSpace(space, q)),
1091
+ loop: await q.receive(forOfLoop.loop, el => this.visitDefined<J.ForEachLoop>(el, q))
1092
+ };
1093
+ return updateIfChanged(forOfLoop, updates);
1032
1094
  }
1033
1095
 
1034
1096
  override async visitForInLoop(forInLoop: JS.ForInLoop, q: RpcReceiveQueue): Promise<J | undefined> {
1035
- const draft = createDraft(forInLoop);
1036
- draft.control = await q.receive(draft.control, el => this.visitDefined<JS.ForInLoop.Control>(el, q));
1037
- draft.body = await q.receive(draft.body, el => this.visitRightPadded(el, q));
1038
- return finishDraft(draft);
1097
+ const updates = {
1098
+ control: await q.receive(forInLoop.control, el => this.visitDefined<JS.ForInLoop.Control>(el, q)),
1099
+ body: await q.receive(forInLoop.body, el => this.visitRightPadded(el, q))
1100
+ };
1101
+ return updateIfChanged(forInLoop, updates);
1039
1102
  }
1040
1103
 
1041
1104
  override async visitNamespaceDeclaration(namespaceDeclaration: JS.NamespaceDeclaration, q: RpcReceiveQueue): Promise<J | undefined> {
1042
- const draft = createDraft(namespaceDeclaration);
1043
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
1044
- draft.keywordType = await q.receive(draft.keywordType, el => this.visitLeftPadded(el, q));
1045
- draft.name = await q.receive(draft.name, el => this.visitRightPadded(el, q));
1046
- draft.body = await q.receive(draft.body, el => this.visitDefined<J.Block>(el, q));
1047
- return finishDraft(draft);
1105
+ const updates = {
1106
+ modifiers: await q.receiveListDefined(namespaceDeclaration.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
1107
+ keywordType: await q.receive(namespaceDeclaration.keywordType, el => this.visitLeftPadded(el, q)),
1108
+ name: await q.receive(namespaceDeclaration.name, el => this.visitRightPadded(el, q)),
1109
+ body: await q.receive(namespaceDeclaration.body, el => this.visitDefined<J.Block>(el, q))
1110
+ };
1111
+ return updateIfChanged(namespaceDeclaration, updates);
1048
1112
  }
1049
1113
 
1050
1114
  override async visitTypeLiteral(typeLiteral: JS.TypeLiteral, q: RpcReceiveQueue): Promise<J | undefined> {
1051
- const draft = createDraft(typeLiteral);
1052
- draft.members = await q.receive(draft.members, el => this.visitDefined<J.Block>(el, q));
1053
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
1054
- return finishDraft(draft);
1115
+ const updates = {
1116
+ members: await q.receive(typeLiteral.members, el => this.visitDefined<J.Block>(el, q)),
1117
+ type: await q.receive(typeLiteral.type, el => this.visitType(el, q))
1118
+ };
1119
+ return updateIfChanged(typeLiteral, updates);
1055
1120
  }
1056
1121
 
1057
1122
  override async visitArrayBindingPattern(arrayBindingPattern: JS.ArrayBindingPattern, q: RpcReceiveQueue): Promise<J | undefined> {
1058
- const draft = createDraft(arrayBindingPattern);
1059
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
1060
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
1061
- return finishDraft(draft);
1123
+ const updates = {
1124
+ elements: await q.receive(arrayBindingPattern.elements, el => this.visitContainer(el, q)),
1125
+ type: await q.receive(arrayBindingPattern.type, el => this.visitType(el, q))
1126
+ };
1127
+ return updateIfChanged(arrayBindingPattern, updates);
1062
1128
  }
1063
1129
 
1064
1130
  override async visitBindingElement(bindingElement: JS.BindingElement, q: RpcReceiveQueue): Promise<J | undefined> {
1065
- const draft = createDraft(bindingElement);
1066
- draft.propertyName = await q.receive(draft.propertyName, el => this.visitRightPadded(el, q));
1067
- draft.name = await q.receive(draft.name, el => this.visitDefined<TypedTree>(el, q));
1068
- draft.initializer = await q.receive(draft.initializer, el => this.visitLeftPadded(el, q));
1069
- draft.variableType = await q.receive(draft.variableType, el => this.visitType(el, q) as any as Type.Variable);
1070
- return finishDraft(draft);
1131
+ const updates = {
1132
+ propertyName: await q.receive(bindingElement.propertyName, el => this.visitRightPadded(el, q)),
1133
+ name: await q.receive(bindingElement.name, el => this.visitDefined<TypedTree>(el, q)),
1134
+ initializer: await q.receive(bindingElement.initializer, el => this.visitLeftPadded(el, q)),
1135
+ variableType: await q.receive(bindingElement.variableType, el => this.visitType(el, q) as any as Type.Variable)
1136
+ };
1137
+ return updateIfChanged(bindingElement, updates);
1071
1138
  }
1072
1139
 
1073
1140
  override async visitExportDeclaration(exportDeclaration: JS.ExportDeclaration, q: RpcReceiveQueue): Promise<J | undefined> {
1074
- const draft = createDraft(exportDeclaration);
1075
- draft.modifiers = await q.receiveListDefined(draft.modifiers, el => this.visitDefined<J.Modifier>(el, q));
1076
- draft.typeOnly = await q.receive(draft.typeOnly, el => this.visitLeftPadded(el, q));
1077
- draft.exportClause = await q.receive(draft.exportClause, el => this.visitDefined<Expression>(el, q));
1078
- draft.moduleSpecifier = await q.receive(draft.moduleSpecifier, el => this.visitLeftPadded(el, q));
1079
- draft.attributes = await q.receive(draft.attributes, el => this.visitDefined<JS.ImportAttributes>(el, q));
1080
- return finishDraft(draft);
1141
+ const updates = {
1142
+ modifiers: await q.receiveListDefined(exportDeclaration.modifiers, el => this.visitDefined<J.Modifier>(el, q)),
1143
+ typeOnly: await q.receive(exportDeclaration.typeOnly, el => this.visitLeftPadded(el, q)),
1144
+ exportClause: await q.receive(exportDeclaration.exportClause, el => this.visitDefined<Expression>(el, q)),
1145
+ moduleSpecifier: await q.receive(exportDeclaration.moduleSpecifier, el => this.visitLeftPadded(el, q)),
1146
+ attributes: await q.receive(exportDeclaration.attributes, el => this.visitDefined<JS.ImportAttributes>(el, q))
1147
+ };
1148
+ return updateIfChanged(exportDeclaration, updates);
1081
1149
  }
1082
1150
 
1083
1151
  override async visitExportAssignment(exportAssignment: JS.ExportAssignment, q: RpcReceiveQueue): Promise<J | undefined> {
1084
- const draft = createDraft(exportAssignment);
1085
- draft.exportEquals = await q.receive(draft.exportEquals);
1086
- draft.expression = await q.receive(draft.expression, el => this.visitLeftPadded(el, q));
1087
- return finishDraft(draft);
1152
+ const updates = {
1153
+ exportEquals: await q.receive(exportAssignment.exportEquals),
1154
+ expression: await q.receive(exportAssignment.expression, el => this.visitLeftPadded(el, q))
1155
+ };
1156
+ return updateIfChanged(exportAssignment, updates);
1088
1157
  }
1089
1158
 
1090
1159
  override async visitNamedExports(namedExports: JS.NamedExports, q: RpcReceiveQueue): Promise<J | undefined> {
1091
- const draft = createDraft(namedExports);
1092
- draft.elements = await q.receive(draft.elements, el => this.visitContainer(el, q));
1093
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
1094
- return finishDraft(draft);
1160
+ const updates = {
1161
+ elements: await q.receive(namedExports.elements, el => this.visitContainer(el, q)),
1162
+ type: await q.receive(namedExports.type, el => this.visitType(el, q))
1163
+ };
1164
+ return updateIfChanged(namedExports, updates);
1095
1165
  }
1096
1166
 
1097
1167
  override async visitExportSpecifier(exportSpecifier: JS.ExportSpecifier, q: RpcReceiveQueue): Promise<J | undefined> {
1098
- const draft = createDraft(exportSpecifier);
1099
- draft.typeOnly = await q.receive(draft.typeOnly, el => this.visitLeftPadded(el, q));
1100
- draft.specifier = await q.receive(draft.specifier, el => this.visitDefined<Expression>(el, q));
1101
- draft.type = await q.receive(draft.type, el => this.visitType(el, q));
1102
- return finishDraft(draft);
1168
+ const updates = {
1169
+ typeOnly: await q.receive(exportSpecifier.typeOnly, el => this.visitLeftPadded(el, q)),
1170
+ specifier: await q.receive(exportSpecifier.specifier, el => this.visitDefined<Expression>(el, q)),
1171
+ type: await q.receive(exportSpecifier.type, el => this.visitType(el, q))
1172
+ };
1173
+ return updateIfChanged(exportSpecifier, updates);
1103
1174
  }
1104
1175
 
1105
1176
  override async visitRightPadded<T extends J | boolean>(right: J.RightPadded<T>, q: RpcReceiveQueue): Promise<J.RightPadded<T>> {
1106
- return this.javaReceiverDelegate.visitRightPadded(right, q)
1177
+ return this.delegate.visitRightPadded(right, q)
1107
1178
  }
1108
1179
 
1109
1180
  async visitLeftPadded<T extends J | J.Space | number | string | boolean>(left: J.LeftPadded<T>, q: RpcReceiveQueue): Promise<J.LeftPadded<T>> {
1110
- return this.javaReceiverDelegate.visitLeftPadded(left, q);
1181
+ return this.delegate.visitLeftPadded(left, q);
1111
1182
  }
1112
1183
 
1113
1184
  async visitContainer<T extends J>(container: J.Container<T>, q: RpcReceiveQueue): Promise<J.Container<T>> {
1114
- return this.javaReceiverDelegate.visitContainer(container, q);
1185
+ return this.delegate.visitContainer(container, q);
1115
1186
  }
1116
1187
 
1117
1188
  override async visitSpace(space: J.Space, q: RpcReceiveQueue): Promise<J.Space> {
1118
- return this.javaReceiverDelegate.visitSpace(space, q);
1189
+ return this.delegate.visitSpace(space, q);
1119
1190
  }
1120
1191
 
1121
1192
  override async visitType(javaType: Type | undefined, q: RpcReceiveQueue): Promise<Type | undefined> {
1122
- return this.javaReceiverDelegate.visitType(javaType, q);
1193
+ return this.delegate.visitType(javaType, q);
1123
1194
  }
1124
1195
  }
1125
1196
 
1126
- class JavaScriptReceiverDelegate extends JavaReceiver {
1197
+ class JavaScriptDelegateReceiver extends JavaReceiver {
1127
1198
  private javascriptReceiver: JavaScriptReceiver;
1128
1199
 
1129
1200
  constructor(javascriptReceiver: JavaScriptReceiver) {