From 852844c7f2811be2302e70557ce946509e58f725 Mon Sep 17 00:00:00 2001 From: Jakub Urbaniak <147380277+kubaluzak@users.noreply.github.com> Date: Mon, 9 Nov 2026 23:52:43 +0000 Subject: [PATCH] Fix Lombok setter names for boolean is-prefixed fields --- .../java/migrate/lombok/LombokUtils.java | 20 ++++++--- .../AdoptLombokSetterMethodNamesTest.java | 40 +++++++++++++++++ .../migrate/lombok/UseLombokSetterTest.java | 45 +++++++++++++++++++ 3 files changed, 98 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/LombokUtils.java b/src/main/java/org/openrewrite/java/migrate/lombok/LombokUtils.java index 5226de9d1f..aae043c2cf 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/LombokUtils.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/LombokUtils.java @@ -143,7 +143,7 @@ static boolean isSetter(Cursor cursor) { JavaType.FullyQualified declaringType = method.getMethodType().getDeclaringType(); if (variable instanceof J.Identifier) { J.Identifier assignedVar = (J.Identifier) variable; - if (hasMatchingSetterMethodName(method, assignedVar.getSimpleName())) { + if (hasMatchingSetterMethodName(method, assignedVar.getType(), assignedVar.getSimpleName())) { if (assignedVar.getFieldType() != null && declaringType == assignedVar.getFieldType().getOwner()) { // Don't replace instance methods accessing static fields return !assignedVar.getFieldType().hasFlags(Flag.Static); @@ -151,7 +151,7 @@ static boolean isSetter(Cursor cursor) { } } else if (variable instanceof J.FieldAccess) { J.FieldAccess assignedField = (J.FieldAccess) variable; - if (hasMatchingSetterMethodName(method, assignedField.getSimpleName())) { + if (hasMatchingSetterMethodName(method, assignedField.getType(), assignedField.getSimpleName())) { Expression target = assignedField.getTarget(); // Only handle "this.field" pattern, not "someObject.field" if (target instanceof J.Identifier && "this".equals(((J.Identifier) target).getSimpleName())) { @@ -167,9 +167,9 @@ static boolean isSetter(Cursor cursor) { return false; } - private static boolean hasMatchingSetterMethodName(J.MethodDeclaration method, String simpleName) { - return method.getSimpleName().equals("set" + StringUtils.capitalize(simpleName)); - } + private static boolean hasMatchingSetterMethodName(J.MethodDeclaration method, @Nullable JavaType type, String simpleName) { + return method.getSimpleName().equals(deriveSetterMethodName(type, simpleName)); +} public static boolean isEffectivelySetter(J.MethodDeclaration method) { if (method.getType() != JavaType.Primitive.Void) { @@ -201,8 +201,14 @@ public static boolean isEffectivelySetter(J.MethodDeclaration method) { } public static String deriveSetterMethodName(JavaType.Variable fieldType) { - return "set" + StringUtils.capitalize(fieldType.getName()); - } + return deriveSetterMethodName(fieldType.getType(), fieldType.getName()); +} + + private static String deriveSetterMethodName(@Nullable JavaType type, String fieldName) { + String setterBaseName = type == JavaType.Primitive.Boolean && IS_PREFIX.matcher(fieldName).lookingAt() ? + fieldName.substring(2) : fieldName; + return "set" + StringUtils.capitalize(setterBaseName); +} static AccessLevel getAccessLevel(J.MethodDeclaration methodDeclaration) { if (methodDeclaration.hasModifier(Public)) { diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/AdoptLombokSetterMethodNamesTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/AdoptLombokSetterMethodNamesTest.java index 5c98192638..9934c0b774 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/AdoptLombokSetterMethodNamesTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/AdoptLombokSetterMethodNamesTest.java @@ -124,6 +124,46 @@ class A { ); } + @Test +void renamePrimitiveBooleanWithIsPrefix() { + rewriteRun(// language=java + java( + """ + class A { + boolean isFoo; + void storeFoo(boolean isFoo) { this.isFoo = isFoo; } + } + """, + """ + class A { + boolean isFoo; + void setFoo(boolean isFoo) { this.isFoo = isFoo; } + } + """ + ) + ); +} + +@Test +void renameBoxedBooleanWithIsPrefix() { + rewriteRun(// language=java + java( + """ + class A { + Boolean isFoo; + void storeFoo(Boolean isFoo) { this.isFoo = isFoo; } + } + """, + """ + class A { + Boolean isFoo; + void setIsFoo(Boolean isFoo) { this.isFoo = isFoo; } + } + """ + ) + ); +} + @Test void renameClassBooleanInSingleClass() { rewriteRun(// language=java diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/UseLombokSetterTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/UseLombokSetterTest.java index 414ff9cbcc..e5d3799137 100644 --- a/src/test/java/org/openrewrite/java/migrate/lombok/UseLombokSetterTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/UseLombokSetterTest.java @@ -520,6 +520,51 @@ class A { ); } + @Test +void replacePrimitiveBooleanSetterWithIsPrefix() { + rewriteRun(// language=java + java( + """ + class A { + + boolean isFoo; + + public void setFoo(boolean isFoo) { + this.isFoo = isFoo; + } + } + """, + """ + import lombok.Setter; + + class A { + + @Setter + boolean isFoo; + } + """ + ) + ); +} + +@Test +void doesNotReplacePrimitiveBooleanSetterWithWrongLombokName() { + rewriteRun(// language=java + java( + """ + class A { + + boolean isFoo; + + public void setIsFoo(boolean isFoo) { + this.isFoo = isFoo; + } + } + """ + ) + ); +} + @Test void replaceBoolean() { rewriteRun(// language=java