From f36652c405d18e6d3f5124f872726a82d4af42d6 Mon Sep 17 00:00:00 2001 From: Pierre Delagrave Date: Thu, 19 Jun 2025 09:29:36 -0400 Subject: [PATCH] fix: match `.toString()` on any type, not just java.lang.Object `MethodMatcher()` pattern doesn't match subtypes of the specified receiver --- .../java/logging/ParameterizedLogging.java | 2 +- .../logging/ParameterizedLoggingTest.java | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/logging/ParameterizedLogging.java b/src/main/java/org/openrewrite/java/logging/ParameterizedLogging.java index 6236fc33..c9a96095 100644 --- a/src/main/java/org/openrewrite/java/logging/ParameterizedLogging.java +++ b/src/main/java/org/openrewrite/java/logging/ParameterizedLogging.java @@ -146,7 +146,7 @@ private boolean isMarker(Expression expression) { private static class RemoveToStringVisitor extends JavaVisitor { private final JavaTemplate t = JavaTemplate.builder("#{any(java.lang.String)}").build(); - private final MethodMatcher TO_STRING = new MethodMatcher("java.lang.Object toString()"); + private final MethodMatcher TO_STRING = new MethodMatcher("*..* toString()"); @Override public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { diff --git a/src/test/java/org/openrewrite/java/logging/ParameterizedLoggingTest.java b/src/test/java/org/openrewrite/java/logging/ParameterizedLoggingTest.java index cff4aeda..0f36a1ed 100644 --- a/src/test/java/org/openrewrite/java/logging/ParameterizedLoggingTest.java +++ b/src/test/java/org/openrewrite/java/logging/ParameterizedLoggingTest.java @@ -98,6 +98,37 @@ static void method(Logger logger, Object person) { ); } + @SuppressWarnings("UnnecessaryToStringCall") + @Test + void noNeedToCallToStringOnParameterizedArgumentOfAnyType() { + rewriteRun( + spec -> spec.recipe(new ParameterizedLogging("org.slf4j.Logger info(..)", true)), + //language=java + java( + """ + import java.util.stream.Stream; + import org.slf4j.Logger; + + class Test { + static void method(Logger logger, Stream person) { + logger.info("Hello " + person.toString() + ", your name has " + person.toString().length() + " characters. Just counting " + person.toString()); + } + } + """, + """ + import java.util.stream.Stream; + import org.slf4j.Logger; + + class Test { + static void method(Logger logger, Stream person) { + logger.info("Hello {}, your name has {} characters. Just counting {}", person, person.toString().length(), person); + } + } + """ + ) + ); + } + @Test void doNotRemoveStringOnParameterizedArgument() { rewriteRun(