Skip to content

Commit 97e895f

Browse files
Merge remote-tracking branch 'refs/remotes/origin/greg-check-disabled-python-tests' into greg-check-disabled-python-tests
2 parents b9ce52e + af7a5a7 commit 97e895f

31 files changed

Lines changed: 2272 additions & 143 deletions

rewrite-java-test/src/test/java/org/openrewrite/java/format/TabsAndIndentsTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2627,6 +2627,21 @@ class Test {
26272627
""\";
26282628
private final String singleLine = ""\"
26292629
noEndLine""\";
2630+
private void method(String one, String two) {
2631+
method(""\"
2632+
indent me!
2633+
""\", ""\"
2634+
indent me too!
2635+
""\");
2636+
method(
2637+
""\"
2638+
indent me!
2639+
""\",
2640+
""\"
2641+
indent me too!
2642+
""\"
2643+
);
2644+
}
26302645
}
26312646
""",
26322647
"""
@@ -2640,6 +2655,21 @@ class Test {
26402655
""\";
26412656
private final String singleLine = ""\"
26422657
noEndLine""\";
2658+
private void method(String one, String two) {
2659+
method(""\"
2660+
indent me!
2661+
""\", ""\"
2662+
indent me too!
2663+
""\");
2664+
method(
2665+
""\"
2666+
indent me!
2667+
""\",
2668+
""\"
2669+
indent me too!
2670+
""\"
2671+
);
2672+
}
26432673
}
26442674
"""
26452675
)
@@ -2663,6 +2693,21 @@ class Test {
26632693
""\"
26642694
NO
26652695
""\";
2696+
private void method(String one, String two) {
2697+
method(""\"
2698+
indent me!
2699+
""\", ""\"
2700+
indent me too!
2701+
""\");
2702+
method(
2703+
""\"
2704+
indent me!
2705+
""\",
2706+
""\"
2707+
indent me too!
2708+
""\"
2709+
);
2710+
}
26662711
}
26672712
""",
26682713
"""
@@ -2674,6 +2719,21 @@ class Test {
26742719
""\"
26752720
NO
26762721
""\";
2722+
private void method(String one, String two) {
2723+
method(""\"
2724+
indent me!
2725+
""\", ""\"
2726+
indent me too!
2727+
""\");
2728+
method(
2729+
""\"
2730+
indent me!
2731+
""\",
2732+
""\"
2733+
indent me too!
2734+
""\"
2735+
);
2736+
}
26772737
}
26782738
"""
26792739
)

rewrite-java/src/main/java/org/openrewrite/java/JavaParser.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -441,21 +441,24 @@ class JdkParserBuilderCache {
441441

442442
// Try to find and cache appropriate parser
443443

444-
// Java 23+ changed the return type of `DocCommentTable.getCommentTree` from `DCDocComment` to `DocCommentTree`
445-
// That means Java 23 and above need the Java 25 parser, whereas Java 22 and below need the Java 21 parser
446-
if (version > 22) {
444+
// Parsers are compiled only for their matching Java version, given their use of internal/unstable APIs.
445+
// Language features introduced in non-LTS versions are only supported from the next LTS version onwards.
446+
// We recommend running on LTS versions wherever possible; non-LTS versions may struggle given the above.
447+
// e.g.: Java 23+ changed the return type of `DocCommentTable.getCommentTree` from `DCDocComment` to `DocCommentTree`
448+
449+
if (version >= 25) {
447450
supplier = tryCreateBuilderSupplier("org.openrewrite.java.Java25Parser");
448451
}
449452

450-
if (version > 17 && supplier == null) {
453+
if (supplier == null && version >= 21) {
451454
supplier = tryCreateBuilderSupplier("org.openrewrite.java.Java21Parser");
452455
}
453456

454-
if (version > 11 && supplier == null) {
457+
if (supplier == null && version >= 17) {
455458
supplier = tryCreateBuilderSupplier("org.openrewrite.java.Java17Parser");
456459
}
457460

458-
if (version > 8 && supplier == null) {
461+
if (supplier == null && version >= 11) {
459462
supplier = tryCreateBuilderSupplier("org.openrewrite.java.Java11Parser");
460463
}
461464

rewrite-java/src/main/java/org/openrewrite/java/format/TabsAndIndentsVisitor.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@
3434
import org.openrewrite.style.Style;
3535
import org.openrewrite.style.StyleHelper;
3636

37-
import java.util.Iterator;
38-
import java.util.List;
37+
import java.util.*;
3938
import java.util.function.Supplier;
4039

4140
public class TabsAndIndentsVisitor<P> extends JavaIsoVisitor<P> {
@@ -475,14 +474,28 @@ public Space visitSpace(Space space, Space.Location loc, P p) {
475474
}
476475

477476
int lastElementIndex = container.getElements().size() - 1;
478-
js = ListUtils.map(container.getPadding().getElements(), (index, t) -> {
479-
t = visitRightPadded(t, loc.getElementLocation(), p);
477+
List<JRightPadded<J2>> originalElements = container.getPadding().getElements();
478+
List<JRightPadded<J2>> newElements = new ArrayList<>(originalElements);
479+
boolean changed = false;
480+
481+
for (int index = 0; index < originalElements.size(); index++) {
482+
JRightPadded<J2> original = originalElements.get(index);
483+
JRightPadded<J2> t = visitRightPadded(original, loc.getElementLocation(), p);
480484
if (index == lastElementIndex && t != null && t.getAfter().getLastWhitespace().contains("\n")) {
481485
t = t.withAfter(indentTo(t.getAfter(), indent, loc.getElementLocation().getAfterLocation()));
482486
}
483-
return t;
484-
});
485487

488+
if (t != original && t != null) {
489+
changed = true;
490+
newElements.set(index, t);
491+
// Update cursor so SourcePositionService calculates correct positions for subsequent elements
492+
JContainer<J2> updatedContainer = JContainer.build(before, newElements, container.getMarkers());
493+
494+
setCursor(getCursor().withValue(updatedContainer));
495+
}
496+
}
497+
498+
js = changed ? newElements : originalElements;
486499

487500
setCursor(getCursor().getParent());
488501
return js == container.getPadding().getElements() && before == container.getBefore() ?
@@ -505,10 +518,20 @@ public J.Literal visitLiteral(J.Literal literal, P p) {
505518
int indent = getCursor().getNearestMessage("lastIndent", 0);
506519
if (evaluate(() -> wrappingStyle.getTextBlocks().getAlignWhenMultiline(), false)) {
507520
if (!literal.getPrefix().getLastWhitespace().contains("\n")) {
508-
ColSpan colSpan = positionService.columnsOf(getCursor(), literal);
509-
indent += colSpan.getStartColumn() - colSpan.getIndent() - 1; // since position is index-1-based
521+
if (getCursor().getParent() != null && getCursor().getParent(2) != null && getCursor().getParent().getValue() instanceof JRightPadded) {
522+
indent = positionService.columnsOf(getCursor().getParent(2), literal).getStartColumn() - 1 + literal.getPrefix().getIndent().length(); // since position is index-1-based
523+
} else {
524+
ColSpan colSpan = positionService.columnsOf(getCursor(), literal);
525+
indent += colSpan.getStartColumn() - colSpan.getIndent() - 1; // since position is index-1-based
526+
}
510527
}
511528
} else {
529+
if (getCursor().getParent() != null && getCursor().getParent(2) != null && getCursor().getParent().getValue() instanceof JRightPadded) {
530+
indent = getCursor().getParent(2).getNearestMessage("lastIndent", 0);
531+
if (literal.getPrefix().getLastWhitespace().contains("\n")) {
532+
indent += style.getContinuationIndent();
533+
}
534+
}
512535
indent += style.getContinuationIndent();
513536
}
514537
if (currentIndent != indent) {

rewrite-java/src/main/java/org/openrewrite/java/service/SourcePositionService.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
import org.openrewrite.java.service.Span.ColSpan;
2424
import org.openrewrite.java.tree.*;
2525

26-
import java.util.Collection;
27-
import java.util.List;
28-
import java.util.Objects;
26+
import java.util.*;
2927
import java.util.concurrent.atomic.AtomicBoolean;
3028
import java.util.concurrent.atomic.AtomicInteger;
29+
import java.util.stream.Collectors;
3130

3231
/**
3332
* Service for computing source code position metrics such as column alignment positions and tree element lengths.
@@ -204,6 +203,20 @@ private Span positionOfChild(Cursor cursor, Object child, Cursor printCursor) {
204203
@Nullable
205204
J foundJ = null;
206205

206+
@Override
207+
protected void visitContainer(String before, @Nullable JContainer<? extends J> container, JContainer.Location location, String suffixBetween, @Nullable String after, PrintOutputCapture<TreeVisitor<?, ?>> p) {
208+
if (container != null && !container.getPadding().getElements().isEmpty() && cursor.getValue() instanceof JContainer) {
209+
Set<UUID> elements = container.getElements().stream().map(Tree::getId).collect(Collectors.toSet());
210+
((JContainer<? extends J>) cursor.getValue()).getElements().stream().map(Tree::getId).forEach(elements::remove);
211+
if (elements.isEmpty()) {
212+
//if no elements remain, we should continue our search with the input cursor to receive its changes.
213+
super.visitContainer(before, cursor.getValue(), location, suffixBetween, after, p);
214+
return;
215+
}
216+
}
217+
super.visitContainer(before, container, location, suffixBetween, after, p);
218+
}
219+
207220
@Override
208221
protected void visitRightPadded(List<? extends JRightPadded<? extends J>> nodes, JRightPadded.Location location, String suffixBetween, PrintOutputCapture<TreeVisitor<?, ?>> p) {
209222
if (findJContainer != null && nodes == findJContainer.getPadding().getElements()) {

rewrite-maven/src/main/java/org/openrewrite/maven/ChangeParentPom.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public Validated<Object> validate() {
173173

174174
public static class Accumulator {
175175
@Nullable MavenResolutionResult updatedRootMarker;
176+
@Nullable MavenDownloadingException scannerException;
176177
final Map<ResolvedGroupArtifactVersion, MavenResolutionResult> gavToOriginalMarker = new HashMap<>();
177178
final Map<ResolvedGroupArtifactVersion, MavenResolutionResult> gavToNewMarker = new HashMap<>();
178179

@@ -301,11 +302,14 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
301302
targetRelativePath
302303
);
303304
Pom updatedPom = mrr.getPom().getRequested().withParent(updatedParentRef);
304-
ResolvedPom updatedResolvedPom = mrr.getPom().withRequested(updatedPom);
305+
ResolvedPom updatedResolvedPom = mrr.getPom()
306+
.withRequested(updatedPom)
307+
.resolve(ctx, new MavenPomDownloader(
308+
mrr.getProjectPoms(), ctx, mrr.getMavenSettings(), mrr.getActiveProfiles()));
305309
acc.updatedRootMarker = mrr.withPom(updatedResolvedPom);
306310
}
307311
} catch (MavenDownloadingException e) {
308-
// Version resolution failed, will be handled in visitor phase
312+
acc.scannerException = e;
309313
}
310314
}
311315
return document;
@@ -354,6 +358,7 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
354358
if (updatedMarker != null) {
355359
d = d.withMarkers(d.getMarkers().computeByType(mrr,
356360
(original, ignored) -> updatedMarker));
361+
maybeUpdateModel();
357362
}
358363
}
359364
return d;
@@ -461,6 +466,9 @@ public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
461466
}
462467
return e.warn(tag);
463468
}
469+
if (acc.scannerException != null) {
470+
t = acc.scannerException.warn(t);
471+
}
464472
}
465473
}
466474
return t;

rewrite-maven/src/main/java/org/openrewrite/maven/RemoveUnusedProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
238238
directory != null) {
239239
Path path = getCursor().firstEnclosingOrThrow(SourceFile.class).getSourcePath();
240240
try {
241-
acc.filteredResourcePathsToDeclaringPoms.put(path.getParent().resolve(directory), getResolutionResult());
241+
acc.filteredResourcePathsToDeclaringPoms.put(path.resolveSibling(directory), getResolutionResult());
242242
} catch (InvalidPathException ignored) {
243243
} // fail quietly
244244
}

rewrite-maven/src/test/java/org/openrewrite/maven/ChangeParentPomTest.java

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2369,4 +2369,115 @@ void multiModuleChainOfParentPoms() {
23692369
)
23702370
);
23712371
}
2372+
2373+
@Issue("https://github.com/openrewrite/rewrite/issues/6717")
2374+
@Test
2375+
void submoduleParentModelDependencyManagementUpdated() {
2376+
rewriteRun(
2377+
spec -> spec.recipe(new ChangeParentPom(
2378+
"org.junit",
2379+
null,
2380+
"junit-bom",
2381+
null,
2382+
"6.0.1",
2383+
null,
2384+
null,
2385+
null,
2386+
false,
2387+
null
2388+
)),
2389+
mavenProject(
2390+
"sample-parent",
2391+
pomXml(
2392+
"""
2393+
<project>
2394+
<modelVersion>4.0.0</modelVersion>
2395+
<groupId>com.example</groupId>
2396+
<artifactId>sample-parent</artifactId>
2397+
<version>${revision}</version>
2398+
<packaging>pom</packaging>
2399+
2400+
<modules>
2401+
<module>sample-rest</module>
2402+
</modules>
2403+
2404+
<parent>
2405+
<groupId>org.junit</groupId>
2406+
<artifactId>junit-bom</artifactId>
2407+
<version>5.10.3</version>
2408+
<relativePath/>
2409+
</parent>
2410+
</project>
2411+
""",
2412+
"""
2413+
<project>
2414+
<modelVersion>4.0.0</modelVersion>
2415+
<groupId>com.example</groupId>
2416+
<artifactId>sample-parent</artifactId>
2417+
<version>${revision}</version>
2418+
<packaging>pom</packaging>
2419+
2420+
<modules>
2421+
<module>sample-rest</module>
2422+
</modules>
2423+
2424+
<parent>
2425+
<groupId>org.junit</groupId>
2426+
<artifactId>junit-bom</artifactId>
2427+
<version>6.0.1</version>
2428+
<relativePath/>
2429+
</parent>
2430+
</project>
2431+
""",
2432+
spec -> spec.path("pom.xml")
2433+
),
2434+
mavenProject(
2435+
"sample-rest",
2436+
pomXml(
2437+
"""
2438+
<project>
2439+
<modelVersion>4.0.0</modelVersion>
2440+
<artifactId>sample-rest</artifactId>
2441+
<packaging>jar</packaging>
2442+
2443+
<parent>
2444+
<groupId>com.example</groupId>
2445+
<artifactId>sample-parent</artifactId>
2446+
<version>${revision}</version>
2447+
<relativePath>../pom.xml</relativePath>
2448+
</parent>
2449+
</project>
2450+
""",
2451+
"""
2452+
<project>
2453+
<modelVersion>4.0.0</modelVersion>
2454+
<artifactId>sample-rest</artifactId>
2455+
<packaging>jar</packaging>
2456+
2457+
<parent>
2458+
<groupId>com.example</groupId>
2459+
<artifactId>sample-parent</artifactId>
2460+
<version>${revision}</version>
2461+
<relativePath>../pom.xml</relativePath>
2462+
</parent>
2463+
</project>
2464+
""",
2465+
spec -> spec.path("sample-rest/pom.xml").afterRecipe(doc -> {
2466+
MavenResolutionResult result = doc.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow();
2467+
assertThat(result.getParent()).isNotNull();
2468+
assertThat(requireNonNull(result.getParent().getPom().getRequested().getParent()).getVersion())
2469+
.describedAs("Parent's parent version should be updated to 6.0.1")
2470+
.isEqualTo("6.0.1");
2471+
assertThat(result.getParent().getPom().getDependencyManagement())
2472+
.describedAs("Parent's dependency management should not contain old junit 5.10.3 entries")
2473+
.noneMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:5.10.3"));
2474+
assertThat(result.getParent().getPom().getDependencyManagement())
2475+
.describedAs("Parent's dependency management should contain new junit 6.0.1 entries")
2476+
.anyMatch(dep -> dep.getGav().toString().equals("org.junit.jupiter:junit-jupiter:6.0.1"));
2477+
})
2478+
)
2479+
)
2480+
)
2481+
);
2482+
}
23722483
}

0 commit comments

Comments
 (0)