Skip to content

Commit 8bb7641

Browse files
Fix/712 handle comments with static invocations (#715)
* fix: handle edge cases with comments in fqn parts * fix: do not add dot before dims in fqn parts * refactor: simplify logic for printing fqn parts
1 parent b742832 commit 8bb7641

File tree

3 files changed

+164
-88
lines changed

3 files changed

+164
-88
lines changed

packages/prettier-plugin-java/src/printers/expressions.ts

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -367,15 +367,10 @@ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
367367
const fqnOrRefType =
368368
ctx.primaryPrefix[0].children.fqnOrRefType?.[0].children;
369369
const hasFqnRefPart = fqnOrRefType?.fqnOrRefTypePartRest !== undefined;
370-
const {
371-
isCapitalizedIdentifier,
372-
isCapitalizedIdentifierWithoutTrailingComment
373-
} = this.handleStaticInvocations(fqnOrRefType);
370+
const isCapitalizedIdentifier = this.isCapitalizedIdentifier(fqnOrRefType);
374371

375372
const shouldBreakBeforeFirstMethodInvocation =
376-
countMethodInvocation > 1 &&
377-
hasFqnRefPart &&
378-
!isCapitalizedIdentifierWithoutTrailingComment;
373+
countMethodInvocation > 1 && hasFqnRefPart && !isCapitalizedIdentifier;
379374

380375
const shouldBreakBeforeMethodInvocations =
381376
shouldBreakBeforeFirstMethodInvocation ||
@@ -425,20 +420,6 @@ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
425420
);
426421
}
427422

428-
private handleStaticInvocations(fqnOrRefType: FqnOrRefTypeCtx | undefined) {
429-
const lastFqnRefPartDot = this.lastFqnOrRefDot(fqnOrRefType);
430-
const isCapitalizedIdentifier = this.isCapitalizedIdentifier(fqnOrRefType);
431-
const isCapitalizedIdentifierWithoutTrailingComment =
432-
isCapitalizedIdentifier &&
433-
(lastFqnRefPartDot === undefined ||
434-
!hasLeadingComments(lastFqnRefPartDot));
435-
436-
return {
437-
isCapitalizedIdentifier,
438-
isCapitalizedIdentifierWithoutTrailingComment
439-
};
440-
}
441-
442423
primaryPrefix(ctx: PrimaryPrefixCtx, params: any) {
443424
if (ctx.This || ctx.Void) {
444425
return printTokenWithComments(this.getSingle(ctx) as IToken);
@@ -468,47 +449,31 @@ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
468449
const fqnOrRefTypePartFirst = this.visit(ctx.fqnOrRefTypePartFirst);
469450
const fqnOrRefTypePartRest = this.mapVisit(ctx.fqnOrRefTypePartRest);
470451
const dims = this.visit(ctx.dims);
471-
const dots = ctx.Dot ? ctx.Dot : [];
472-
const isMethodInvocation = ctx.Dot && ctx.Dot.length === 1;
452+
const dots = ctx.Dot
453+
? ctx.Dot.map(dot => {
454+
if (hasLeadingComments(dot)) {
455+
return concat([softline, dot]);
456+
}
457+
return dot;
458+
})
459+
: [];
473460

474461
if (
475-
params !== undefined &&
476-
params.shouldBreakBeforeFirstMethodInvocation === true
462+
params?.shouldBreakBeforeFirstMethodInvocation === true &&
463+
ctx.Dot !== undefined
477464
) {
478-
// when fqnOrRefType is a method call from an object
479-
if (isMethodInvocation) {
480-
return rejectAndConcat([
481-
indent(
482-
rejectAndJoin(concat([softline, dots[0]]), [
483-
fqnOrRefTypePartFirst,
484-
rejectAndJoinSeps(dots.slice(1), fqnOrRefTypePartRest),
485-
dims
486-
])
487-
)
488-
]);
489-
// otherwise it is a fully qualified name but we need to exclude when it is just a method call
490-
} else if (ctx.Dot) {
491-
return indent(
492-
rejectAndConcat([
493-
rejectAndJoinSeps(dots.slice(0, dots.length - 1), [
494-
fqnOrRefTypePartFirst,
495-
...fqnOrRefTypePartRest.slice(0, fqnOrRefTypePartRest.length - 1)
496-
]),
497-
softline,
498-
rejectAndConcat([
499-
dots[dots.length - 1],
500-
fqnOrRefTypePartRest[fqnOrRefTypePartRest.length - 1]
501-
]),
502-
dims
503-
])
504-
);
505-
}
465+
dots[dots.length - 1] = concat([softline, ctx.Dot[ctx.Dot.length - 1]]);
506466
}
507467

508-
return rejectAndConcat([
509-
rejectAndJoinSeps(dots, [fqnOrRefTypePartFirst, ...fqnOrRefTypePartRest]),
510-
dims
511-
]);
468+
return indent(
469+
rejectAndConcat([
470+
rejectAndJoinSeps(dots, [
471+
fqnOrRefTypePartFirst,
472+
...fqnOrRefTypePartRest
473+
]),
474+
dims
475+
])
476+
);
512477
}
513478

514479
fqnOrRefTypePartFirst(ctx: FqnOrRefTypePartFirstCtx) {
@@ -907,14 +872,6 @@ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
907872
);
908873
}
909874

910-
private lastFqnOrRefDot(fqnOrRefType: FqnOrRefTypeCtx | undefined) {
911-
if (fqnOrRefType === undefined || fqnOrRefType.Dot === undefined) {
912-
return undefined;
913-
}
914-
915-
return fqnOrRefType.Dot[fqnOrRefType.Dot.length - 1];
916-
}
917-
918875
private getPrimarySuffixes(
919876
ctx: PrimaryCtx,
920877
newExpression: NewExpressionCtx | undefined,
Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,83 @@
11
public class BreakLongFunctionCall {
22

3-
public void doSomething() {
4-
return new Object().something().more();
5-
}
3+
public void doSomething() {
4+
return new Object().something().more();
5+
}
66

77
public void doSomethingNewWithComment() {
8-
return new Object()
8+
new Object()
99
// comment
1010
.something().more();
11+
12+
new Object().something()
13+
// comment
14+
.more();
1115
}
1216

1317
public void doSomethingWithComment() {
14-
return Object
18+
Object
19+
// comment
20+
.something().more();
21+
22+
java.Object
23+
// comment
24+
.something().more();
25+
26+
java.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object
27+
// comment
28+
.something().more();
29+
30+
java
1531
// comment
32+
.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object
33+
.something().more();
34+
35+
java
36+
.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong
37+
// comment
38+
.Object
39+
.something().more();
40+
41+
java.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object
1642
.something().more();
43+
44+
Object.something()
45+
// comment
46+
.more();
47+
48+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
49+
// comment
50+
.util()
51+
.java.java();
52+
53+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong
54+
// comment
55+
.java
56+
.util()
57+
.java.java();
58+
59+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
60+
/* comment */
61+
.util()
62+
.java.java();
63+
64+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java/* comment */
65+
.util()
66+
.java.java();
67+
68+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
69+
/* comment */.util()
70+
.java.java();
1771
}
1872

1973
public void doSomethingWithComment() {
20-
return object
74+
object
2175
// comment
2276
.something().more();
77+
78+
object.something()
79+
// comment
80+
.more();
2381
}
2482

2583
public void doSomethingNewWithComment() {
@@ -40,28 +98,28 @@ public void doSomethingWithComment() {
4098
.something().more();
4199
}
42100

43-
public void doSomethingLongNew() {
44-
return something().more().and().that().as().well().but().not().something().something();
101+
public void doSomethingLongNew() {
102+
return something().more().and().that().as().well().but().not().something().something();
45103
}
46104

47105
public void doSomethingLongWithArgument() {
48106
return something().more(firstArgument, secondArgument).and(firstArgument, secondArgument, thirdArgument, fourthArgument, fifthArgument);
49107
}
50108

51-
public void doSomethingLongNew2() {
52-
return new Object().something().more().and().that().as().well().but().not().something();
53-
}
109+
public void doSomethingLongNew2() {
110+
return new Object().something().more().and().that().as().well().but().not().something();
111+
}
54112

55-
public void doSomethingLongStatic() {
56-
return Object.something().more().and().that().as().well().but().not().something();
57-
}
113+
public void doSomethingLongStatic() {
114+
return Object.something().more().and().that().as().well().but().not().something();
115+
}
58116

59-
public void singleInvocationOnNewExpression() {
60-
new Instance(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).invocation(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);
61-
}
117+
public void singleInvocationOnNewExpression() {
118+
new Instance(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).invocation(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);
119+
}
62120

63-
public void multipleInvocationsOnNewExpression() {
64-
new Instance(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).invocation(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).andAnother();
65-
}
121+
public void multipleInvocationsOnNewExpression() {
122+
new Instance(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).invocation(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).andAnother();
123+
}
66124

67125
}

packages/prettier-plugin-java/test/unit-test/member_chain/_output.java

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,85 @@ public void doSomething() {
55
}
66

77
public void doSomethingNewWithComment() {
8-
return new Object()
8+
new Object()
99
// comment
1010
.something()
1111
.more();
12+
13+
new Object()
14+
.something()
15+
// comment
16+
.more();
1217
}
1318

1419
public void doSomethingWithComment() {
15-
return Object
20+
Object
21+
// comment
22+
.something()
23+
.more();
24+
25+
java.Object
1626
// comment
1727
.something()
1828
.more();
29+
30+
java.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object
31+
// comment
32+
.something()
33+
.more();
34+
35+
java
36+
// comment
37+
.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object.something()
38+
.more();
39+
40+
java.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong
41+
// comment
42+
.Object.something()
43+
.more();
44+
45+
java.averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.Object.something()
46+
.more();
47+
48+
Object.something()
49+
// comment
50+
.more();
51+
52+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
53+
// comment
54+
.util()
55+
.java.java();
56+
57+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong
58+
// comment
59+
.java
60+
.util()
61+
.java.java();
62+
63+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
64+
/* comment */
65+
.util()
66+
.java.java();
67+
68+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java/* comment */
69+
.util()
70+
.java.java();
71+
72+
averyveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong.java
73+
/* comment */.util()
74+
.java.java();
1975
}
2076

2177
public void doSomethingWithComment() {
22-
return object
78+
object
2379
// comment
2480
.something()
2581
.more();
82+
83+
object
84+
.something()
85+
// comment
86+
.more();
2687
}
2788

2889
public void doSomethingNewWithComment() {

0 commit comments

Comments
 (0)