@openrewrite/rewrite 8.96.4 → 8.97.0

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 (135) hide show
  1. package/dist/execution.d.ts +2 -0
  2. package/dist/execution.d.ts.map +1 -1
  3. package/dist/execution.js +4 -0
  4. package/dist/execution.js.map +1 -1
  5. package/dist/heavyweight.d.ts +8 -0
  6. package/dist/heavyweight.d.ts.map +1 -0
  7. package/dist/heavyweight.js +45 -0
  8. package/dist/heavyweight.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/java/tree.d.ts +2 -1
  14. package/dist/java/tree.d.ts.map +1 -1
  15. package/dist/java/tree.js.map +1 -1
  16. package/dist/java/visitor.d.ts +5 -0
  17. package/dist/java/visitor.d.ts.map +1 -1
  18. package/dist/java/visitor.js +264 -217
  19. package/dist/java/visitor.js.map +1 -1
  20. package/dist/javascript/add-import.d.ts +2 -1
  21. package/dist/javascript/add-import.d.ts.map +1 -1
  22. package/dist/javascript/add-import.js +14 -2
  23. package/dist/javascript/add-import.js.map +1 -1
  24. package/dist/javascript/amd.d.ts.map +1 -1
  25. package/dist/javascript/amd.js +2 -1
  26. package/dist/javascript/amd.js.map +1 -1
  27. package/dist/javascript/cleanup/add-parse-int-radix.js +1 -1
  28. package/dist/javascript/cleanup/add-parse-int-radix.js.map +1 -1
  29. package/dist/javascript/dependency-workspace.d.ts +8 -2
  30. package/dist/javascript/dependency-workspace.d.ts.map +1 -1
  31. package/dist/javascript/dependency-workspace.js +36 -4
  32. package/dist/javascript/dependency-workspace.js.map +1 -1
  33. package/dist/javascript/format/format.d.ts +10 -0
  34. package/dist/javascript/format/format.d.ts.map +1 -1
  35. package/dist/javascript/format/format.js +10 -2
  36. package/dist/javascript/format/format.js.map +1 -1
  37. package/dist/javascript/format/tabs-and-indents-visitor.d.ts.map +1 -1
  38. package/dist/javascript/format/tabs-and-indents-visitor.js +4 -0
  39. package/dist/javascript/format/tabs-and-indents-visitor.js.map +1 -1
  40. package/dist/javascript/format/whitespace-reconciler.d.ts.map +1 -1
  41. package/dist/javascript/format/whitespace-reconciler.js +4 -0
  42. package/dist/javascript/format/whitespace-reconciler.js.map +1 -1
  43. package/dist/javascript/node-resolution-result.d.ts.map +1 -1
  44. package/dist/javascript/node-resolution-result.js +2 -0
  45. package/dist/javascript/node-resolution-result.js.map +1 -1
  46. package/dist/javascript/parser-utils.d.ts.map +1 -1
  47. package/dist/javascript/parser-utils.js +9 -6
  48. package/dist/javascript/parser-utils.js.map +1 -1
  49. package/dist/javascript/templating/engine.d.ts +1 -0
  50. package/dist/javascript/templating/engine.d.ts.map +1 -1
  51. package/dist/javascript/templating/engine.js +39 -10
  52. package/dist/javascript/templating/engine.js.map +1 -1
  53. package/dist/javascript/templating/pattern.d.ts.map +1 -1
  54. package/dist/javascript/templating/pattern.js +8 -0
  55. package/dist/javascript/templating/pattern.js.map +1 -1
  56. package/dist/javascript/templating/placeholder-replacement.d.ts +2 -0
  57. package/dist/javascript/templating/placeholder-replacement.d.ts.map +1 -1
  58. package/dist/javascript/templating/placeholder-replacement.js +37 -1
  59. package/dist/javascript/templating/placeholder-replacement.js.map +1 -1
  60. package/dist/javascript/visitor.d.ts.map +1 -1
  61. package/dist/javascript/visitor.js +153 -118
  62. package/dist/javascript/visitor.js.map +1 -1
  63. package/dist/recipe.d.ts +5 -0
  64. package/dist/recipe.d.ts.map +1 -1
  65. package/dist/recipe.js +5 -0
  66. package/dist/recipe.js.map +1 -1
  67. package/dist/rewrite-javascript-version.txt +1 -1
  68. package/dist/run.d.ts +7 -1
  69. package/dist/run.d.ts.map +1 -1
  70. package/dist/run.js +40 -2
  71. package/dist/run.js.map +1 -1
  72. package/dist/test/accumulator-contents.d.ts +15 -0
  73. package/dist/test/accumulator-contents.d.ts.map +1 -0
  74. package/dist/test/accumulator-contents.js +185 -0
  75. package/dist/test/accumulator-contents.js.map +1 -0
  76. package/dist/test/empty-sources.d.ts +14 -0
  77. package/dist/test/empty-sources.d.ts.map +1 -0
  78. package/dist/test/empty-sources.js +98 -0
  79. package/dist/test/empty-sources.js.map +1 -0
  80. package/dist/test/formatting-scope.d.ts +18 -0
  81. package/dist/test/formatting-scope.d.ts.map +1 -0
  82. package/dist/test/formatting-scope.js +244 -0
  83. package/dist/test/formatting-scope.js.map +1 -0
  84. package/dist/test/probes.d.ts +25 -0
  85. package/dist/test/probes.d.ts.map +1 -0
  86. package/dist/test/probes.js +189 -0
  87. package/dist/test/probes.js.map +1 -0
  88. package/dist/test/rewrite-test.d.ts +27 -0
  89. package/dist/test/rewrite-test.d.ts.map +1 -1
  90. package/dist/test/rewrite-test.js +191 -21
  91. package/dist/test/rewrite-test.js.map +1 -1
  92. package/dist/test/tree-shapes.d.ts +15 -0
  93. package/dist/test/tree-shapes.d.ts.map +1 -0
  94. package/dist/test/tree-shapes.js +288 -0
  95. package/dist/test/tree-shapes.js.map +1 -0
  96. package/dist/test/unparsed-sources.d.ts +17 -0
  97. package/dist/test/unparsed-sources.d.ts.map +1 -0
  98. package/dist/test/unparsed-sources.js +113 -0
  99. package/dist/test/unparsed-sources.js.map +1 -0
  100. package/dist/tree.d.ts.map +1 -1
  101. package/dist/tree.js +2 -0
  102. package/dist/tree.js.map +1 -1
  103. package/dist/visitor.d.ts.map +1 -1
  104. package/dist/visitor.js +2 -0
  105. package/dist/visitor.js.map +1 -1
  106. package/package.json +1 -1
  107. package/src/execution.ts +6 -0
  108. package/src/heavyweight.ts +42 -0
  109. package/src/index.ts +1 -0
  110. package/src/java/tree.ts +2 -1
  111. package/src/java/visitor.ts +263 -216
  112. package/src/javascript/add-import.ts +11 -2
  113. package/src/javascript/amd.ts +4 -2
  114. package/src/javascript/cleanup/add-parse-int-radix.ts +2 -2
  115. package/src/javascript/dependency-workspace.ts +35 -3
  116. package/src/javascript/format/format.ts +18 -0
  117. package/src/javascript/format/tabs-and-indents-visitor.ts +4 -0
  118. package/src/javascript/format/whitespace-reconciler.ts +4 -0
  119. package/src/javascript/node-resolution-result.ts +3 -0
  120. package/src/javascript/parser-utils.ts +10 -6
  121. package/src/javascript/templating/engine.ts +41 -9
  122. package/src/javascript/templating/pattern.ts +10 -0
  123. package/src/javascript/templating/placeholder-replacement.ts +38 -1
  124. package/src/javascript/visitor.ts +166 -118
  125. package/src/recipe.ts +5 -0
  126. package/src/run.ts +30 -2
  127. package/src/test/accumulator-contents.ts +194 -0
  128. package/src/test/empty-sources.ts +99 -0
  129. package/src/test/formatting-scope.ts +231 -0
  130. package/src/test/probes.ts +156 -0
  131. package/src/test/rewrite-test.ts +177 -24
  132. package/src/test/tree-shapes.ts +332 -0
  133. package/src/test/unparsed-sources.ts +138 -0
  134. package/src/tree.ts +3 -0
  135. package/src/visitor.ts +3 -0
@@ -21,6 +21,7 @@ const util_1 = require("../util");
21
21
  const java_1 = require("../java");
22
22
  const mutative_1 = require("mutative");
23
23
  const tree_1 = require("./tree");
24
+ const parser_utils_1 = require("./parser-utils");
24
25
  class JavaScriptVisitor extends java_1.JavaVisitor {
25
26
  async isAcceptable(sourceFile) {
26
27
  return (0, tree_1.isJavaScript)(sourceFile);
@@ -60,12 +61,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
60
61
  return expression;
61
62
  }
62
63
  alias = expression;
63
- const updates = {
64
+ const updates = await this.visitChildrenOf(alias, async () => ({
64
65
  prefix: await this.visitSpace(alias.prefix, p),
65
66
  markers: await this.visitMarkers(alias.markers, p),
66
67
  propertyName: await this.visitRightPadded(alias.propertyName, p),
67
68
  alias: await this.visitDefined(alias.alias, p)
68
- };
69
+ }));
69
70
  return (0, util_1.updateIfChanged)(alias, updates);
70
71
  }
71
72
  async visitArrowFunction(arrowFunction, p) {
@@ -79,7 +80,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
79
80
  return statement;
80
81
  }
81
82
  arrowFunction = statement;
82
- const updates = {
83
+ const updates = await this.visitChildrenOf(arrowFunction, async () => ({
83
84
  prefix: await this.visitSpace(arrowFunction.prefix, p),
84
85
  markers: await this.visitMarkers(arrowFunction.markers, p),
85
86
  leadingAnnotations: await (0, util_1.mapAsync)(arrowFunction.leadingAnnotations, item => this.visitDefined(item, p)),
@@ -87,7 +88,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
87
88
  typeParameters: arrowFunction.typeParameters && await this.visitDefined(arrowFunction.typeParameters, p),
88
89
  lambda: await this.visitDefined(arrowFunction.lambda, p),
89
90
  returnTypeExpression: arrowFunction.returnTypeExpression && await this.visitDefined(arrowFunction.returnTypeExpression, p)
90
- };
91
+ }));
91
92
  return (0, util_1.updateIfChanged)(arrowFunction, updates);
92
93
  }
93
94
  async visitAs(as_, p) {
@@ -96,13 +97,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
96
97
  return expression;
97
98
  }
98
99
  as_ = expression;
99
- const updates = {
100
+ const updates = await this.visitChildrenOf(as_, async () => ({
100
101
  prefix: await this.visitSpace(as_.prefix, p),
101
102
  markers: await this.visitMarkers(as_.markers, p),
102
103
  left: await this.visitRightPadded(as_.left, p),
103
104
  right: await this.visitDefined(as_.right, p),
104
105
  type: as_.type && await this.visitType(as_.type, p)
105
- };
106
+ }));
106
107
  return (0, util_1.updateIfChanged)(as_, updates);
107
108
  }
108
109
  async visitAwait(await_, p) {
@@ -111,12 +112,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
111
112
  return expression;
112
113
  }
113
114
  await_ = expression;
114
- const updates = {
115
+ const updates = await this.visitChildrenOf(await_, async () => ({
115
116
  prefix: await this.visitSpace(await_.prefix, p),
116
117
  markers: await this.visitMarkers(await_.markers, p),
117
118
  expression: await this.visitDefined(await_.expression, p),
118
119
  type: await_.type && await this.visitType(await_.type, p)
119
- };
120
+ }));
120
121
  return (0, util_1.updateIfChanged)(await_, updates);
121
122
  }
122
123
  async visitJsxTag(element, p) {
@@ -125,7 +126,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
125
126
  return expression;
126
127
  }
127
128
  element = expression;
128
- const updates = {
129
+ const updates = await this.visitChildrenOf(element, async () => ({
129
130
  prefix: await this.visitSpace(element.prefix, p),
130
131
  markers: await this.visitMarkers(element.markers, p),
131
132
  openName: await this.visitLeftPadded(element.openName, p),
@@ -136,7 +137,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
136
137
  children: element.children && await (0, util_1.mapAsync)(element.children, child => this.visit(child, p)),
137
138
  closingName: element.closingName && await this.visitLeftPadded(element.closingName, p),
138
139
  afterClosingName: element.afterClosingName && await this.visitSpace(element.afterClosingName, p)
139
- };
140
+ }));
140
141
  return (0, util_1.updateIfChanged)(element, updates);
141
142
  }
142
143
  async visitJsxAttribute(attribute, p) {
@@ -163,11 +164,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
163
164
  return expression;
164
165
  }
165
166
  expr = expression;
166
- const updates = {
167
+ const updates = await this.visitChildrenOf(expr, async () => ({
167
168
  prefix: await this.visitSpace(expr.prefix, p),
168
169
  markers: await this.visitMarkers(expr.markers, p),
169
170
  expression: await this.visitRightPadded(expr.expression, p)
170
- };
171
+ }));
171
172
  return (0, util_1.updateIfChanged)(expr, updates);
172
173
  }
173
174
  async visitJsxNamespacedName(ns, p) {
@@ -194,13 +195,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
194
195
  return expression;
195
196
  }
196
197
  conditionalType = expression;
197
- const updates = {
198
+ const updates = await this.visitChildrenOf(conditionalType, async () => ({
198
199
  prefix: await this.visitSpace(conditionalType.prefix, p),
199
200
  markers: await this.visitMarkers(conditionalType.markers, p),
200
201
  checkType: await this.visitDefined(conditionalType.checkType, p),
201
202
  condition: await this.visitLeftPadded(conditionalType.condition, p),
202
203
  type: conditionalType.type && await this.visitType(conditionalType.type, p)
203
- };
204
+ }));
204
205
  return (0, util_1.updateIfChanged)(conditionalType, updates);
205
206
  }
206
207
  async visitDelete(delete_, p) {
@@ -214,14 +215,15 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
214
215
  return statement;
215
216
  }
216
217
  delete_ = statement;
217
- const updates = {
218
+ const updates = await this.visitChildrenOf(delete_, async () => ({
218
219
  prefix: await this.visitSpace(delete_.prefix, p),
219
220
  markers: await this.visitMarkers(delete_.markers, p),
220
221
  expression: await this.visitDefined(delete_.expression, p)
221
- };
222
+ }));
222
223
  return (0, util_1.updateIfChanged)(delete_, updates);
223
224
  }
224
225
  async visitExpressionStatement(expressionStatement, p) {
226
+ var _a;
225
227
  const expression = await this.visitExpression(expressionStatement, p);
226
228
  if (!(expression === null || expression === void 0 ? void 0 : expression.kind) || expression.kind !== tree_1.JS.Kind.ExpressionStatement) {
227
229
  return expression;
@@ -232,11 +234,24 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
232
234
  return statement;
233
235
  }
234
236
  expressionStatement = statement;
235
- const updates = {
237
+ const updates = await this.visitChildrenOf(expressionStatement, async () => ({
236
238
  prefix: await this.visitSpace(expressionStatement.prefix, p),
237
239
  markers: await this.visitMarkers(expressionStatement.markers, p),
238
240
  expression: await this.visitDefined(expressionStatement.expression, p)
239
- };
241
+ }));
242
+ // Outside a `for` head the parser makes a statement the statement itself, so a visit that makes one does too,
243
+ // where the cursor shows what holds the expression statement
244
+ let visited = updates.expression;
245
+ const parent = (_a = this.cursor.parentTree()) === null || _a === void 0 ? void 0 : _a.value;
246
+ if (visited && visited !== expressionStatement.expression && (0, parser_utils_1.isStatement)(visited) &&
247
+ parent && parent.kind !== java_1.J.Kind.ForLoopControl) {
248
+ // and it holds a statement that is no expression in a JS.StatementExpression only when it is a `yield`
249
+ const held = visited.kind === tree_1.JS.Kind.StatementExpression ? visited.statement : undefined;
250
+ if (held && held.kind !== java_1.J.Kind.Yield) {
251
+ visited = Object.assign(Object.assign({}, held), { prefix: concatenated(visited.prefix, held.prefix), markers: withOuterMarkers(visited.markers, held.markers) });
252
+ }
253
+ return Object.assign(Object.assign({}, visited), { prefix: concatenated(updates.prefix, visited.prefix), markers: withOuterMarkers(updates.markers, visited.markers) });
254
+ }
240
255
  return (0, util_1.updateIfChanged)(expressionStatement, updates);
241
256
  }
242
257
  async visitExpressionWithTypeArguments(expressionWithTypeArguments, p) {
@@ -245,13 +260,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
245
260
  return expression;
246
261
  }
247
262
  expressionWithTypeArguments = expression;
248
- const updates = {
263
+ const updates = await this.visitChildrenOf(expressionWithTypeArguments, async () => ({
249
264
  prefix: await this.visitSpace(expressionWithTypeArguments.prefix, p),
250
265
  markers: await this.visitMarkers(expressionWithTypeArguments.markers, p),
251
266
  clazz: await this.visitDefined(expressionWithTypeArguments.clazz, p),
252
267
  typeArguments: expressionWithTypeArguments.typeArguments && await this.visitContainer(expressionWithTypeArguments.typeArguments, p),
253
268
  type: expressionWithTypeArguments.type && await this.visitType(expressionWithTypeArguments.type, p)
254
- };
269
+ }));
255
270
  return (0, util_1.updateIfChanged)(expressionWithTypeArguments, updates);
256
271
  }
257
272
  async visitFunctionCall(functionCall, p) {
@@ -265,14 +280,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
265
280
  return statement;
266
281
  }
267
282
  functionCall = statement;
268
- const updates = {
283
+ const updates = await this.visitChildrenOf(functionCall, async () => ({
269
284
  prefix: await this.visitSpace(functionCall.prefix, p),
270
285
  markers: await this.visitMarkers(functionCall.markers, p),
271
286
  function: await this.visitOptionalRightPadded(functionCall.function, p),
272
287
  typeParameters: await this.visitOptionalContainer(functionCall.typeParameters, p),
273
288
  arguments: await this.visitContainer(functionCall.arguments, p),
274
289
  methodType: await this.visitType(functionCall.methodType, p)
275
- };
290
+ }));
276
291
  return (0, util_1.updateIfChanged)(functionCall, updates);
277
292
  }
278
293
  async visitFunctionType(functionType, p) {
@@ -281,7 +296,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
281
296
  return expression;
282
297
  }
283
298
  functionType = expression;
284
- const updates = {
299
+ const updates = await this.visitChildrenOf(functionType, async () => ({
285
300
  prefix: await this.visitSpace(functionType.prefix, p),
286
301
  markers: await this.visitMarkers(functionType.markers, p),
287
302
  modifiers: await (0, util_1.mapAsync)(functionType.modifiers, item => this.visitDefined(item, p)),
@@ -289,7 +304,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
289
304
  typeParameters: functionType.typeParameters && await this.visitDefined(functionType.typeParameters, p),
290
305
  parameters: await this.visitContainer(functionType.parameters, p),
291
306
  returnType: await this.visitLeftPadded(functionType.returnType, p)
292
- };
307
+ }));
293
308
  return (0, util_1.updateIfChanged)(functionType, updates);
294
309
  }
295
310
  async visitInferType(inferType, p) {
@@ -298,12 +313,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
298
313
  return expression;
299
314
  }
300
315
  inferType = expression;
301
- const updates = {
316
+ const updates = await this.visitChildrenOf(inferType, async () => ({
302
317
  prefix: await this.visitSpace(inferType.prefix, p),
303
318
  markers: await this.visitMarkers(inferType.markers, p),
304
319
  typeParameter: await this.visitLeftPadded(inferType.typeParameter, p),
305
320
  type: inferType.type && await this.visitType(inferType.type, p)
306
- };
321
+ }));
307
322
  return (0, util_1.updateIfChanged)(inferType, updates);
308
323
  }
309
324
  async visitImportType(importType, p) {
@@ -312,7 +327,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
312
327
  return expression;
313
328
  }
314
329
  importType = expression;
315
- const updates = {
330
+ const updates = await this.visitChildrenOf(importType, async () => ({
316
331
  prefix: await this.visitSpace(importType.prefix, p),
317
332
  markers: await this.visitMarkers(importType.markers, p),
318
333
  hasTypeof: await this.visitRightPadded(importType.hasTypeof, p),
@@ -320,7 +335,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
320
335
  qualifier: importType.qualifier && await this.visitLeftPadded(importType.qualifier, p),
321
336
  typeArguments: importType.typeArguments && await this.visitContainer(importType.typeArguments, p),
322
337
  type: importType.type && await this.visitType(importType.type, p)
323
- };
338
+ }));
324
339
  return (0, util_1.updateIfChanged)(importType, updates);
325
340
  }
326
341
  async visitImportDeclaration(jsImport, p) {
@@ -329,7 +344,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
329
344
  return statement;
330
345
  }
331
346
  jsImport = statement;
332
- const updates = {
347
+ const updates = await this.visitChildrenOf(jsImport, async () => ({
333
348
  prefix: await this.visitSpace(jsImport.prefix, p),
334
349
  markers: await this.visitMarkers(jsImport.markers, p),
335
350
  modifiers: await (0, util_1.mapAsync)(jsImport.modifiers, item => this.visitDefined(item, p)),
@@ -337,7 +352,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
337
352
  moduleSpecifier: jsImport.moduleSpecifier && await this.visitLeftPadded(jsImport.moduleSpecifier, p),
338
353
  attributes: jsImport.attributes && await this.visitDefined(jsImport.attributes, p),
339
354
  initializer: jsImport.initializer && await this.visitLeftPadded(jsImport.initializer, p)
340
- };
355
+ }));
341
356
  return (0, util_1.updateIfChanged)(jsImport, updates);
342
357
  }
343
358
  async visitImportClause(importClause, p) {
@@ -355,12 +370,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
355
370
  return expression;
356
371
  }
357
372
  namedImports = expression;
358
- const updates = {
373
+ const updates = await this.visitChildrenOf(namedImports, async () => ({
359
374
  prefix: await this.visitSpace(namedImports.prefix, p),
360
375
  markers: await this.visitMarkers(namedImports.markers, p),
361
376
  elements: await this.visitContainer(namedImports.elements, p),
362
377
  type: namedImports.type && await this.visitType(namedImports.type, p)
363
- };
378
+ }));
364
379
  return (0, util_1.updateIfChanged)(namedImports, updates);
365
380
  }
366
381
  async visitImportSpecifier(importSpecifier, p) {
@@ -369,13 +384,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
369
384
  return expression;
370
385
  }
371
386
  importSpecifier = expression;
372
- const updates = {
387
+ const updates = await this.visitChildrenOf(importSpecifier, async () => ({
373
388
  prefix: await this.visitSpace(importSpecifier.prefix, p),
374
389
  markers: await this.visitMarkers(importSpecifier.markers, p),
375
390
  importType: await this.visitLeftPadded(importSpecifier.importType, p),
376
391
  specifier: await this.visitDefined(importSpecifier.specifier, p),
377
392
  type: importSpecifier.type && await this.visitType(importSpecifier.type, p)
378
- };
393
+ }));
379
394
  return (0, util_1.updateIfChanged)(importSpecifier, updates);
380
395
  }
381
396
  async visitImportAttributes(importAttributes, p) {
@@ -402,12 +417,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
402
417
  return statement;
403
418
  }
404
419
  importAttribute = statement;
405
- const updates = {
420
+ const updates = await this.visitChildrenOf(importAttribute, async () => ({
406
421
  prefix: await this.visitSpace(importAttribute.prefix, p),
407
422
  markers: await this.visitMarkers(importAttribute.markers, p),
408
423
  name: await this.visitDefined(importAttribute.name, p),
409
424
  value: await this.visitLeftPadded(importAttribute.value, p)
410
- };
425
+ }));
411
426
  return (0, util_1.updateIfChanged)(importAttribute, updates);
412
427
  }
413
428
  async visitBinaryExtensions(jsBinary, p) {
@@ -416,14 +431,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
416
431
  return expression;
417
432
  }
418
433
  jsBinary = expression;
419
- const updates = {
434
+ const updates = await this.visitChildrenOf(jsBinary, async () => ({
420
435
  prefix: await this.visitSpace(jsBinary.prefix, p),
421
436
  markers: await this.visitMarkers(jsBinary.markers, p),
422
437
  left: await this.visitDefined(jsBinary.left, p),
423
438
  operator: await this.visitLeftPadded(jsBinary.operator, p),
424
439
  right: await this.visitDefined(jsBinary.right, p),
425
440
  type: jsBinary.type && await this.visitType(jsBinary.type, p)
426
- };
441
+ }));
427
442
  return (0, util_1.updateIfChanged)(jsBinary, updates);
428
443
  }
429
444
  async visitLiteralType(literalType, p) {
@@ -432,12 +447,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
432
447
  return expression;
433
448
  }
434
449
  literalType = expression;
435
- const updates = {
450
+ const updates = await this.visitChildrenOf(literalType, async () => ({
436
451
  prefix: await this.visitSpace(literalType.prefix, p),
437
452
  markers: await this.visitMarkers(literalType.markers, p),
438
453
  literal: await this.visitDefined(literalType.literal, p),
439
454
  type: (await this.visitType(literalType.type, p))
440
- };
455
+ }));
441
456
  return (0, util_1.updateIfChanged)(literalType, updates);
442
457
  }
443
458
  async visitMappedType(mappedType, p) {
@@ -446,7 +461,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
446
461
  return expression;
447
462
  }
448
463
  mappedType = expression;
449
- const updates = {
464
+ const updates = await this.visitChildrenOf(mappedType, async () => ({
450
465
  prefix: await this.visitSpace(mappedType.prefix, p),
451
466
  markers: await this.visitMarkers(mappedType.markers, p),
452
467
  prefixToken: mappedType.prefixToken && await this.visitLeftPadded(mappedType.prefixToken, p),
@@ -456,7 +471,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
456
471
  hasQuestionToken: await this.visitLeftPadded(mappedType.hasQuestionToken, p),
457
472
  valueType: await this.visitContainer(mappedType.valueType, p),
458
473
  type: mappedType.type && await this.visitType(mappedType.type, p)
459
- };
474
+ }));
460
475
  return (0, util_1.updateIfChanged)(mappedType, updates);
461
476
  }
462
477
  async visitMappedTypeKeysRemapping(keysRemapping, p) {
@@ -465,12 +480,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
465
480
  return statement;
466
481
  }
467
482
  keysRemapping = statement;
468
- const updates = {
483
+ const updates = await this.visitChildrenOf(keysRemapping, async () => ({
469
484
  prefix: await this.visitSpace(keysRemapping.prefix, p),
470
485
  markers: await this.visitMarkers(keysRemapping.markers, p),
471
486
  typeParameter: await this.visitRightPadded(keysRemapping.typeParameter, p),
472
487
  nameType: keysRemapping.nameType && await this.visitRightPadded(keysRemapping.nameType, p)
473
- };
488
+ }));
474
489
  return (0, util_1.updateIfChanged)(keysRemapping, updates);
475
490
  }
476
491
  async visitMappedTypeParameter(mappedTypeParameter, p) {
@@ -479,12 +494,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
479
494
  return statement;
480
495
  }
481
496
  mappedTypeParameter = statement;
482
- const updates = {
497
+ const updates = await this.visitChildrenOf(mappedTypeParameter, async () => ({
483
498
  prefix: await this.visitSpace(mappedTypeParameter.prefix, p),
484
499
  markers: await this.visitMarkers(mappedTypeParameter.markers, p),
485
500
  name: await this.visitDefined(mappedTypeParameter.name, p),
486
501
  iterateType: await this.visitLeftPadded(mappedTypeParameter.iterateType, p)
487
- };
502
+ }));
488
503
  return (0, util_1.updateIfChanged)(mappedTypeParameter, updates);
489
504
  }
490
505
  async visitObjectBindingPattern(objectBindingPattern, p) {
@@ -493,7 +508,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
493
508
  return expression;
494
509
  }
495
510
  objectBindingPattern = expression;
496
- const updates = {
511
+ const updates = await this.visitChildrenOf(objectBindingPattern, async () => ({
497
512
  prefix: await this.visitSpace(objectBindingPattern.prefix, p),
498
513
  markers: await this.visitMarkers(objectBindingPattern.markers, p),
499
514
  leadingAnnotations: await (0, util_1.mapAsync)(objectBindingPattern.leadingAnnotations, item => this.visitDefined(item, p)),
@@ -501,7 +516,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
501
516
  typeExpression: objectBindingPattern.typeExpression && await this.visitDefined(objectBindingPattern.typeExpression, p),
502
517
  bindings: await this.visitContainer(objectBindingPattern.bindings, p),
503
518
  initializer: objectBindingPattern.initializer && await this.visitLeftPadded(objectBindingPattern.initializer, p)
504
- };
519
+ }));
505
520
  return (0, util_1.updateIfChanged)(objectBindingPattern, updates);
506
521
  }
507
522
  async visitPropertyAssignment(propertyAssignment, p) {
@@ -510,13 +525,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
510
525
  return statement;
511
526
  }
512
527
  propertyAssignment = statement;
513
- const updates = {
528
+ const updates = await this.visitChildrenOf(propertyAssignment, async () => ({
514
529
  prefix: await this.visitSpace(propertyAssignment.prefix, p),
515
530
  markers: await this.visitMarkers(propertyAssignment.markers, p),
516
531
  modifiers: await (0, util_1.mapAsync)(propertyAssignment.modifiers, m => this.visitDefined(m, p)),
517
532
  name: await this.visitRightPadded(propertyAssignment.name, p),
518
533
  initializer: propertyAssignment.initializer && await this.visitDefined(propertyAssignment.initializer, p)
519
- };
534
+ }));
520
535
  return (0, util_1.updateIfChanged)(propertyAssignment, updates);
521
536
  }
522
537
  async visitSatisfiesExpression(satisfiesExpression, p) {
@@ -525,13 +540,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
525
540
  return expression;
526
541
  }
527
542
  satisfiesExpression = expression;
528
- const updates = {
543
+ const updates = await this.visitChildrenOf(satisfiesExpression, async () => ({
529
544
  prefix: await this.visitSpace(satisfiesExpression.prefix, p),
530
545
  markers: await this.visitMarkers(satisfiesExpression.markers, p),
531
546
  expression: await this.visitDefined(satisfiesExpression.expression, p),
532
547
  satisfiesType: await this.visitLeftPadded(satisfiesExpression.satisfiesType, p),
533
548
  type: satisfiesExpression.type && await this.visitType(satisfiesExpression.type, p)
534
- };
549
+ }));
535
550
  return (0, util_1.updateIfChanged)(satisfiesExpression, updates);
536
551
  }
537
552
  async visitScopedVariableDeclarations(scopedVariableDeclarations, p) {
@@ -540,12 +555,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
540
555
  return statement;
541
556
  }
542
557
  scopedVariableDeclarations = statement;
543
- const updates = {
558
+ const updates = await this.visitChildrenOf(scopedVariableDeclarations, async () => ({
544
559
  prefix: await this.visitSpace(scopedVariableDeclarations.prefix, p),
545
560
  markers: await this.visitMarkers(scopedVariableDeclarations.markers, p),
546
561
  modifiers: await (0, util_1.mapAsync)(scopedVariableDeclarations.modifiers, item => this.visitDefined(item, p)),
547
562
  variables: await (0, util_1.mapAsync)(scopedVariableDeclarations.variables, item => this.visitRightPadded(item, p))
548
- };
563
+ }));
549
564
  return (0, util_1.updateIfChanged)(scopedVariableDeclarations, updates);
550
565
  }
551
566
  async visitShebang(shebang, p) {
@@ -566,12 +581,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
566
581
  return statement;
567
582
  }
568
583
  spread = statement;
569
- const updates = {
584
+ const updates = await this.visitChildrenOf(spread, async () => ({
570
585
  prefix: await this.visitSpace(spread.prefix, p),
571
586
  markers: await this.visitMarkers(spread.markers, p),
572
587
  expression: await this.visitDefined(spread.expression, p),
573
588
  type: await this.visitType(spread.type, p)
574
- };
589
+ }));
575
590
  return (0, util_1.updateIfChanged)(spread, updates);
576
591
  }
577
592
  async visitStatementExpression(statementExpression, p) {
@@ -585,11 +600,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
585
600
  return statement;
586
601
  }
587
602
  statementExpression = statement;
588
- const updates = {
603
+ const updates = await this.visitChildrenOf(statementExpression, async () => ({
589
604
  prefix: await this.visitSpace(statementExpression.prefix, p),
590
605
  markers: await this.visitMarkers(statementExpression.markers, p),
591
606
  statement: await this.visitDefined(statementExpression.statement, p)
592
- };
607
+ }));
593
608
  return (0, util_1.updateIfChanged)(statementExpression, updates);
594
609
  }
595
610
  async visitTaggedTemplateExpression(taggedTemplateExpression, p) {
@@ -603,14 +618,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
603
618
  return statement;
604
619
  }
605
620
  taggedTemplateExpression = statement;
606
- const updates = {
621
+ const updates = await this.visitChildrenOf(taggedTemplateExpression, async () => ({
607
622
  prefix: await this.visitSpace(taggedTemplateExpression.prefix, p),
608
623
  markers: await this.visitMarkers(taggedTemplateExpression.markers, p),
609
624
  tag: taggedTemplateExpression.tag && await this.visitRightPadded(taggedTemplateExpression.tag, p),
610
625
  typeArguments: taggedTemplateExpression.typeArguments && await this.visitContainer(taggedTemplateExpression.typeArguments, p),
611
626
  templateExpression: await this.visitDefined(taggedTemplateExpression.templateExpression, p),
612
627
  type: taggedTemplateExpression.type && await this.visitType(taggedTemplateExpression.type, p)
613
- };
628
+ }));
614
629
  return (0, util_1.updateIfChanged)(taggedTemplateExpression, updates);
615
630
  }
616
631
  async visitTemplateExpression(templateExpression, p) {
@@ -624,13 +639,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
624
639
  return statement;
625
640
  }
626
641
  templateExpression = statement;
627
- const updates = {
642
+ const updates = await this.visitChildrenOf(templateExpression, async () => ({
628
643
  prefix: await this.visitSpace(templateExpression.prefix, p),
629
644
  markers: await this.visitMarkers(templateExpression.markers, p),
630
645
  head: await this.visitDefined(templateExpression.head, p),
631
646
  spans: await (0, util_1.mapAsync)(templateExpression.spans, item => this.visitRightPadded(item, p)),
632
647
  type: templateExpression.type && await this.visitType(templateExpression.type, p)
633
- };
648
+ }));
634
649
  return (0, util_1.updateIfChanged)(templateExpression, updates);
635
650
  }
636
651
  async visitTemplateExpressionSpan(span, p) {
@@ -648,12 +663,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
648
663
  return expression;
649
664
  }
650
665
  tuple = expression;
651
- const updates = {
666
+ const updates = await this.visitChildrenOf(tuple, async () => ({
652
667
  prefix: await this.visitSpace(tuple.prefix, p),
653
668
  markers: await this.visitMarkers(tuple.markers, p),
654
669
  elements: await this.visitContainer(tuple.elements, p),
655
670
  type: tuple.type && await this.visitType(tuple.type, p)
656
- };
671
+ }));
657
672
  return (0, util_1.updateIfChanged)(tuple, updates);
658
673
  }
659
674
  async visitTypeDeclaration(typeDeclaration, p) {
@@ -662,7 +677,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
662
677
  return statement;
663
678
  }
664
679
  typeDeclaration = statement;
665
- const updates = {
680
+ const updates = await this.visitChildrenOf(typeDeclaration, async () => ({
666
681
  prefix: await this.visitSpace(typeDeclaration.prefix, p),
667
682
  markers: await this.visitMarkers(typeDeclaration.markers, p),
668
683
  modifiers: await (0, util_1.mapAsync)(typeDeclaration.modifiers, item => this.visitDefined(item, p)),
@@ -670,7 +685,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
670
685
  typeParameters: typeDeclaration.typeParameters && await this.visitDefined(typeDeclaration.typeParameters, p),
671
686
  initializer: await this.visitLeftPadded(typeDeclaration.initializer, p),
672
687
  type: typeDeclaration.type && await this.visitType(typeDeclaration.type, p)
673
- };
688
+ }));
674
689
  return (0, util_1.updateIfChanged)(typeDeclaration, updates);
675
690
  }
676
691
  async visitTypeOf(typeOf, p) {
@@ -679,12 +694,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
679
694
  return expression;
680
695
  }
681
696
  typeOf = expression;
682
- const updates = {
697
+ const updates = await this.visitChildrenOf(typeOf, async () => ({
683
698
  prefix: await this.visitSpace(typeOf.prefix, p),
684
699
  markers: await this.visitMarkers(typeOf.markers, p),
685
700
  expression: await this.visitDefined(typeOf.expression, p),
686
701
  type: typeOf.type && await this.visitType(typeOf.type, p)
687
- };
702
+ }));
688
703
  return (0, util_1.updateIfChanged)(typeOf, updates);
689
704
  }
690
705
  async visitTypeTreeExpression(typeTreeExpression, p) {
@@ -693,11 +708,18 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
693
708
  return expression;
694
709
  }
695
710
  typeTreeExpression = expression;
696
- const updates = {
711
+ const updates = await this.visitChildrenOf(typeTreeExpression, async () => ({
697
712
  prefix: await this.visitSpace(typeTreeExpression.prefix, p),
698
713
  markers: await this.visitMarkers(typeTreeExpression.markers, p),
699
714
  expression: await this.visitDefined(typeTreeExpression.expression, p)
700
- };
715
+ }));
716
+ // The parser wraps no type tree, so a visit that makes the expression one drops the wrapper
717
+ const visited = updates.expression;
718
+ if (visited !== typeTreeExpression.expression && (visited.kind === java_1.J.Kind.Identifier ||
719
+ visited.kind === java_1.J.Kind.FieldAccess || visited.kind === java_1.J.Kind.ArrayType ||
720
+ visited.kind === java_1.J.Kind.ParameterizedType)) {
721
+ return Object.assign(Object.assign({}, visited), { prefix: concatenated(updates.prefix, visited.prefix), markers: withOuterMarkers(updates.markers, visited.markers) });
722
+ }
701
723
  return (0, util_1.updateIfChanged)(typeTreeExpression, updates);
702
724
  }
703
725
  async visitAssignmentOperationExtensions(assignmentOperation, p) {
@@ -711,14 +733,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
711
733
  return statement;
712
734
  }
713
735
  assignmentOperation = statement;
714
- const updates = {
736
+ const updates = await this.visitChildrenOf(assignmentOperation, async () => ({
715
737
  prefix: await this.visitSpace(assignmentOperation.prefix, p),
716
738
  markers: await this.visitMarkers(assignmentOperation.markers, p),
717
739
  variable: await this.visitDefined(assignmentOperation.variable, p),
718
740
  operator: await this.visitLeftPadded(assignmentOperation.operator, p),
719
741
  assignment: await this.visitDefined(assignmentOperation.assignment, p),
720
742
  type: assignmentOperation.type && await this.visitType(assignmentOperation.type, p)
721
- };
743
+ }));
722
744
  return (0, util_1.updateIfChanged)(assignmentOperation, updates);
723
745
  }
724
746
  async visitIndexedAccessType(indexedAccessType, p) {
@@ -727,13 +749,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
727
749
  return expression;
728
750
  }
729
751
  indexedAccessType = expression;
730
- const updates = {
752
+ const updates = await this.visitChildrenOf(indexedAccessType, async () => ({
731
753
  prefix: await this.visitSpace(indexedAccessType.prefix, p),
732
754
  markers: await this.visitMarkers(indexedAccessType.markers, p),
733
755
  objectType: await this.visitDefined(indexedAccessType.objectType, p),
734
756
  indexType: await this.visitDefined(indexedAccessType.indexType, p),
735
757
  type: indexedAccessType.type && await this.visitType(indexedAccessType.type, p)
736
- };
758
+ }));
737
759
  return (0, util_1.updateIfChanged)(indexedAccessType, updates);
738
760
  }
739
761
  async visitIndexedAccessTypeIndexType(indexType, p) {
@@ -742,12 +764,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
742
764
  return expression;
743
765
  }
744
766
  indexType = expression;
745
- const updates = {
767
+ const updates = await this.visitChildrenOf(indexType, async () => ({
746
768
  prefix: await this.visitSpace(indexType.prefix, p),
747
769
  markers: await this.visitMarkers(indexType.markers, p),
748
770
  element: await this.visitRightPadded(indexType.element, p),
749
771
  type: indexType.type && await this.visitType(indexType.type, p)
750
- };
772
+ }));
751
773
  return (0, util_1.updateIfChanged)(indexType, updates);
752
774
  }
753
775
  async visitTypeQuery(typeQuery, p) {
@@ -756,13 +778,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
756
778
  return expression;
757
779
  }
758
780
  typeQuery = expression;
759
- const updates = {
781
+ const updates = await this.visitChildrenOf(typeQuery, async () => ({
760
782
  prefix: await this.visitSpace(typeQuery.prefix, p),
761
783
  markers: await this.visitMarkers(typeQuery.markers, p),
762
784
  typeExpression: await this.visitDefined(typeQuery.typeExpression, p),
763
785
  typeArguments: typeQuery.typeArguments && await this.visitContainer(typeQuery.typeArguments, p),
764
786
  type: typeQuery.type && await this.visitType(typeQuery.type, p)
765
- };
787
+ }));
766
788
  return (0, util_1.updateIfChanged)(typeQuery, updates);
767
789
  }
768
790
  async visitTypeInfo(typeInfo, p) {
@@ -771,11 +793,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
771
793
  return expression;
772
794
  }
773
795
  typeInfo = expression;
774
- const updates = {
796
+ const updates = await this.visitChildrenOf(typeInfo, async () => ({
775
797
  prefix: await this.visitSpace(typeInfo.prefix, p),
776
798
  markers: await this.visitMarkers(typeInfo.markers, p),
777
799
  typeIdentifier: await this.visitDefined(typeInfo.typeIdentifier, p)
778
- };
800
+ }));
779
801
  return (0, util_1.updateIfChanged)(typeInfo, updates);
780
802
  }
781
803
  async visitComputedPropertyName(computedPropertyName, p) {
@@ -784,11 +806,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
784
806
  return expression;
785
807
  }
786
808
  computedPropertyName = expression;
787
- const updates = {
809
+ const updates = await this.visitChildrenOf(computedPropertyName, async () => ({
788
810
  prefix: await this.visitSpace(computedPropertyName.prefix, p),
789
811
  markers: await this.visitMarkers(computedPropertyName.markers, p),
790
812
  expression: await this.visitRightPadded(computedPropertyName.expression, p)
791
- };
813
+ }));
792
814
  return (0, util_1.updateIfChanged)(computedPropertyName, updates);
793
815
  }
794
816
  async visitTypeOperator(typeOperator, p) {
@@ -797,11 +819,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
797
819
  return expression;
798
820
  }
799
821
  typeOperator = expression;
800
- const updates = {
822
+ const updates = await this.visitChildrenOf(typeOperator, async () => ({
801
823
  prefix: await this.visitSpace(typeOperator.prefix, p),
802
824
  markers: await this.visitMarkers(typeOperator.markers, p),
803
825
  expression: await this.visitLeftPadded(typeOperator.expression, p)
804
- };
826
+ }));
805
827
  return (0, util_1.updateIfChanged)(typeOperator, updates);
806
828
  }
807
829
  async visitTypePredicate(typePredicate, p) {
@@ -810,14 +832,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
810
832
  return expression;
811
833
  }
812
834
  typePredicate = expression;
813
- const updates = {
835
+ const updates = await this.visitChildrenOf(typePredicate, async () => ({
814
836
  prefix: await this.visitSpace(typePredicate.prefix, p),
815
837
  markers: await this.visitMarkers(typePredicate.markers, p),
816
838
  asserts: await this.visitLeftPadded(typePredicate.asserts, p),
817
839
  parameterName: await this.visitDefined(typePredicate.parameterName, p),
818
840
  expression: typePredicate.expression && await this.visitLeftPadded(typePredicate.expression, p),
819
841
  type: typePredicate.type && await this.visitType(typePredicate.type, p)
820
- };
842
+ }));
821
843
  return (0, util_1.updateIfChanged)(typePredicate, updates);
822
844
  }
823
845
  async visitUnion(union, p) {
@@ -826,12 +848,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
826
848
  return expression;
827
849
  }
828
850
  union = expression;
829
- const updates = {
851
+ const updates = await this.visitChildrenOf(union, async () => ({
830
852
  prefix: await this.visitSpace(union.prefix, p),
831
853
  markers: await this.visitMarkers(union.markers, p),
832
854
  types: await (0, util_1.mapAsync)(union.types, item => this.visitRightPadded(item, p)),
833
855
  type: union.type && await this.visitType(union.type, p)
834
- };
856
+ }));
835
857
  return (0, util_1.updateIfChanged)(union, updates);
836
858
  }
837
859
  async visitIntersection(intersection, p) {
@@ -840,12 +862,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
840
862
  return expression;
841
863
  }
842
864
  intersection = expression;
843
- const updates = {
865
+ const updates = await this.visitChildrenOf(intersection, async () => ({
844
866
  prefix: await this.visitSpace(intersection.prefix, p),
845
867
  markers: await this.visitMarkers(intersection.markers, p),
846
868
  types: await (0, util_1.mapAsync)(intersection.types, item => this.visitRightPadded(item, p)),
847
869
  type: intersection.type && await this.visitType(intersection.type, p)
848
- };
870
+ }));
849
871
  return (0, util_1.updateIfChanged)(intersection, updates);
850
872
  }
851
873
  async visitVoid(void_, p) {
@@ -854,11 +876,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
854
876
  return expression;
855
877
  }
856
878
  void_ = expression;
857
- const updates = {
879
+ const updates = await this.visitChildrenOf(void_, async () => ({
858
880
  prefix: await this.visitSpace(void_.prefix, p),
859
881
  markers: await this.visitMarkers(void_.markers, p),
860
882
  expression: await this.visitDefined(void_.expression, p)
861
- };
883
+ }));
862
884
  return (0, util_1.updateIfChanged)(void_, updates);
863
885
  }
864
886
  async visitWithStatement(withStatement, p) {
@@ -867,12 +889,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
867
889
  return statement;
868
890
  }
869
891
  withStatement = statement;
870
- const updates = {
892
+ const updates = await this.visitChildrenOf(withStatement, async () => ({
871
893
  prefix: await this.visitSpace(withStatement.prefix, p),
872
894
  markers: await this.visitMarkers(withStatement.markers, p),
873
895
  expression: await this.visitDefined(withStatement.expression, p),
874
896
  body: await this.visitRightPadded(withStatement.body, p)
875
- };
897
+ }));
876
898
  return (0, util_1.updateIfChanged)(withStatement, updates);
877
899
  }
878
900
  async visitIndexSignatureDeclaration(indexSignatureDeclaration, p) {
@@ -881,14 +903,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
881
903
  return statement;
882
904
  }
883
905
  indexSignatureDeclaration = statement;
884
- const updates = {
906
+ const updates = await this.visitChildrenOf(indexSignatureDeclaration, async () => ({
885
907
  prefix: await this.visitSpace(indexSignatureDeclaration.prefix, p),
886
908
  markers: await this.visitMarkers(indexSignatureDeclaration.markers, p),
887
909
  modifiers: await (0, util_1.mapAsync)(indexSignatureDeclaration.modifiers, item => this.visitDefined(item, p)),
888
910
  parameters: await this.visitContainer(indexSignatureDeclaration.parameters, p),
889
911
  typeExpression: await this.visitLeftPadded(indexSignatureDeclaration.typeExpression, p),
890
912
  type: indexSignatureDeclaration.type && await this.visitType(indexSignatureDeclaration.type, p)
891
- };
913
+ }));
892
914
  return (0, util_1.updateIfChanged)(indexSignatureDeclaration, updates);
893
915
  }
894
916
  async visitComputedPropertyMethodDeclaration(computedPropMethod, p) {
@@ -897,7 +919,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
897
919
  return statement;
898
920
  }
899
921
  computedPropMethod = statement;
900
- const updates = {
922
+ const updates = await this.visitChildrenOf(computedPropMethod, async () => ({
901
923
  prefix: await this.visitSpace(computedPropMethod.prefix, p),
902
924
  markers: await this.visitMarkers(computedPropMethod.markers, p),
903
925
  leadingAnnotations: await (0, util_1.mapAsync)(computedPropMethod.leadingAnnotations, item => this.visitDefined(item, p)),
@@ -908,7 +930,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
908
930
  parameters: await this.visitContainer(computedPropMethod.parameters, p),
909
931
  body: computedPropMethod.body && await this.visitDefined(computedPropMethod.body, p),
910
932
  methodType: computedPropMethod.methodType && await this.visitType(computedPropMethod.methodType, p)
911
- };
933
+ }));
912
934
  return (0, util_1.updateIfChanged)(computedPropMethod, updates);
913
935
  }
914
936
  async visitForOfLoop(forOfLoop, p) {
@@ -917,12 +939,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
917
939
  return statement;
918
940
  }
919
941
  forOfLoop = statement;
920
- const updates = {
942
+ const updates = await this.visitChildrenOf(forOfLoop, async () => ({
921
943
  prefix: await this.visitSpace(forOfLoop.prefix, p),
922
944
  markers: await this.visitMarkers(forOfLoop.markers, p),
923
945
  await: forOfLoop.await && await this.visitSpace(forOfLoop.await, p),
924
946
  loop: await this.visitDefined(forOfLoop.loop, p)
925
- };
947
+ }));
926
948
  return (0, util_1.updateIfChanged)(forOfLoop, updates);
927
949
  }
928
950
  async visitForInLoop(forInLoop, p) {
@@ -931,12 +953,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
931
953
  return statement;
932
954
  }
933
955
  forInLoop = statement;
934
- const updates = {
956
+ const updates = await this.visitChildrenOf(forInLoop, async () => ({
935
957
  prefix: await this.visitSpace(forInLoop.prefix, p),
936
958
  markers: await this.visitMarkers(forInLoop.markers, p),
937
959
  control: await this.visitDefined(forInLoop.control, p),
938
960
  body: await this.visitRightPadded(forInLoop.body, p)
939
- };
961
+ }));
940
962
  return (0, util_1.updateIfChanged)(forInLoop, updates);
941
963
  }
942
964
  async visitNamespaceDeclaration(namespaceDeclaration, p) {
@@ -945,14 +967,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
945
967
  return statement;
946
968
  }
947
969
  namespaceDeclaration = statement;
948
- const updates = {
970
+ const updates = await this.visitChildrenOf(namespaceDeclaration, async () => ({
949
971
  prefix: await this.visitSpace(namespaceDeclaration.prefix, p),
950
972
  markers: await this.visitMarkers(namespaceDeclaration.markers, p),
951
973
  modifiers: await (0, util_1.mapAsync)(namespaceDeclaration.modifiers, item => this.visitDefined(item, p)),
952
974
  keywordType: await this.visitLeftPadded(namespaceDeclaration.keywordType, p),
953
975
  name: await this.visitRightPadded(namespaceDeclaration.name, p),
954
976
  body: namespaceDeclaration.body && await this.visitDefined(namespaceDeclaration.body, p)
955
- };
977
+ }));
956
978
  return (0, util_1.updateIfChanged)(namespaceDeclaration, updates);
957
979
  }
958
980
  async visitTypeLiteral(typeLiteral, p) {
@@ -961,12 +983,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
961
983
  return expression;
962
984
  }
963
985
  typeLiteral = expression;
964
- const updates = {
986
+ const updates = await this.visitChildrenOf(typeLiteral, async () => ({
965
987
  prefix: await this.visitSpace(typeLiteral.prefix, p),
966
988
  markers: await this.visitMarkers(typeLiteral.markers, p),
967
989
  members: await this.visitDefined(typeLiteral.members, p),
968
990
  type: typeLiteral.type && await this.visitType(typeLiteral.type, p)
969
- };
991
+ }));
970
992
  return (0, util_1.updateIfChanged)(typeLiteral, updates);
971
993
  }
972
994
  async visitArrayBindingPattern(arrayBindingPattern, p) {
@@ -975,12 +997,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
975
997
  return expression;
976
998
  }
977
999
  arrayBindingPattern = expression;
978
- const updates = {
1000
+ const updates = await this.visitChildrenOf(arrayBindingPattern, async () => ({
979
1001
  prefix: await this.visitSpace(arrayBindingPattern.prefix, p),
980
1002
  markers: await this.visitMarkers(arrayBindingPattern.markers, p),
981
1003
  elements: await this.visitContainer(arrayBindingPattern.elements, p),
982
1004
  type: arrayBindingPattern.type && await this.visitType(arrayBindingPattern.type, p)
983
- };
1005
+ }));
984
1006
  return (0, util_1.updateIfChanged)(arrayBindingPattern, updates);
985
1007
  }
986
1008
  async visitBindingElement(bindingElement, p) {
@@ -989,14 +1011,14 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
989
1011
  return statement;
990
1012
  }
991
1013
  bindingElement = statement;
992
- const updates = {
1014
+ const updates = await this.visitChildrenOf(bindingElement, async () => ({
993
1015
  prefix: await this.visitSpace(bindingElement.prefix, p),
994
1016
  markers: await this.visitMarkers(bindingElement.markers, p),
995
1017
  propertyName: bindingElement.propertyName && await this.visitRightPadded(bindingElement.propertyName, p),
996
1018
  name: await this.visitDefined(bindingElement.name, p),
997
1019
  initializer: bindingElement.initializer && await this.visitLeftPadded(bindingElement.initializer, p),
998
1020
  variableType: bindingElement.variableType && await this.visitType(bindingElement.variableType, p)
999
- };
1021
+ }));
1000
1022
  return (0, util_1.updateIfChanged)(bindingElement, updates);
1001
1023
  }
1002
1024
  async visitExportDeclaration(exportDeclaration, p) {
@@ -1005,7 +1027,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1005
1027
  return statement;
1006
1028
  }
1007
1029
  exportDeclaration = statement;
1008
- const updates = {
1030
+ const updates = await this.visitChildrenOf(exportDeclaration, async () => ({
1009
1031
  prefix: await this.visitSpace(exportDeclaration.prefix, p),
1010
1032
  markers: await this.visitMarkers(exportDeclaration.markers, p),
1011
1033
  modifiers: await (0, util_1.mapAsync)(exportDeclaration.modifiers, item => this.visitDefined(item, p)),
@@ -1013,7 +1035,7 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1013
1035
  exportClause: exportDeclaration.exportClause && await this.visitDefined(exportDeclaration.exportClause, p),
1014
1036
  moduleSpecifier: exportDeclaration.moduleSpecifier && await this.visitLeftPadded(exportDeclaration.moduleSpecifier, p),
1015
1037
  attributes: exportDeclaration.attributes && await this.visitDefined(exportDeclaration.attributes, p)
1016
- };
1038
+ }));
1017
1039
  return (0, util_1.updateIfChanged)(exportDeclaration, updates);
1018
1040
  }
1019
1041
  async visitExportAssignment(exportAssignment, p) {
@@ -1022,11 +1044,11 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1022
1044
  return statement;
1023
1045
  }
1024
1046
  exportAssignment = statement;
1025
- const updates = {
1047
+ const updates = await this.visitChildrenOf(exportAssignment, async () => ({
1026
1048
  prefix: await this.visitSpace(exportAssignment.prefix, p),
1027
1049
  markers: await this.visitMarkers(exportAssignment.markers, p),
1028
1050
  expression: await this.visitLeftPadded(exportAssignment.expression, p)
1029
- };
1051
+ }));
1030
1052
  return (0, util_1.updateIfChanged)(exportAssignment, updates);
1031
1053
  }
1032
1054
  async visitNamedExports(namedExports, p) {
@@ -1035,12 +1057,12 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1035
1057
  return expression;
1036
1058
  }
1037
1059
  namedExports = expression;
1038
- const updates = {
1060
+ const updates = await this.visitChildrenOf(namedExports, async () => ({
1039
1061
  prefix: await this.visitSpace(namedExports.prefix, p),
1040
1062
  markers: await this.visitMarkers(namedExports.markers, p),
1041
1063
  elements: await this.visitContainer(namedExports.elements, p),
1042
1064
  type: namedExports.type && await this.visitType(namedExports.type, p)
1043
- };
1065
+ }));
1044
1066
  return (0, util_1.updateIfChanged)(namedExports, updates);
1045
1067
  }
1046
1068
  async visitExportSpecifier(exportSpecifier, p) {
@@ -1049,13 +1071,13 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1049
1071
  return expression;
1050
1072
  }
1051
1073
  exportSpecifier = expression;
1052
- const updates = {
1074
+ const updates = await this.visitChildrenOf(exportSpecifier, async () => ({
1053
1075
  prefix: await this.visitSpace(exportSpecifier.prefix, p),
1054
1076
  markers: await this.visitMarkers(exportSpecifier.markers, p),
1055
1077
  typeOnly: await this.visitLeftPadded(exportSpecifier.typeOnly, p),
1056
1078
  specifier: await this.visitDefined(exportSpecifier.specifier, p),
1057
1079
  type: exportSpecifier.type && await this.visitType(exportSpecifier.type, p)
1058
- };
1080
+ }));
1059
1081
  return (0, util_1.updateIfChanged)(exportSpecifier, updates);
1060
1082
  }
1061
1083
  static createJavaScriptDispatch() {
@@ -1140,4 +1162,17 @@ class JavaScriptVisitor extends java_1.JavaVisitor {
1140
1162
  }
1141
1163
  }
1142
1164
  exports.JavaScriptVisitor = JavaScriptVisitor;
1165
+ /** The prefix that prints as `outer` and then `inner`. */
1166
+ function concatenated(outer, inner) {
1167
+ if (outer.comments.length === 0) {
1168
+ return Object.assign(Object.assign({}, inner), { whitespace: outer.whitespace + inner.whitespace });
1169
+ }
1170
+ const last = outer.comments[outer.comments.length - 1];
1171
+ return Object.assign(Object.assign({}, outer), { comments: [...outer.comments.slice(0, -1), Object.assign(Object.assign({}, last), { suffix: last.suffix + inner.whitespace }), ...inner.comments] });
1172
+ }
1173
+ /** `inner`, led by each marker of `outer` it does not already hold, so they print as they did around it. */
1174
+ function withOuterMarkers(outer, inner) {
1175
+ const added = outer.markers.filter(marker => !inner.markers.some(own => own.id === marker.id));
1176
+ return added.length === 0 ? inner : Object.assign(Object.assign({}, inner), { markers: [...added, ...inner.markers] });
1177
+ }
1143
1178
  //# sourceMappingURL=visitor.js.map