Skip to content

Commit 0d4df6f

Browse files
committed
Add a specific case for SortedSet to preserve existing behavior
1 parent 4e55073 commit 0d4df6f

File tree

2 files changed

+73
-20
lines changed

2 files changed

+73
-20
lines changed

src/main/java/org/openrewrite/java/migrate/guava/NoGuavaSetsFilter.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
import org.openrewrite.Preconditions;
2020
import org.openrewrite.Recipe;
2121
import org.openrewrite.TreeVisitor;
22-
import org.openrewrite.java.JavaIsoVisitor;
2322
import org.openrewrite.java.JavaTemplate;
23+
import org.openrewrite.java.JavaVisitor;
2424
import org.openrewrite.java.MethodMatcher;
2525
import org.openrewrite.java.search.UsesMethod;
2626
import org.openrewrite.java.tree.J;
@@ -31,6 +31,7 @@
3131

3232
public class NoGuavaSetsFilter extends Recipe {
3333
private static final MethodMatcher SETS_FILTER = new MethodMatcher("com.google.common.collect.Sets filter(java.util.Set, com.google.common.base.Predicate)");
34+
private static final MethodMatcher SETS_FILTER_SORTED_SET = new MethodMatcher("com.google.common.collect.Sets filter(java.util.SortedSet, com.google.common.base.Predicate)");
3435

3536
@Override
3637
public String getDisplayName() {
@@ -49,28 +50,44 @@ public Set<String> getTags() {
4950

5051
@Override
5152
public TreeVisitor<?, ExecutionContext> getVisitor() {
52-
return Preconditions.check(
53-
new UsesMethod<>(SETS_FILTER),
54-
new JavaIsoVisitor<ExecutionContext>() {
55-
@Override
56-
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
57-
if (SETS_FILTER.matches(method)) {
58-
maybeRemoveImport("com.google.common.base.Predicate");
59-
maybeRemoveImport("com.google.common.collect.Sets");
60-
maybeAddImport("java.util.function.Predicate");
61-
maybeAddImport("java.util.stream.Collectors");
53+
TreeVisitor<?, ExecutionContext> precondition = Preconditions.or(new UsesMethod<>(SETS_FILTER), new UsesMethod<>(SETS_FILTER_SORTED_SET));
54+
return Preconditions.check(precondition, new JavaVisitor<ExecutionContext>() {
55+
@Override
56+
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
57+
if (SETS_FILTER_SORTED_SET.matches(method)) {
58+
maybeRemoveImport("com.google.common.base.Predicate");
59+
maybeRemoveImport("com.google.common.collect.Sets");
60+
maybeAddImport("java.util.TreeSet");
61+
maybeAddImport("java.util.function.Predicate");
62+
maybeAddImport("java.util.stream.Collectors");
6263

63-
return JavaTemplate.builder("#{any(java.util.Collection)}.stream().filter(#{any(java.util.function.Predicate)}).collect(Collectors.toSet())")
64-
.imports("java.util.stream.Collectors")
65-
.build()
66-
.apply(getCursor(),
67-
method.getCoordinates().replace(),
68-
method.getArguments().get(0),
69-
method.getArguments().get(1));
70-
}
71-
return super.visitMethodInvocation(method, ctx);
64+
return JavaTemplate.builder("#{any(java.util.Collection)}.stream().filter(#{any(java.util.function.Predicate)}).collect(Collectors.toCollection(TreeSet::new))")
65+
.imports("java.util.TreeSet")
66+
.imports("java.util.stream.Collectors")
67+
.build()
68+
.apply(getCursor(),
69+
method.getCoordinates().replace(),
70+
method.getArguments().get(0),
71+
method.getArguments().get(1));
7272
}
73+
if (SETS_FILTER.matches(method)) {
74+
maybeRemoveImport("com.google.common.base.Predicate");
75+
maybeRemoveImport("com.google.common.collect.Sets");
76+
maybeAddImport("java.util.TreeSet");
77+
maybeAddImport("java.util.function.Predicate");
78+
maybeAddImport("java.util.stream.Collectors");
79+
80+
return JavaTemplate.builder("#{any(java.util.Collection)}.stream().filter(#{any(java.util.function.Predicate)}).collect(Collectors.toSet())")
81+
.imports("java.util.stream.Collectors")
82+
.build()
83+
.apply(getCursor(),
84+
method.getCoordinates().replace(),
85+
method.getArguments().get(0),
86+
method.getArguments().get(1));
87+
}
88+
return super.visitMethodInvocation(method, ctx);
7389
}
90+
}
7491
);
7592
}
7693
}

src/test/java/org/openrewrite/java/migrate/guava/NoGuavaSetsFilterTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,40 @@ public static Set<Object> test(Set<Object> set, Predicate<Object> isNotNull) {
6666
)
6767
);
6868
}
69+
70+
@Test
71+
void replaceSetsFilterUsingSortedSet() {
72+
//language=java
73+
rewriteRun(
74+
java(
75+
"""
76+
import java.util.Set;
77+
import java.util.SortedSet;
78+
79+
import com.google.common.base.Predicate;
80+
import com.google.common.collect.Sets;
81+
82+
class Test {
83+
public static Set<Object> test(SortedSet<Object> set, Predicate<Object> isNotNull) {
84+
return Sets.filter(set, isNotNull);
85+
}
86+
}
87+
""",
88+
"""
89+
import java.util.Set;
90+
import java.util.SortedSet;
91+
import java.util.TreeSet;
92+
import java.util.stream.Collectors;
93+
94+
import com.google.common.base.Predicate;
95+
96+
class Test {
97+
public static Set<Object> test(SortedSet<Object> set, Predicate<Object> isNotNull) {
98+
return set.stream().filter(isNotNull).collect(Collectors.toCollection(TreeSet::new));
99+
}
100+
}
101+
"""
102+
)
103+
);
104+
}
69105
}

0 commit comments

Comments
 (0)