@openrewrite/rewrite 8.70.0-20251222-101414 → 8.70.0-20251222-213047

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 (149) hide show
  1. package/dist/index.js +8 -8
  2. package/dist/index.js.map +1 -1
  3. package/dist/java/formatting-utils.d.ts +1 -1
  4. package/dist/java/formatting-utils.js +4 -4
  5. package/dist/java/formatting-utils.js.map +1 -1
  6. package/dist/java/markers.js +8 -8
  7. package/dist/java/markers.js.map +1 -1
  8. package/dist/java/type-visitor.d.ts +0 -3
  9. package/dist/java/type-visitor.d.ts.map +1 -1
  10. package/dist/java/type-visitor.js +67 -68
  11. package/dist/java/type-visitor.js.map +1 -1
  12. package/dist/java/visitor.d.ts +3 -3
  13. package/dist/java/visitor.d.ts.map +1 -1
  14. package/dist/java/visitor.js +5 -5
  15. package/dist/java/visitor.js.map +1 -1
  16. package/dist/javascript/assertions.js +4 -3
  17. package/dist/javascript/assertions.js.map +1 -1
  18. package/dist/javascript/cleanup/use-object-property-shorthand.js +3 -3
  19. package/dist/javascript/cleanup/use-object-property-shorthand.js.map +1 -1
  20. package/dist/javascript/format/format.d.ts +28 -7
  21. package/dist/javascript/format/format.d.ts.map +1 -1
  22. package/dist/javascript/format/format.js +149 -158
  23. package/dist/javascript/format/format.js.map +1 -1
  24. package/dist/javascript/format/minimum-viable-spacing-visitor.js +23 -23
  25. package/dist/javascript/format/minimum-viable-spacing-visitor.js.map +1 -1
  26. package/dist/javascript/format/prettier-format.d.ts.map +1 -1
  27. package/dist/javascript/format/prettier-format.js +8 -11
  28. package/dist/javascript/format/prettier-format.js.map +1 -1
  29. package/dist/javascript/format/tabs-and-indents-visitor.js +7 -7
  30. package/dist/javascript/format/tabs-and-indents-visitor.js.map +1 -1
  31. package/dist/javascript/format/whitespace-reconciler.d.ts.map +1 -1
  32. package/dist/javascript/format/whitespace-reconciler.js +12 -11
  33. package/dist/javascript/format/whitespace-reconciler.js.map +1 -1
  34. package/dist/javascript/markers.d.ts.map +1 -1
  35. package/dist/javascript/markers.js +6 -5
  36. package/dist/javascript/markers.js.map +1 -1
  37. package/dist/javascript/migrate/es6/modernize-octal-escape-sequences.js +2 -2
  38. package/dist/javascript/migrate/es6/modernize-octal-escape-sequences.js.map +1 -1
  39. package/dist/javascript/migrate/es6/modernize-octal-literals.js +2 -2
  40. package/dist/javascript/migrate/es6/modernize-octal-literals.js.map +1 -1
  41. package/dist/javascript/migrate/es6/remove-duplicate-object-keys.js +2 -2
  42. package/dist/javascript/migrate/es6/remove-duplicate-object-keys.js.map +1 -1
  43. package/dist/javascript/migrate/typescript/export-assignment-to-export-default.js +2 -2
  44. package/dist/javascript/migrate/typescript/export-assignment-to-export-default.js.map +1 -1
  45. package/dist/javascript/node-resolution-result.js +3 -9
  46. package/dist/javascript/node-resolution-result.js.map +1 -1
  47. package/dist/javascript/parser.d.ts.map +1 -1
  48. package/dist/javascript/parser.js +35 -35
  49. package/dist/javascript/parser.js.map +1 -1
  50. package/dist/javascript/project-parser.d.ts.map +1 -1
  51. package/dist/javascript/project-parser.js +6 -5
  52. package/dist/javascript/project-parser.js.map +1 -1
  53. package/dist/javascript/recipes/auto-format.d.ts +7 -23
  54. package/dist/javascript/recipes/auto-format.d.ts.map +1 -1
  55. package/dist/javascript/recipes/auto-format.js +8 -54
  56. package/dist/javascript/recipes/auto-format.js.map +1 -1
  57. package/dist/javascript/recipes/change-import.js +8 -8
  58. package/dist/javascript/recipes/change-import.js.map +1 -1
  59. package/dist/javascript/recipes/order-imports.js +4 -4
  60. package/dist/javascript/recipes/order-imports.js.map +1 -1
  61. package/dist/javascript/templating/engine.js +2 -2
  62. package/dist/javascript/templating/engine.js.map +1 -1
  63. package/dist/javascript/templating/index.d.ts +1 -0
  64. package/dist/javascript/templating/index.d.ts.map +1 -1
  65. package/dist/javascript/templating/index.js +4 -1
  66. package/dist/javascript/templating/index.js.map +1 -1
  67. package/dist/javascript/templating/placeholder-replacement.js +16 -16
  68. package/dist/javascript/templating/placeholder-replacement.js.map +1 -1
  69. package/dist/javascript/type-mapping.d.ts.map +1 -1
  70. package/dist/javascript/type-mapping.js +49 -58
  71. package/dist/javascript/type-mapping.js.map +1 -1
  72. package/dist/javascript/visitor.d.ts +3 -3
  73. package/dist/javascript/visitor.d.ts.map +1 -1
  74. package/dist/javascript/visitor.js +3 -3
  75. package/dist/javascript/visitor.js.map +1 -1
  76. package/dist/json/rpc.js +48 -49
  77. package/dist/json/rpc.js.map +1 -1
  78. package/dist/json/visitor.d.ts +3 -3
  79. package/dist/json/visitor.d.ts.map +1 -1
  80. package/dist/json/visitor.js +3 -3
  81. package/dist/json/visitor.js.map +1 -1
  82. package/dist/parse-error.js +11 -11
  83. package/dist/parse-error.js.map +1 -1
  84. package/dist/reference.d.ts.map +1 -1
  85. package/dist/reference.js +0 -3
  86. package/dist/reference.js.map +1 -1
  87. package/dist/rpc/index.js +42 -42
  88. package/dist/rpc/index.js.map +1 -1
  89. package/dist/rpc/queue.d.ts.map +1 -1
  90. package/dist/rpc/queue.js +6 -8
  91. package/dist/rpc/queue.js.map +1 -1
  92. package/dist/rpc/request/install-recipes.js +1 -1
  93. package/dist/rpc/request/install-recipes.js.map +1 -1
  94. package/dist/rpc/request/parse-project.d.ts.map +1 -1
  95. package/dist/rpc/request/parse-project.js +12 -32
  96. package/dist/rpc/request/parse-project.js.map +1 -1
  97. package/dist/rpc/request/parse.d.ts.map +1 -1
  98. package/dist/rpc/request/parse.js +1 -4
  99. package/dist/rpc/request/parse.js.map +1 -1
  100. package/dist/text/rpc.js +18 -18
  101. package/dist/text/rpc.js.map +1 -1
  102. package/dist/version.txt +1 -1
  103. package/dist/visitor.d.ts +6 -4
  104. package/dist/visitor.d.ts.map +1 -1
  105. package/dist/visitor.js +19 -17
  106. package/dist/visitor.js.map +1 -1
  107. package/dist/yaml/rpc.js +65 -65
  108. package/dist/yaml/rpc.js.map +1 -1
  109. package/package.json +2 -2
  110. package/src/index.ts +8 -8
  111. package/src/java/formatting-utils.ts +2 -2
  112. package/src/java/markers.ts +8 -8
  113. package/src/java/type-visitor.ts +59 -68
  114. package/src/java/visitor.ts +8 -8
  115. package/src/javascript/assertions.ts +3 -3
  116. package/src/javascript/cleanup/use-object-property-shorthand.ts +1 -1
  117. package/src/javascript/format/format.ts +109 -107
  118. package/src/javascript/format/minimum-viable-spacing-visitor.ts +1 -1
  119. package/src/javascript/format/prettier-format.ts +9 -12
  120. package/src/javascript/format/tabs-and-indents-visitor.ts +1 -1
  121. package/src/javascript/format/whitespace-reconciler.ts +12 -11
  122. package/src/javascript/markers.ts +6 -6
  123. package/src/javascript/migrate/es6/modernize-octal-escape-sequences.ts +1 -1
  124. package/src/javascript/migrate/es6/modernize-octal-literals.ts +1 -1
  125. package/src/javascript/migrate/es6/remove-duplicate-object-keys.ts +1 -1
  126. package/src/javascript/migrate/typescript/export-assignment-to-export-default.ts +1 -1
  127. package/src/javascript/node-resolution-result.ts +8 -14
  128. package/src/javascript/parser.ts +5 -4
  129. package/src/javascript/project-parser.ts +4 -4
  130. package/src/javascript/recipes/auto-format.ts +9 -71
  131. package/src/javascript/recipes/change-import.ts +4 -4
  132. package/src/javascript/recipes/order-imports.ts +1 -1
  133. package/src/javascript/templating/engine.ts +1 -1
  134. package/src/javascript/templating/index.ts +5 -0
  135. package/src/javascript/templating/placeholder-replacement.ts +2 -2
  136. package/src/javascript/type-mapping.ts +28 -34
  137. package/src/javascript/visitor.ts +6 -6
  138. package/src/json/rpc.ts +51 -52
  139. package/src/json/visitor.ts +6 -6
  140. package/src/parse-error.ts +11 -11
  141. package/src/reference.ts +0 -5
  142. package/src/rpc/index.ts +43 -43
  143. package/src/rpc/queue.ts +6 -8
  144. package/src/rpc/request/install-recipes.ts +1 -1
  145. package/src/rpc/request/parse-project.ts +20 -32
  146. package/src/rpc/request/parse.ts +1 -4
  147. package/src/text/rpc.ts +18 -18
  148. package/src/visitor.ts +29 -30
  149. package/src/yaml/rpc.ts +80 -81
package/src/visitor.ts CHANGED
@@ -15,32 +15,21 @@
15
15
  */
16
16
  import {emptyMarkers, Marker, Markers} from "./markers";
17
17
  import {Cursor, isSourceFile, rootCursor, SourceFile, Tree} from "./tree";
18
- import {createDraft, Draft, finishDraft, nothing, Objectish} from "immer";
19
- import {mapAsync} from "./util";
18
+ import {create, Draft} from "mutative";
19
+ import {mapAsync, updateIfChanged} from "./util";
20
20
 
21
- /* Not exported beyond the internal immer module */
22
- export type ValidImmerRecipeReturnType<State> =
23
- | State
24
- | void
25
- | undefined
26
- | typeof nothing
21
+ type Objectish = Record<string, any> | Array<any>;
22
+
23
+ export type ValidRecipeReturnType<State> = State | void | undefined;
27
24
 
28
25
  export async function produceAsync<Base extends Objectish>(
29
26
  before: Promise<Base> | Base,
30
- recipe: (draft: Draft<Base>) => ValidImmerRecipeReturnType<Draft<Base>> |
31
- PromiseLike<ValidImmerRecipeReturnType<Draft<Base>>>
27
+ recipe: (draft: Draft<Base>) => ValidRecipeReturnType<Draft<Base>> |
28
+ PromiseLike<ValidRecipeReturnType<Draft<Base>>>
32
29
  ): Promise<Base | undefined> {
33
30
  const b: Base = await before;
34
- const draft = createDraft(b);
35
- const result = await recipe(draft);
36
-
37
- // If recipe explicitly returned Immer's nothing, return undefined
38
- if (result === nothing) {
39
- return undefined;
40
- }
41
-
42
- // Otherwise, return the finished draft (void/undefined means use draft)
43
- return finishDraft(draft) as Base;
31
+ // Mutative's create(base, recipe) supports async recipes and rawReturn(undefined)
32
+ return create(b, recipe as any) as Base | undefined;
44
33
  }
45
34
 
46
35
  const stopAfterPreVisit = Symbol.for("STOP_AFTER_PRE_VISIT")
@@ -136,9 +125,9 @@ export abstract class TreeVisitor<T extends Tree, P> {
136
125
  } else if ((markers.markers?.length || 0) === 0) {
137
126
  return markers;
138
127
  }
139
- return (await produceAsync<Markers>(markers, async (draft) => {
140
- draft.markers = await mapAsync(markers.markers, m => this.visitMarker(m, p))
141
- }))!;
128
+ return updateIfChanged(markers, {
129
+ markers: await mapAsync(markers.markers, m => this.visitMarker(m, p))
130
+ });
142
131
  }
143
132
 
144
133
  protected async visitMarker<M extends Marker>(marker: M, p: P): Promise<M> {
@@ -149,15 +138,25 @@ export abstract class TreeVisitor<T extends Tree, P> {
149
138
  before: T,
150
139
  p: P,
151
140
  recipe?:
152
- ((draft: Draft<T>) => ValidImmerRecipeReturnType<Draft<T>>) |
153
- ((draft: Draft<T>) => Promise<ValidImmerRecipeReturnType<Draft<T>>>)
141
+ ((draft: Draft<T>) => ValidRecipeReturnType<Draft<T>>) |
142
+ ((draft: Draft<T>) => Promise<ValidRecipeReturnType<Draft<T>>>)
154
143
  ): Promise<T | undefined> {
155
- return produceAsync(before, async draft => {
156
- draft.markers = await this.visitMarkers(before.markers, p);
157
- if (recipe) {
158
- await recipe(draft);
144
+ // Visit markers separately to avoid Mutative drafting cyclic marker structures
145
+ const newMarkers = await this.visitMarkers(before.markers, p);
146
+
147
+ if (recipe) {
148
+ // Remove markers before Mutative drafting to avoid cycles, then restore after
149
+ const withoutMarkers = { ...before, markers: emptyMarkers };
150
+ const result = await produceAsync(withoutMarkers, recipe);
151
+ if (result === undefined) {
152
+ return undefined;
159
153
  }
160
- });
154
+ // Restore markers (use newMarkers since we visited them)
155
+ return { ...result, markers: newMarkers } as T;
156
+ }
157
+
158
+ // No recipe - just update markers if changed
159
+ return updateIfChanged(before, { markers: newMarkers } as Partial<T>);
161
160
  }
162
161
  }
163
162
 
package/src/yaml/rpc.ts CHANGED
@@ -16,8 +16,7 @@
16
16
  import {YamlVisitor} from "./visitor";
17
17
  import {RpcCodecs, RpcReceiveQueue, RpcSendQueue} from "../rpc";
18
18
  import {Yaml} from "./tree";
19
- import {produceAsync} from "../visitor";
20
- import {createDraft, finishDraft} from "immer";
19
+ import {updateIfChanged} from "../util";
21
20
 
22
21
  class YamlSender extends YamlVisitor<RpcSendQueue> {
23
22
 
@@ -116,118 +115,118 @@ class YamlSender extends YamlVisitor<RpcSendQueue> {
116
115
  class YamlReceiver extends YamlVisitor<RpcReceiveQueue> {
117
116
 
118
117
  protected async preVisit(y: Yaml, q: RpcReceiveQueue): Promise<Yaml | undefined> {
119
- const draft = createDraft(y);
120
- draft.id = await q.receive(y.id);
121
- draft.prefix = await q.receive(y.prefix);
122
- draft.markers = await q.receive(y.markers);
123
- return finishDraft(draft);
118
+ return updateIfChanged(y, {
119
+ id: await q.receive(y.id),
120
+ prefix: await q.receive(y.prefix),
121
+ markers: await q.receive(y.markers),
122
+ });
124
123
  }
125
124
 
126
125
  protected async visitDocuments(documents: Yaml.Documents, q: RpcReceiveQueue): Promise<Yaml | undefined> {
127
- const draft = createDraft(documents);
128
- draft.sourcePath = await q.receive(documents.sourcePath);
129
- draft.charsetName = await q.receive(documents.charsetName);
130
- draft.charsetBomMarked = await q.receive(documents.charsetBomMarked);
131
- draft.checksum = await q.receive(documents.checksum);
132
- draft.fileAttributes = await q.receive(documents.fileAttributes);
133
- draft.documents = await q.receiveListDefined(documents.documents,
134
- async doc => await this.visit(doc, q) as Yaml.Document);
135
- draft.suffix = await q.receive(documents.suffix);
136
- return finishDraft(draft);
126
+ return updateIfChanged(documents, {
127
+ sourcePath: await q.receive(documents.sourcePath),
128
+ charsetName: await q.receive(documents.charsetName),
129
+ charsetBomMarked: await q.receive(documents.charsetBomMarked),
130
+ checksum: await q.receive(documents.checksum),
131
+ fileAttributes: await q.receive(documents.fileAttributes),
132
+ documents: await q.receiveListDefined(documents.documents,
133
+ async doc => await this.visit(doc, q) as Yaml.Document),
134
+ suffix: await q.receive(documents.suffix),
135
+ });
137
136
  }
138
137
 
139
138
  protected async visitDocument(document: Yaml.Document, q: RpcReceiveQueue): Promise<Yaml | undefined> {
140
- const draft = createDraft(document);
141
- draft.explicit = await q.receive(document.explicit);
142
- draft.block = await q.receive(document.block,
143
- async b => await this.visit(b, q) as Yaml.Block);
144
- draft.end = await q.receive(document.end,
145
- async e => await this.visit(e, q) as Yaml.DocumentEnd);
146
- return finishDraft(draft);
139
+ return updateIfChanged(document, {
140
+ explicit: await q.receive(document.explicit),
141
+ block: await q.receive(document.block,
142
+ async b => await this.visit(b, q) as Yaml.Block),
143
+ end: await q.receive(document.end,
144
+ async e => await this.visit(e, q) as Yaml.DocumentEnd),
145
+ });
147
146
  }
148
147
 
149
148
  protected async visitDocumentEnd(end: Yaml.DocumentEnd, q: RpcReceiveQueue): Promise<Yaml | undefined> {
150
- const draft = createDraft(end);
151
- draft.explicit = await q.receive(end.explicit);
152
- return finishDraft(draft);
149
+ return updateIfChanged(end, {
150
+ explicit: await q.receive(end.explicit),
151
+ });
153
152
  }
154
153
 
155
154
  protected async visitMapping(mapping: Yaml.Mapping, q: RpcReceiveQueue): Promise<Yaml | undefined> {
156
- const draft = createDraft(mapping);
157
- draft.openingBracePrefix = await q.receive(mapping.openingBracePrefix);
158
- draft.entries = await q.receiveListDefined(mapping.entries,
159
- async e => await this.visit(e, q) as Yaml.MappingEntry);
160
- draft.closingBracePrefix = await q.receive(mapping.closingBracePrefix);
161
- draft.anchor = await q.receive(mapping.anchor,
162
- async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
163
- draft.tag = await q.receive(mapping.tag,
164
- async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
165
- return finishDraft(draft);
155
+ return updateIfChanged(mapping, {
156
+ openingBracePrefix: await q.receive(mapping.openingBracePrefix),
157
+ entries: await q.receiveListDefined(mapping.entries,
158
+ async e => await this.visit(e, q) as Yaml.MappingEntry),
159
+ closingBracePrefix: await q.receive(mapping.closingBracePrefix),
160
+ anchor: await q.receive(mapping.anchor,
161
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined),
162
+ tag: await q.receive(mapping.tag,
163
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined),
164
+ });
166
165
  }
167
166
 
168
167
  protected async visitMappingEntry(entry: Yaml.MappingEntry, q: RpcReceiveQueue): Promise<Yaml | undefined> {
169
- const draft = createDraft(entry);
170
- draft.key = await q.receive(entry.key,
171
- async k => await this.visit(k, q) as Yaml.YamlKey);
172
- draft.beforeMappingValueIndicator = await q.receive(entry.beforeMappingValueIndicator);
173
- draft.value = await q.receive(entry.value,
174
- async v => await this.visit(v, q) as Yaml.Block);
175
- return finishDraft(draft);
168
+ return updateIfChanged(entry, {
169
+ key: await q.receive(entry.key,
170
+ async k => await this.visit(k, q) as Yaml.YamlKey),
171
+ beforeMappingValueIndicator: await q.receive(entry.beforeMappingValueIndicator),
172
+ value: await q.receive(entry.value,
173
+ async v => await this.visit(v, q) as Yaml.Block),
174
+ });
176
175
  }
177
176
 
178
177
  protected async visitScalar(scalar: Yaml.Scalar, q: RpcReceiveQueue): Promise<Yaml | undefined> {
179
- const draft = createDraft(scalar);
180
- draft.style = await q.receive(scalar.style);
181
- draft.anchor = await q.receive(scalar.anchor,
182
- async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
183
- draft.tag = await q.receive(scalar.tag,
184
- async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
185
- draft.value = await q.receive(scalar.value);
186
- return finishDraft(draft);
178
+ return updateIfChanged(scalar, {
179
+ style: await q.receive(scalar.style),
180
+ anchor: await q.receive(scalar.anchor,
181
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined),
182
+ tag: await q.receive(scalar.tag,
183
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined),
184
+ value: await q.receive(scalar.value),
185
+ });
187
186
  }
188
187
 
189
188
  protected async visitSequence(sequence: Yaml.Sequence, q: RpcReceiveQueue): Promise<Yaml | undefined> {
190
- const draft = createDraft(sequence);
191
- draft.openingBracketPrefix = await q.receive(sequence.openingBracketPrefix);
192
- draft.entries = await q.receiveListDefined(sequence.entries,
193
- async e => await this.visit(e, q) as Yaml.SequenceEntry);
194
- draft.closingBracketPrefix = await q.receive(sequence.closingBracketPrefix);
195
- draft.anchor = await q.receive(sequence.anchor,
196
- async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined);
197
- draft.tag = await q.receive(sequence.tag,
198
- async t => t ? await this.visit(t, q) as Yaml.Tag : undefined);
199
- return finishDraft(draft);
189
+ return updateIfChanged(sequence, {
190
+ openingBracketPrefix: await q.receive(sequence.openingBracketPrefix),
191
+ entries: await q.receiveListDefined(sequence.entries,
192
+ async e => await this.visit(e, q) as Yaml.SequenceEntry),
193
+ closingBracketPrefix: await q.receive(sequence.closingBracketPrefix),
194
+ anchor: await q.receive(sequence.anchor,
195
+ async a => a ? await this.visit(a, q) as Yaml.Anchor : undefined),
196
+ tag: await q.receive(sequence.tag,
197
+ async t => t ? await this.visit(t, q) as Yaml.Tag : undefined),
198
+ });
200
199
  }
201
200
 
202
201
  protected async visitSequenceEntry(entry: Yaml.SequenceEntry, q: RpcReceiveQueue): Promise<Yaml | undefined> {
203
- const draft = createDraft(entry);
204
- draft.block = await q.receive(entry.block,
205
- async b => await this.visit(b, q) as Yaml.Block);
206
- draft.dash = await q.receive(entry.dash);
207
- draft.trailingCommaPrefix = await q.receive(entry.trailingCommaPrefix);
208
- return finishDraft(draft);
202
+ return updateIfChanged(entry, {
203
+ block: await q.receive(entry.block,
204
+ async b => await this.visit(b, q) as Yaml.Block),
205
+ dash: await q.receive(entry.dash),
206
+ trailingCommaPrefix: await q.receive(entry.trailingCommaPrefix),
207
+ });
209
208
  }
210
209
 
211
210
  protected async visitAnchor(anchor: Yaml.Anchor, q: RpcReceiveQueue): Promise<Yaml | undefined> {
212
- const draft = createDraft(anchor);
213
- draft.postfix = await q.receive(anchor.postfix);
214
- draft.key = await q.receive(anchor.key);
215
- return finishDraft(draft);
211
+ return updateIfChanged(anchor, {
212
+ postfix: await q.receive(anchor.postfix),
213
+ key: await q.receive(anchor.key),
214
+ });
216
215
  }
217
216
 
218
217
  protected async visitAlias(alias: Yaml.Alias, q: RpcReceiveQueue): Promise<Yaml | undefined> {
219
- const draft = createDraft(alias);
220
- draft.anchor = await q.receive(alias.anchor,
221
- async a => await this.visit(a, q) as Yaml.Anchor);
222
- return finishDraft(draft);
218
+ return updateIfChanged(alias, {
219
+ anchor: await q.receive(alias.anchor,
220
+ async a => await this.visit(a, q) as Yaml.Anchor),
221
+ });
223
222
  }
224
223
 
225
224
  protected async visitTag(tag: Yaml.Tag, q: RpcReceiveQueue): Promise<Yaml | undefined> {
226
- const draft = createDraft(tag);
227
- draft.name = await q.receive(tag.name);
228
- draft.suffix = await q.receive(tag.suffix);
229
- draft.tagKind = await q.receive(tag.tagKind);
230
- return finishDraft(draft);
225
+ return updateIfChanged(tag, {
226
+ name: await q.receive(tag.name),
227
+ suffix: await q.receive(tag.suffix),
228
+ tagKind: await q.receive(tag.tagKind),
229
+ });
231
230
  }
232
231
  }
233
232