Commit 9182725
committed
Stop deeply nested calls from taking exponential time to format
Since palantir#1535 (2.89.0), the levels above the
innermost eight first try to break only their last inner level and fall
back to breaking normally. That attempt can lay out all of the inner
level before it fails, and in deeply nested code it nearly always fails
once the closing parentheses no longer fit in the line, so every level
above repeats it for each layout it tries. Nine nested
Map.ofEntries(Map.entry(...)) took 69.5 s to format, and the file from
palantir#1632 took 34 s with the jar and 60 s with
the native binary (#35).
A failed attempt leaves nothing behind but the failure, so a level now
remembers the states it failed from and answers at once when asked
again. The key holds what the attempt reads: its arguments and the
state's column, indents, pending break and taken break tags.
The new test formats the nested calls under a 10 s limit, which the old
code exceeds. They now take 0.45 s, and that file 1.05 s with the jar
and 0.73 s with the native binary. The layout does not change: the
output for both inputs and for the 15,747 files of the JDK 21 sources is
byte for byte the same, and formatting those sources takes no longer.1 parent 894f4a5 commit 9182725
3 files changed
Lines changed: 62 additions & 1 deletion
File tree
- open-java-format/src
- main/java/com/palantir/javaformat/doc
- test/java/com/palantir/javaformat/java
Lines changed: 22 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| 48 | + | |
47 | 49 | | |
48 | 50 | | |
49 | 51 | | |
| |||
67 | 69 | | |
68 | 70 | | |
69 | 71 | | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
70 | 79 | | |
71 | 80 | | |
72 | 81 | | |
| |||
364 | 373 | | |
365 | 374 | | |
366 | 375 | | |
367 | | - | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
368 | 386 | | |
369 | 387 | | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
370 | 391 | | |
371 | 392 | | |
372 | 393 | | |
| |||
Lines changed: 22 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
221 | 222 | | |
222 | 223 | | |
223 | 224 | | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
224 | 246 | | |
225 | 247 | | |
226 | 248 | | |
| |||
Lines changed: 18 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| 36 | + | |
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
| |||
473 | 475 | | |
474 | 476 | | |
475 | 477 | | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
476 | 494 | | |
0 commit comments