Skip to content

Commit 9557062

Browse files
committed
More tests
1 parent e761b16 commit 9557062

File tree

2 files changed

+133
-8
lines changed

2 files changed

+133
-8
lines changed

rewrite-java-test/src/test/java/org/openrewrite/java/JavaTemplateGenericsTest.java

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.openrewrite.java;
1717

1818
import org.junit.jupiter.api.Test;
19+
import org.junitpioneer.jupiter.ExpectedToFail;
1920
import org.openrewrite.ExecutionContext;
2021
import org.openrewrite.java.tree.Expression;
2122
import org.openrewrite.java.tree.J;
@@ -288,4 +289,118 @@ Stream<Integer> test() {
288289
)
289290
);
290291
}
292+
293+
@Test
294+
@ExpectedToFail
295+
void replaceMemberReferenceToLambda() {
296+
//noinspection Convert2MethodRef
297+
rewriteRun(
298+
spec -> spec
299+
.expectedCyclesThatMakeChanges(1).cycles(1)
300+
.recipe(toRecipe(() -> new JavaVisitor<>() {
301+
final JavaTemplate refTemplate = JavaTemplate.builder("T::toString")
302+
.bindType("java.util.function.Function<T, String>")
303+
.genericTypes("T")
304+
.build();
305+
final JavaTemplate lambdaTemplate = JavaTemplate.builder("e -> e.toString()")
306+
.bindType("java.util.function.Function<T, String>")
307+
.genericTypes("T")
308+
.build();
309+
310+
@Override
311+
public J visitMemberReference(J.MemberReference memberRef, ExecutionContext executionContext) {
312+
JavaTemplate.Matcher matcher = refTemplate.matcher(getCursor());
313+
if (matcher.find()) {
314+
return lambdaTemplate.apply(getCursor(), memberRef.getCoordinates().replace(), matcher.getMatchResult().getMatchedParameters().toArray());
315+
} else {
316+
return super.visitMemberReference(memberRef, executionContext);
317+
}
318+
}
319+
})),
320+
//language=java
321+
java(
322+
"""
323+
import java.util.function.Function;
324+
325+
class Foo {
326+
void test() {
327+
test(Object::toString);
328+
}
329+
330+
void test(Function<Object, String> fn) {
331+
}
332+
}
333+
""",
334+
"""
335+
import java.util.function.Function;
336+
337+
class Foo {
338+
void test() {
339+
test(e -> e.toString());
340+
}
341+
342+
void test(Function<Object, String> fn) {
343+
}
344+
}
345+
"""
346+
)
347+
);
348+
}
349+
350+
@Test
351+
@ExpectedToFail
352+
void replaceLambdaToMemberReference() {
353+
//noinspection Convert2MethodRef
354+
rewriteRun(
355+
spec -> spec
356+
.expectedCyclesThatMakeChanges(1).cycles(1)
357+
.recipe(toRecipe(() -> new JavaVisitor<>() {
358+
final JavaTemplate lambdaTemplate = JavaTemplate.builder("e -> e.toString()")
359+
.bindType("java.util.function.Function<T, String>")
360+
.genericTypes("T")
361+
.build();
362+
final JavaTemplate refTemplate = JavaTemplate.builder("T::toString")
363+
.bindType("java.util.function.Function<T, String>")
364+
.genericTypes("T")
365+
.build();
366+
367+
@Override
368+
public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) {
369+
JavaTemplate.Matcher matcher = lambdaTemplate.matcher(getCursor());
370+
if (matcher.find()) {
371+
return refTemplate.apply(getCursor(), lambda.getCoordinates().replace(), matcher.getMatchResult().getMatchedParameters().toArray());
372+
} else {
373+
return super.visitLambda(lambda, executionContext);
374+
}
375+
}
376+
})),
377+
//language=java
378+
java(
379+
"""
380+
import java.util.function.Function;
381+
382+
class Foo {
383+
void test() {
384+
test(e -> e.toString());
385+
}
386+
387+
void test(Function<Object, String> fn) {
388+
}
389+
}
390+
""",
391+
"""
392+
import java.util.function.Function;
393+
394+
class Foo {
395+
void test() {
396+
test(Object::toString);
397+
}
398+
399+
void test(Function<Object, String> fn) {
400+
}
401+
}
402+
"""
403+
)
404+
);
405+
}
291406
}

rewrite-java-test/src/test/java/org/openrewrite/java/JavaTemplateMatchTest.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ void matchMemberReferenceAndLambda() {
10531053
rewriteRun(
10541054
spec -> spec
10551055
.expectedCyclesThatMakeChanges(1).cycles(1)
1056-
.recipe(toRecipe(() -> new JavaIsoVisitor<>() {
1056+
.recipe(toRecipe(() -> new JavaVisitor<>() {
10571057
final JavaTemplate refTemplate = JavaTemplate.builder("String::valueOf")
10581058
.bindType("java.util.function.Function<Object, String>")
10591059
.build();
@@ -1062,13 +1062,23 @@ void matchMemberReferenceAndLambda() {
10621062
.build();
10631063

10641064
@Override
1065-
public J.MemberReference visitMemberReference(J.MemberReference memberRef, ExecutionContext executionContext) {
1066-
return refTemplate.matches(getCursor()) ? SearchResult.found(memberRef, "ref") : super.visitMemberReference(memberRef, executionContext);
1065+
public J visitMemberReference(J.MemberReference memberRef, ExecutionContext executionContext) {
1066+
var matcher = refTemplate.matcher(getCursor());
1067+
if (matcher.find()) {
1068+
return lambdaTemplate.apply(getCursor(), memberRef.getCoordinates().replace(), matcher.getMatchResult().getMatchedParameters().toArray());
1069+
} else {
1070+
return super.visitMemberReference(memberRef, executionContext);
1071+
}
10671072
}
10681073

10691074
@Override
1070-
public J.Lambda visitLambda(J.Lambda lambda, ExecutionContext executionContext) {
1071-
return lambdaTemplate.matches(getCursor()) ? SearchResult.found(lambda, "lambda") : super.visitLambda(lambda, executionContext);
1075+
public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) {
1076+
var matcher = lambdaTemplate.matcher(getCursor());
1077+
if (matcher.find()) {
1078+
return refTemplate.apply(getCursor(), lambda.getCoordinates().replace(), matcher.getMatchResult().getMatchedParameters().toArray());
1079+
} else {
1080+
return lambdaTemplate.matches(getCursor()) ? SearchResult.found(lambda, "lambda") : super.visitLambda(lambda, executionContext);
1081+
}
10721082
}
10731083
})),
10741084
//language=java
@@ -1092,9 +1102,9 @@ void test(Function<Object, String> fn) {
10921102
10931103
class Foo {
10941104
void test() {
1095-
test(/*~~(ref)~~>*/String::valueOf);
1096-
test(/*~~(lambda)~~>*/e -> e.toString());
1097-
test(/*~~(lambda)~~>*/x -> x.toString());
1105+
test((e) -> e.toString());
1106+
test(String::valueOf);
1107+
test(String::valueOf);
10981108
}
10991109
11001110
void test(Function<Object, String> fn) {

0 commit comments

Comments
 (0)