From dc3899ecdb84c1764420859071fdfa44a0e9db1e Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 3 May 2026 13:47:54 +0200 Subject: [PATCH] InlineMethodCalls: preserve method select when replacement is bare When the original invocation has a select (`red.getTotalHits()`) and the replacement template is a bare method call (`getTotalHitsCount()`), prepend the select so the result is `red.getTotalHitsCount()` instead of dropping the receiver. Fixes #7549 --- .../openrewrite/java/InlineMethodCalls.java | 6 +++ .../java/InlineMethodCallsTest.java | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/rewrite-java/src/main/java/org/openrewrite/java/InlineMethodCalls.java b/rewrite-java/src/main/java/org/openrewrite/java/InlineMethodCalls.java index e8792151626..0f362e9f0f2 100644 --- a/rewrite-java/src/main/java/org/openrewrite/java/InlineMethodCalls.java +++ b/rewrite-java/src/main/java/org/openrewrite/java/InlineMethodCalls.java @@ -35,6 +35,7 @@ @Value public class InlineMethodCalls extends Recipe { private static final Pattern TEMPLATE_IDENTIFIER = Pattern.compile("#\\{(\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*):any\\(.*?\\)}"); + private static final Pattern BARE_METHOD_CALL = Pattern.compile("^\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*\\("); @Option(displayName = "Method pattern", description = "A method pattern that is used to find matching method invocations.", @@ -199,6 +200,11 @@ private String createTemplateString(MethodCall original, JavaType.Method methodT ((J.MethodInvocation) original).getSelect() == null && replacement.startsWith("this.")) { templateString = replacement.substring(5); + } else if (original instanceof J.MethodInvocation && + ((J.MethodInvocation) original).getSelect() != null && + BARE_METHOD_CALL.matcher(replacement).find()) { + // Original had a select but replacement is a bare method call; preserve the select + templateString = "#{this:any()}." + replacement; } else { templateString = replacement.replaceAll("\\bthis\\b", "#{this:any()}"); } diff --git a/rewrite-java/src/test/java/org/openrewrite/java/InlineMethodCallsTest.java b/rewrite-java/src/test/java/org/openrewrite/java/InlineMethodCallsTest.java index b23b2aae405..2fa13e031b3 100644 --- a/rewrite-java/src/test/java/org/openrewrite/java/InlineMethodCallsTest.java +++ b/rewrite-java/src/test/java/org/openrewrite/java/InlineMethodCallsTest.java @@ -508,6 +508,53 @@ void foo(Builder builder) { ); } + @Test + void preserveSelectWhenReplacementIsBareMethodCall() { + //language=java + rewriteRun( + spec -> spec.recipe(new InlineMethodCalls( + "Lib getTotalHits()", + "getTotalHitsCount()", + null, + null, + null)), + java( + """ + class Lib { + @Deprecated + public int getTotalHits() { + return getTotalHitsCount(); + } + + public int getTotalHitsCount() { + return 0; + } + + static int usage(Lib lib) { + return lib.getTotalHits(); + } + } + """, + """ + class Lib { + @Deprecated + public int getTotalHits() { + return getTotalHitsCount(); + } + + public int getTotalHitsCount() { + return 0; + } + + static int usage(Lib lib) { + return lib.getTotalHitsCount(); + } + } + """ + ) + ); + } + @Test void sameArgumentUsedTwice() { //language=java