prettier-plugin-java 2.6.1 → 2.6.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.
@@ -0,0 +1,590 @@
1
+ import forEach from "lodash/forEach.js";
2
+ import { builders, utils } from "prettier/doc";
3
+ import { BaseCstPrettierPrinter } from "../base-cst-printer.js";
4
+ import { isAnnotationCstNode } from "../types/utils.js";
5
+ import { printArgumentListWithBraces } from "../utils/index.js";
6
+ import { printTokenWithComments } from "./comments/format-comments.js";
7
+ import { handleCommentsBinaryExpression, handleCommentsParameters } from "./comments/handle-comments.js";
8
+ import { concat, dedent, group, indent } from "./prettier-builder.js";
9
+ import { binary, findDeepElementInPartsArray, isExplicitLambdaParameter, isUniqueMethodInvocation, putIntoBraces, rejectAndConcat, rejectAndJoin, rejectAndJoinSeps, sortAnnotationIdentifier, sortNodes, sortTokens } from "./printer-utils.js";
10
+ const { breakParent, conditionalGroup, ifBreak, label, line, lineSuffixBoundary, softline } = builders;
11
+ const { removeLines, willBreak } = utils;
12
+ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
13
+ expression(ctx, params) {
14
+ const expression = this.visitSingle(ctx, params);
15
+ return (params === null || params === void 0 ? void 0 : params.hug) && expression.label !== undefined
16
+ ? label(expression.label, expression)
17
+ : expression;
18
+ }
19
+ lambdaExpression(ctx, params) {
20
+ const lambdaParameters = group(this.visit(ctx.lambdaParameters));
21
+ const lambdaBody = this.visit(ctx.lambdaBody);
22
+ const isLambdaBodyABlock = ctx.lambdaBody[0].children.block !== undefined;
23
+ const suffix = [
24
+ " ",
25
+ ctx.Arrow[0],
26
+ ...(isLambdaBodyABlock
27
+ ? [" ", lambdaBody]
28
+ : [group(indent([line, lambdaBody]))])
29
+ ];
30
+ if (params === null || params === void 0 ? void 0 : params.hug) {
31
+ return willBreak(lambdaParameters)
32
+ ? label({ huggable: false }, concat([lambdaParameters, ...suffix]))
33
+ : concat([removeLines(lambdaParameters), ...suffix]);
34
+ }
35
+ return concat([lambdaParameters, ...suffix]);
36
+ }
37
+ lambdaParameters(ctx) {
38
+ if (ctx.lambdaParametersWithBraces) {
39
+ return this.visitSingle(ctx);
40
+ }
41
+ return printTokenWithComments(this.getSingle(ctx));
42
+ }
43
+ lambdaParametersWithBraces(ctx) {
44
+ var _a, _b, _c, _d, _e, _f;
45
+ const lambdaParameters = (_f = (_c = (_b = (_a = ctx.lambdaParameterList) === null || _a === void 0 ? void 0 : _a[0].children.normalLambdaParameterList) === null || _b === void 0 ? void 0 : _b[0].children.normalLambdaParameter) !== null && _c !== void 0 ? _c : (_e = (_d = ctx.lambdaParameterList) === null || _d === void 0 ? void 0 : _d[0].children.conciseLambdaParameterList) === null || _e === void 0 ? void 0 : _e[0].children.conciseLambdaParameter) !== null && _f !== void 0 ? _f : [];
46
+ handleCommentsParameters(ctx.LBrace[0], lambdaParameters, ctx.RBrace[0]);
47
+ const lambdaParameterList = this.visit(ctx.lambdaParameterList);
48
+ if (findDeepElementInPartsArray(lambdaParameterList, ",")) {
49
+ return concat([
50
+ ctx.LBrace[0],
51
+ indent([softline, lambdaParameterList]),
52
+ softline,
53
+ ctx.RBrace[0]
54
+ ]);
55
+ }
56
+ // removing braces when only no comments attached
57
+ if ((ctx.LBrace &&
58
+ ctx.RBrace &&
59
+ (!lambdaParameterList || isExplicitLambdaParameter(ctx))) ||
60
+ ctx.LBrace[0].leadingComments ||
61
+ ctx.LBrace[0].trailingComments ||
62
+ ctx.RBrace[0].leadingComments ||
63
+ ctx.RBrace[0].trailingComments) {
64
+ return rejectAndConcat([
65
+ ctx.LBrace[0],
66
+ lambdaParameterList,
67
+ ctx.RBrace[0]
68
+ ]);
69
+ }
70
+ return lambdaParameterList;
71
+ }
72
+ lambdaParameterList(ctx) {
73
+ return this.visitSingle(ctx);
74
+ }
75
+ conciseLambdaParameterList(ctx) {
76
+ var _a;
77
+ const conciseLambdaParameters = this.mapVisit(ctx.conciseLambdaParameter);
78
+ const commas = (_a = ctx.Comma) === null || _a === void 0 ? void 0 : _a.map(comma => concat([comma, line]));
79
+ return rejectAndJoinSeps(commas, conciseLambdaParameters);
80
+ }
81
+ normalLambdaParameterList(ctx) {
82
+ var _a;
83
+ const normalLambdaParameter = this.mapVisit(ctx.normalLambdaParameter);
84
+ const commas = (_a = ctx.Comma) === null || _a === void 0 ? void 0 : _a.map(comma => concat([comma, line]));
85
+ return rejectAndJoinSeps(commas, normalLambdaParameter);
86
+ }
87
+ normalLambdaParameter(ctx) {
88
+ return this.visitSingle(ctx);
89
+ }
90
+ regularLambdaParameter(ctx) {
91
+ const variableModifier = this.mapVisit(ctx.variableModifier);
92
+ const lambdaParameterType = this.visit(ctx.lambdaParameterType);
93
+ const variableDeclaratorId = this.visit(ctx.variableDeclaratorId);
94
+ return rejectAndJoin(" ", [
95
+ rejectAndJoin(" ", variableModifier),
96
+ lambdaParameterType,
97
+ variableDeclaratorId
98
+ ]);
99
+ }
100
+ lambdaParameterType(ctx) {
101
+ if (ctx.unannType) {
102
+ return this.visitSingle(ctx);
103
+ }
104
+ return printTokenWithComments(this.getSingle(ctx));
105
+ }
106
+ conciseLambdaParameter(ctx) {
107
+ return printTokenWithComments(this.getSingle(ctx));
108
+ }
109
+ lambdaBody(ctx) {
110
+ return this.visitSingle(ctx);
111
+ }
112
+ conditionalExpression(ctx, params) {
113
+ const binaryExpression = this.visit(ctx.binaryExpression, params);
114
+ if (ctx.QuestionMark) {
115
+ const expression1 = this.visit(ctx.expression[0]);
116
+ const expression2 = this.visit(ctx.expression[1]);
117
+ return indent(group(rejectAndConcat([
118
+ rejectAndJoin(line, [
119
+ binaryExpression,
120
+ rejectAndJoin(" ", [ctx.QuestionMark[0], expression1]),
121
+ rejectAndJoin(" ", [ctx.Colon[0], expression2])
122
+ ])
123
+ ])));
124
+ }
125
+ return binaryExpression;
126
+ }
127
+ binaryExpression(ctx, params) {
128
+ handleCommentsBinaryExpression(ctx);
129
+ const sortedNodes = sortNodes([
130
+ ctx.pattern,
131
+ ctx.referenceType,
132
+ ctx.expression,
133
+ ctx.unaryExpression
134
+ ]);
135
+ const nodes = this.mapVisit(sortedNodes, sortedNodes.length === 1 ? params : undefined);
136
+ const tokens = sortTokens([
137
+ ctx.Instanceof,
138
+ ctx.AssignmentOperator,
139
+ ctx.Less,
140
+ ctx.Greater,
141
+ ctx.BinaryOperator
142
+ ]);
143
+ const hasTokens = tokens.length > 0;
144
+ const content = binary(nodes, tokens, true);
145
+ return hasTokens && (params === null || params === void 0 ? void 0 : params.addParenthesisToWrapStatement)
146
+ ? group(concat([
147
+ ifBreak("("),
148
+ indent(concat([softline, content])),
149
+ softline,
150
+ ifBreak(")")
151
+ ]))
152
+ : content;
153
+ }
154
+ unaryExpression(ctx, params) {
155
+ const unaryPrefixOperator = ctx.UnaryPrefixOperator
156
+ ? ctx.UnaryPrefixOperator
157
+ : [];
158
+ const primary = this.visit(ctx.primary, params);
159
+ const unarySuffixOperator = ctx.UnarySuffixOperator
160
+ ? ctx.UnarySuffixOperator
161
+ : [];
162
+ return rejectAndConcat([
163
+ rejectAndConcat(unaryPrefixOperator),
164
+ primary,
165
+ rejectAndConcat(unarySuffixOperator)
166
+ ]);
167
+ }
168
+ unaryExpressionNotPlusMinus(ctx) {
169
+ const unaryPrefixOperatorNotPlusMinus = ctx.UnaryPrefixOperatorNotPlusMinus // changed when moved to TS
170
+ ? rejectAndJoin(" ", ctx.UnaryPrefixOperatorNotPlusMinus) // changed when moved to TS
171
+ : "";
172
+ const primary = this.visit(ctx.primary);
173
+ const unarySuffixOperator = ctx.UnarySuffixOperator // changed when moved to TS
174
+ ? rejectAndJoin(" ", ctx.UnarySuffixOperator) // changed when moved to TS
175
+ : "";
176
+ return rejectAndJoin(" ", [
177
+ unaryPrefixOperatorNotPlusMinus,
178
+ primary,
179
+ unarySuffixOperator
180
+ ]);
181
+ }
182
+ primary(ctx, params) {
183
+ var _a, _b, _c, _d;
184
+ const countMethodInvocation = isUniqueMethodInvocation(ctx.primarySuffix);
185
+ const newExpression = (_a = ctx.primaryPrefix[0].children.newExpression) === null || _a === void 0 ? void 0 : _a[0].children;
186
+ const isBreakableNewExpression = countMethodInvocation <= 1 &&
187
+ this.isBreakableNewExpression(newExpression);
188
+ const fqnOrRefType = (_b = ctx.primaryPrefix[0].children.fqnOrRefType) === null || _b === void 0 ? void 0 : _b[0].children;
189
+ const firstMethodInvocation = (_c = ctx.primarySuffix) === null || _c === void 0 ? void 0 : _c.map(suffix => { var _a; return (_a = suffix.children.methodInvocationSuffix) === null || _a === void 0 ? void 0 : _a[0].children; }).find(methodInvocationSuffix => methodInvocationSuffix);
190
+ const isCapitalizedIdentifier = this.isCapitalizedIdentifier(fqnOrRefType);
191
+ const shouldBreakBeforeFirstMethodInvocation = countMethodInvocation > 1 &&
192
+ !(isCapitalizedIdentifier !== null && isCapitalizedIdentifier !== void 0 ? isCapitalizedIdentifier : true) &&
193
+ firstMethodInvocation !== undefined;
194
+ const shouldBreakBeforeMethodInvocations = shouldBreakBeforeFirstMethodInvocation ||
195
+ countMethodInvocation > 2 ||
196
+ (countMethodInvocation > 1 && newExpression) ||
197
+ !(firstMethodInvocation === null || firstMethodInvocation === void 0 ? void 0 : firstMethodInvocation.argumentList);
198
+ const primaryPrefix = this.visit(ctx.primaryPrefix, Object.assign(Object.assign({}, params), { shouldBreakBeforeFirstMethodInvocation }));
199
+ const suffixes = [];
200
+ if (ctx.primarySuffix !== undefined) {
201
+ // edge case: https://github.com/jhipster/prettier-java/issues/381
202
+ let hasFirstInvocationArg = true;
203
+ if (ctx.primarySuffix.length > 1 &&
204
+ ctx.primarySuffix[1].children.methodInvocationSuffix &&
205
+ Object.keys(ctx.primarySuffix[1].children.methodInvocationSuffix[0].children).length === 2) {
206
+ hasFirstInvocationArg = false;
207
+ }
208
+ if (newExpression &&
209
+ !isBreakableNewExpression &&
210
+ ctx.primarySuffix[0].children.Dot !== undefined) {
211
+ suffixes.push(softline);
212
+ }
213
+ suffixes.push(this.visit(ctx.primarySuffix[0]));
214
+ for (let i = 1; i < ctx.primarySuffix.length; i++) {
215
+ if (shouldBreakBeforeMethodInvocations &&
216
+ ctx.primarySuffix[i].children.Dot !== undefined &&
217
+ ctx.primarySuffix[i - 1].children.methodInvocationSuffix !== undefined) {
218
+ suffixes.push(softline);
219
+ }
220
+ suffixes.push(this.visit(ctx.primarySuffix[i]));
221
+ }
222
+ if (!newExpression && countMethodInvocation === 1) {
223
+ return group(rejectAndConcat([
224
+ primaryPrefix,
225
+ hasFirstInvocationArg ? suffixes[0] : indent(suffixes[0]),
226
+ indent(rejectAndConcat(suffixes.slice(1)))
227
+ ]));
228
+ }
229
+ }
230
+ const methodInvocation = (_d = ctx.primarySuffix) === null || _d === void 0 ? void 0 : _d[0].children.methodInvocationSuffix;
231
+ const isMethodInvocationWithArguments = (methodInvocation === null || methodInvocation === void 0 ? void 0 : methodInvocation[0].children.argumentList) !== undefined;
232
+ const isUnqualifiedMethodInvocation = methodInvocation !== undefined && !(fqnOrRefType === null || fqnOrRefType === void 0 ? void 0 : fqnOrRefType.Dot);
233
+ return group(rejectAndConcat([
234
+ primaryPrefix,
235
+ isCapitalizedIdentifier || isUnqualifiedMethodInvocation
236
+ ? suffixes.shift()
237
+ : "",
238
+ !isBreakableNewExpression &&
239
+ (shouldBreakBeforeMethodInvocations || !isMethodInvocationWithArguments)
240
+ ? indent(concat(suffixes))
241
+ : concat(suffixes)
242
+ ]));
243
+ }
244
+ primaryPrefix(ctx, params) {
245
+ if (ctx.This || ctx.Void) {
246
+ return printTokenWithComments(this.getSingle(ctx));
247
+ }
248
+ return this.visitSingle(ctx, params);
249
+ }
250
+ primarySuffix(ctx, params) {
251
+ var _a;
252
+ if (ctx.Dot) {
253
+ if (ctx.This) {
254
+ return rejectAndConcat([ctx.Dot[0], ctx.This[0]]);
255
+ }
256
+ else if (ctx.Identifier) {
257
+ const typeArguments = this.visit(ctx.typeArguments);
258
+ return rejectAndConcat([ctx.Dot[0], typeArguments, ctx.Identifier[0]]);
259
+ }
260
+ const suffix = this.visit((_a = ctx.unqualifiedClassInstanceCreationExpression) !== null && _a !== void 0 ? _a : ctx.templateArgument);
261
+ return rejectAndConcat([ctx.Dot[0], suffix]);
262
+ }
263
+ return this.visitSingle(ctx, params);
264
+ }
265
+ fqnOrRefType(ctx, params) {
266
+ const fqnOrRefTypePartFirst = this.visit(ctx.fqnOrRefTypePartFirst);
267
+ const fqnOrRefTypePartRest = this.mapVisit(ctx.fqnOrRefTypePartRest);
268
+ const dims = this.visit(ctx.dims);
269
+ const dots = ctx.Dot ? ctx.Dot : [];
270
+ const isMethodInvocation = ctx.Dot && ctx.Dot.length === 1;
271
+ if (params !== undefined &&
272
+ params.shouldBreakBeforeFirstMethodInvocation === true) {
273
+ // when fqnOrRefType is a method call from an object
274
+ if (isMethodInvocation) {
275
+ return rejectAndConcat([
276
+ indent(rejectAndJoin(concat([softline, dots[0]]), [
277
+ fqnOrRefTypePartFirst,
278
+ rejectAndJoinSeps(dots.slice(1), fqnOrRefTypePartRest),
279
+ dims
280
+ ]))
281
+ ]);
282
+ // otherwise it is a fully qualified name but we need to exclude when it is just a method call
283
+ }
284
+ else if (ctx.Dot) {
285
+ return indent(rejectAndConcat([
286
+ rejectAndJoinSeps(dots.slice(0, dots.length - 1), [
287
+ fqnOrRefTypePartFirst,
288
+ ...fqnOrRefTypePartRest.slice(0, fqnOrRefTypePartRest.length - 1)
289
+ ]),
290
+ softline,
291
+ rejectAndConcat([
292
+ dots[dots.length - 1],
293
+ fqnOrRefTypePartRest[fqnOrRefTypePartRest.length - 1]
294
+ ]),
295
+ dims
296
+ ]));
297
+ }
298
+ }
299
+ return rejectAndConcat([
300
+ rejectAndJoinSeps(dots, [fqnOrRefTypePartFirst, ...fqnOrRefTypePartRest]),
301
+ dims
302
+ ]);
303
+ }
304
+ fqnOrRefTypePartFirst(ctx) {
305
+ const annotation = this.mapVisit(ctx.annotation);
306
+ const fqnOrRefTypeCommon = this.visit(ctx.fqnOrRefTypePartCommon);
307
+ return rejectAndJoin(" ", [
308
+ rejectAndJoin(" ", annotation),
309
+ fqnOrRefTypeCommon
310
+ ]);
311
+ }
312
+ fqnOrRefTypePartRest(ctx) {
313
+ const annotation = this.mapVisit(ctx.annotation);
314
+ const fqnOrRefTypeCommon = this.visit(ctx.fqnOrRefTypePartCommon);
315
+ const typeArguments = this.visit(ctx.typeArguments);
316
+ return rejectAndJoin(" ", [
317
+ rejectAndJoin(" ", annotation),
318
+ rejectAndConcat([typeArguments, fqnOrRefTypeCommon])
319
+ ]);
320
+ }
321
+ fqnOrRefTypePartCommon(ctx) {
322
+ let keyWord = null;
323
+ if (ctx.Identifier) {
324
+ keyWord = ctx.Identifier[0];
325
+ }
326
+ else {
327
+ keyWord = ctx.Super[0];
328
+ }
329
+ const typeArguments = this.visit(ctx.typeArguments);
330
+ return rejectAndConcat([keyWord, typeArguments]);
331
+ }
332
+ parenthesisExpression(ctx, params) {
333
+ const expression = this.visit(ctx.expression);
334
+ const separator = (params === null || params === void 0 ? void 0 : params.addParenthesisToWrapStatement) ? softline : "";
335
+ return putIntoBraces(expression, separator, ctx.LBrace[0], ctx.RBrace[0]);
336
+ }
337
+ castExpression(ctx) {
338
+ return this.visitSingle(ctx);
339
+ }
340
+ primitiveCastExpression(ctx) {
341
+ const primitiveType = this.visit(ctx.primitiveType);
342
+ const unaryExpression = this.visit(ctx.unaryExpression);
343
+ return rejectAndJoin(" ", [
344
+ rejectAndConcat([ctx.LBrace[0], primitiveType, ctx.RBrace[0]]),
345
+ unaryExpression
346
+ ]);
347
+ }
348
+ referenceTypeCastExpression(ctx) {
349
+ const referenceType = this.visit(ctx.referenceType);
350
+ const hasAdditionalBounds = ctx.additionalBound !== undefined;
351
+ const additionalBounds = rejectAndJoin(line, this.mapVisit(ctx.additionalBound));
352
+ const expression = ctx.lambdaExpression
353
+ ? this.visit(ctx.lambdaExpression)
354
+ : this.visit(ctx.unaryExpressionNotPlusMinus);
355
+ return rejectAndJoin(" ", [
356
+ putIntoBraces(rejectAndJoin(line, [referenceType, additionalBounds]), hasAdditionalBounds ? softline : "", ctx.LBrace[0], ctx.RBrace[0]),
357
+ expression
358
+ ]);
359
+ }
360
+ newExpression(ctx) {
361
+ return this.visitSingle(ctx);
362
+ }
363
+ unqualifiedClassInstanceCreationExpression(ctx) {
364
+ const typeArguments = this.visit(ctx.typeArguments);
365
+ const classOrInterfaceTypeToInstantiate = this.visit(ctx.classOrInterfaceTypeToInstantiate);
366
+ let content = printArgumentListWithBraces.call(this, ctx.argumentList, ctx.RBrace[0], ctx.LBrace[0]);
367
+ const classBody = this.visit(ctx.classBody);
368
+ return rejectAndJoin(" ", [
369
+ ctx.New[0],
370
+ rejectAndConcat([
371
+ typeArguments,
372
+ classOrInterfaceTypeToInstantiate,
373
+ content
374
+ ]),
375
+ classBody
376
+ ]);
377
+ }
378
+ classOrInterfaceTypeToInstantiate(ctx) {
379
+ const tokens = sortAnnotationIdentifier(ctx.annotation, ctx.Identifier);
380
+ const segments = [];
381
+ let currentSegment = [];
382
+ forEach(tokens, token => {
383
+ if (isAnnotationCstNode(token)) {
384
+ currentSegment.push(this.visit([token]));
385
+ }
386
+ else {
387
+ currentSegment.push(token);
388
+ segments.push(rejectAndJoin(" ", currentSegment));
389
+ currentSegment = [];
390
+ }
391
+ });
392
+ const typeArgumentsOrDiamond = this.visit(ctx.typeArgumentsOrDiamond);
393
+ const dots = ctx.Dot ? ctx.Dot : [];
394
+ return rejectAndConcat([
395
+ rejectAndJoinSeps(dots, segments),
396
+ typeArgumentsOrDiamond
397
+ ]);
398
+ }
399
+ typeArgumentsOrDiamond(ctx) {
400
+ return this.visitSingle(ctx);
401
+ }
402
+ diamond(ctx) {
403
+ return concat([ctx.Less[0], ctx.Greater[0]]);
404
+ }
405
+ methodInvocationSuffix(ctx) {
406
+ return printArgumentListWithBraces.call(this, ctx.argumentList, ctx.RBrace[0], ctx.LBrace[0]);
407
+ }
408
+ argumentList(ctx) {
409
+ var _a, _b;
410
+ const headArgs = this.mapVisit(ctx.expression.slice(0, -1)).map((expression, index) => concat([expression, ctx.Comma[index], line]));
411
+ const lastExpression = ctx.expression.at(-1);
412
+ const lastArg = this.visit(lastExpression);
413
+ if (this.isArgumentListHuggable(ctx)) {
414
+ const huggedLastArg = this.visit(lastExpression, { hug: true });
415
+ const lastArgNotHuggable = typeof huggedLastArg === "object" &&
416
+ !Array.isArray(huggedLastArg) &&
417
+ huggedLastArg.type === "label" &&
418
+ ((_a = huggedLastArg.label) === null || _a === void 0 ? void 0 : _a.huggable) === false;
419
+ if (lastArgNotHuggable || headArgs.some(willBreak)) {
420
+ return group([indent([line, ...headArgs, lastArg]), line], {
421
+ shouldBreak: true
422
+ });
423
+ }
424
+ const suffix = ((_b = lastExpression === null || lastExpression === void 0 ? void 0 : lastExpression.children.lambdaExpression) === null || _b === void 0 ? void 0 : _b[0].children.lambdaBody[0].children.block)
425
+ ? ""
426
+ : line;
427
+ const hugged = [
428
+ ...headArgs,
429
+ group([huggedLastArg, suffix], { shouldBreak: true })
430
+ ];
431
+ const expanded = group([indent([line, ...headArgs, lastArg]), line], {
432
+ shouldBreak: true
433
+ });
434
+ return willBreak(huggedLastArg)
435
+ ? [breakParent, conditionalGroup([hugged, expanded])]
436
+ : conditionalGroup([[...headArgs, huggedLastArg], hugged, expanded]);
437
+ }
438
+ return group([indent([softline, ...headArgs, lastArg]), softline]);
439
+ }
440
+ arrayCreationExpression(ctx) {
441
+ const type = ctx.primitiveType
442
+ ? this.visit(ctx.primitiveType)
443
+ : this.visit(ctx.classOrInterfaceType);
444
+ const suffix = ctx.arrayCreationExpressionWithoutInitializerSuffix
445
+ ? this.visit(ctx.arrayCreationExpressionWithoutInitializerSuffix)
446
+ : this.visit(ctx.arrayCreationWithInitializerSuffix);
447
+ return rejectAndConcat([concat([ctx.New[0], " "]), type, suffix]);
448
+ }
449
+ arrayCreationExpressionWithoutInitializerSuffix(ctx) {
450
+ const dimExprs = this.visit(ctx.dimExprs);
451
+ const dims = this.visit(ctx.dims);
452
+ return rejectAndConcat([dimExprs, dims]);
453
+ }
454
+ arrayCreationWithInitializerSuffix(ctx) {
455
+ const dims = this.visit(ctx.dims);
456
+ const arrayInitializer = this.visit(ctx.arrayInitializer);
457
+ return rejectAndJoin(" ", [dims, arrayInitializer]);
458
+ }
459
+ dimExprs(ctx) {
460
+ const dimExpr = this.mapVisit(ctx.dimExpr);
461
+ return rejectAndConcat(dimExpr);
462
+ }
463
+ dimExpr(ctx) {
464
+ const annotations = this.mapVisit(ctx.annotation);
465
+ const expression = this.visit(ctx.expression);
466
+ return rejectAndJoin(" ", [
467
+ rejectAndJoin(" ", annotations),
468
+ rejectAndConcat([ctx.LSquare[0], expression, ctx.RSquare[0]])
469
+ ]);
470
+ }
471
+ classLiteralSuffix(ctx) {
472
+ const squares = [];
473
+ if (ctx.LSquare) {
474
+ for (let i = 0; i < ctx.LSquare.length; i++) {
475
+ squares.push(concat([ctx.LSquare[i], ctx.RSquare[i]]));
476
+ }
477
+ }
478
+ return rejectAndConcat([...squares, ctx.Dot[0], ctx.Class[0]]);
479
+ }
480
+ arrayAccessSuffix(ctx) {
481
+ const expression = this.visit(ctx.expression);
482
+ return rejectAndConcat([ctx.LSquare[0], expression, ctx.RSquare[0]]);
483
+ }
484
+ methodReferenceSuffix(ctx) {
485
+ const typeArguments = this.visit(ctx.typeArguments);
486
+ const identifierOrNew = ctx.New ? ctx.New[0] : ctx.Identifier[0];
487
+ return rejectAndConcat([ctx.ColonColon[0], typeArguments, identifierOrNew]);
488
+ }
489
+ templateArgument(ctx) {
490
+ var _a;
491
+ return ctx.template
492
+ ? this.visit(ctx.template)
493
+ : printTokenWithComments(((_a = ctx.StringLiteral) !== null && _a !== void 0 ? _a : ctx.TextBlock)[0]);
494
+ }
495
+ template(ctx) {
496
+ return this.visitSingle(ctx);
497
+ }
498
+ stringTemplate(ctx) {
499
+ const embeddedExpressions = this.mapVisit(ctx.embeddedExpression).flatMap(expression => group([softline, expression, lineSuffixBoundary, dedent(softline)]));
500
+ return concat([
501
+ ctx.StringTemplateBegin[0],
502
+ rejectAndJoinSeps(ctx.StringTemplateMid, embeddedExpressions),
503
+ ctx.StringTemplateEnd[0]
504
+ ]);
505
+ }
506
+ textBlockTemplate(ctx) {
507
+ const embeddedExpressions = this.mapVisit(ctx.embeddedExpression).flatMap(expression => group([softline, expression, lineSuffixBoundary, dedent(softline)]));
508
+ return concat([
509
+ ctx.TextBlockTemplateBegin[0],
510
+ rejectAndJoinSeps(ctx.TextBlockTemplateMid, embeddedExpressions),
511
+ ctx.TextBlockTemplateEnd[0]
512
+ ]);
513
+ }
514
+ embeddedExpression(ctx) {
515
+ return this.visit(ctx.expression);
516
+ }
517
+ pattern(ctx) {
518
+ return this.visitSingle(ctx);
519
+ }
520
+ typePattern(ctx) {
521
+ return this.visitSingle(ctx);
522
+ }
523
+ recordPattern(ctx) {
524
+ var _a, _b;
525
+ const componentPatterns = (_b = (_a = ctx.componentPatternList) === null || _a === void 0 ? void 0 : _a[0].children.componentPattern) !== null && _b !== void 0 ? _b : [];
526
+ handleCommentsParameters(ctx.LBrace[0], componentPatterns, ctx.RBrace[0]);
527
+ const referenceType = this.visit(ctx.referenceType);
528
+ const componentPatternList = this.visit(ctx.componentPatternList);
529
+ return concat([
530
+ referenceType,
531
+ putIntoBraces(componentPatternList, softline, ctx.LBrace[0], ctx.RBrace[0])
532
+ ]);
533
+ }
534
+ componentPatternList(ctx) {
535
+ var _a, _b;
536
+ const componentPatterns = this.mapVisit(ctx.componentPattern);
537
+ const commas = (_b = (_a = ctx.Comma) === null || _a === void 0 ? void 0 : _a.map(elt => concat([elt, line]))) !== null && _b !== void 0 ? _b : [];
538
+ return rejectAndJoinSeps(commas, componentPatterns);
539
+ }
540
+ componentPattern(ctx) {
541
+ return this.visitSingle(ctx);
542
+ }
543
+ matchAllPattern(ctx) {
544
+ return printTokenWithComments(ctx.Underscore[0]);
545
+ }
546
+ guard(ctx) {
547
+ const expression = this.visit(ctx.expression, {
548
+ addParenthesisToWrapStatement: true
549
+ });
550
+ return concat([ctx.When[0], " ", expression]);
551
+ }
552
+ isRefTypeInMethodRef() {
553
+ return "isRefTypeInMethodRef";
554
+ }
555
+ isArgumentListHuggable(argumentList) {
556
+ var _a, _b, _c;
557
+ const expressions = argumentList.expression;
558
+ const lastArgument = expressions.at(-1);
559
+ const lastArgumentLambdaBodyExpression = (_b = (_a = lastArgument === null || lastArgument === void 0 ? void 0 : lastArgument.children.lambdaExpression) === null || _a === void 0 ? void 0 : _a[0].children.lambdaBody[0].children.expression) === null || _b === void 0 ? void 0 : _b[0].children;
560
+ const lastArgumentLambdaBodyTernaryExpression = (_c = lastArgumentLambdaBodyExpression === null || lastArgumentLambdaBodyExpression === void 0 ? void 0 : lastArgumentLambdaBodyExpression.conditionalExpression) === null || _c === void 0 ? void 0 : _c[0].children;
561
+ return (!(lastArgument === null || lastArgument === void 0 ? void 0 : lastArgument.leadingComments) &&
562
+ !(lastArgument === null || lastArgument === void 0 ? void 0 : lastArgument.trailingComments) &&
563
+ (!lastArgumentLambdaBodyExpression ||
564
+ (lastArgumentLambdaBodyTernaryExpression === null || lastArgumentLambdaBodyTernaryExpression === void 0 ? void 0 : lastArgumentLambdaBodyTernaryExpression.QuestionMark) !== undefined ||
565
+ (lastArgumentLambdaBodyTernaryExpression === null || lastArgumentLambdaBodyTernaryExpression === void 0 ? void 0 : lastArgumentLambdaBodyTernaryExpression.binaryExpression[0].children.unaryExpression.length) === 1) &&
566
+ expressions.findIndex(({ children }) => children.lambdaExpression) ===
567
+ expressions.length - 1);
568
+ }
569
+ isBreakableNewExpression(newExpression) {
570
+ var _a, _b, _c, _d, _e;
571
+ const arrayCreationExpression = (_a = newExpression === null || newExpression === void 0 ? void 0 : newExpression.arrayCreationExpression) === null || _a === void 0 ? void 0 : _a[0].children;
572
+ const classInstanceCreationExpression = (_b = newExpression === null || newExpression === void 0 ? void 0 : newExpression.unqualifiedClassInstanceCreationExpression) === null || _b === void 0 ? void 0 : _b[0].children;
573
+ return [
574
+ (_c = arrayCreationExpression === null || arrayCreationExpression === void 0 ? void 0 : arrayCreationExpression.classOrInterfaceType) === null || _c === void 0 ? void 0 : _c[0].children.classType[0].children.typeArguments,
575
+ (_d = arrayCreationExpression === null || arrayCreationExpression === void 0 ? void 0 : arrayCreationExpression.arrayCreationWithInitializerSuffix) === null || _d === void 0 ? void 0 : _d[0].children.arrayInitializer[0].children.variableInitializerList,
576
+ (_e = classInstanceCreationExpression === null || classInstanceCreationExpression === void 0 ? void 0 : classInstanceCreationExpression.classOrInterfaceTypeToInstantiate[0].children.typeArgumentsOrDiamond) === null || _e === void 0 ? void 0 : _e[0].children.typeArguments,
577
+ classInstanceCreationExpression === null || classInstanceCreationExpression === void 0 ? void 0 : classInstanceCreationExpression.argumentList
578
+ ].some(breakablePart => breakablePart !== undefined);
579
+ }
580
+ isCapitalizedIdentifier(fqnOrRefType) {
581
+ var _a, _b, _c;
582
+ const fqnOrRefTypeParts = [
583
+ fqnOrRefType === null || fqnOrRefType === void 0 ? void 0 : fqnOrRefType.fqnOrRefTypePartFirst[0],
584
+ ...((_a = fqnOrRefType === null || fqnOrRefType === void 0 ? void 0 : fqnOrRefType.fqnOrRefTypePartRest) !== null && _a !== void 0 ? _a : [])
585
+ ];
586
+ const nextToLastIdentifier = (_c = (_b = fqnOrRefTypeParts[fqnOrRefTypeParts.length - 2]) === null || _b === void 0 ? void 0 : _b.children.fqnOrRefTypePartCommon[0].children.Identifier) === null || _c === void 0 ? void 0 : _c[0].image;
587
+ return (nextToLastIdentifier &&
588
+ /^\p{Uppercase_Letter}/u.test(nextToLastIdentifier));
589
+ }
590
+ }