From 526ea10a8ad56e5007dea2832eda784cd5e27e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Merlin=20B=C3=B6gershausen?= Date: Mon, 16 Jun 2025 12:53:46 +0200 Subject: [PATCH 1/7] add test cases based on OpenSource findings --- .../lombok/LombokValToFinalVarTest.java | 169 +++++++++++++++--- 1 file changed, 141 insertions(+), 28 deletions(-) diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java index 34351afe4c..2e51540a06 100755 --- a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java @@ -15,6 +15,7 @@ */ package org.openrewrite.java.migrate.lombok; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.java.JavaParser; @@ -112,40 +113,152 @@ void bar() { ); } + @Nested @SuppressWarnings({"StatementWithEmptyBody", "RedundantOperationOnEmptyContainer"}) - @Test - void valInForEachStatement() { - //language=java - rewriteRun( - version( - java( - """ - import lombok.val; - import java.util.List; - import java.util.ArrayList; + class ValInLoop { + @Test + void list() { + //language=java + rewriteRun( + version( + java( + """ + import lombok.val; - class A { - void bar() { - List lst = new ArrayList<>(); - for (val s : lst) {} + import java.util.ArrayList; + import java.util.List; + + class A { + void bar() { + List lst = new ArrayList<>(); + for (val s : lst) {} + } } - } - """, - """ - import java.util.List; - import java.util.ArrayList; + """, + """ + import java.util.List; + import java.util.ArrayList; - class A { - void bar() { - List lst = new ArrayList<>(); - for (final var s : lst) {} + class A { + void bar() { + List lst = new ArrayList<>(); + for (final var s : lst) {} + } } - } + """ + ), + 17 + ) + ); + } + + @Test + void array() { + //language=java + rewriteRun( + version( + java( + """ + import lombok.val; + import java.util.List; + import java.util.ArrayList; + + class A { + void bar() { + String[] lst = new String[]{"ABC", "DEF", "DOESN'T", "MATTER"}; + for (val s : lst) {} + } + } + """, + """ + import java.util.List; + import java.util.ArrayList; + + class A { + void bar() { + String[] lst = new String[]{"ABC", "DEF", "DOESN'T", "MATTER"}; + for (final var s : lst) {} + } + } + """ + ), + 17 + ) + ); + } + + @Test + void parameter() { + //language=java + rewriteRun( + version( + java( + """ + import lombok.val; + import java.nio.file.Path; + import java.util.List; + import java.util.ArrayList; + + class A { + static void bar(final List lst) { + for (val s : lst) {} + } + } + """, + """ + import java.nio.file.Path; + import java.util.List; + import java.util.ArrayList; + + class A { + static void bar(final List lst) { + for (final var s : lst) {} + } + } + """ + ), + 17 + ) + ); + } + + + @Test + void valuesFromMethod() { + //language=java + rewriteRun( + java( """ - ), - 17 - ) - ); + interface Mapper { + String[] getNamesList(); + } + """ + ), + version( + java( + """ + import lombok.val; + + class A { + Mapper mapper; + void bar() { + for (val s : mapper.getNamesList()) {} + } + } + """, + """ + class A { + Mapper mapper; + void bar() { + for (final var s : mapper.getNamesList()) {} + } + } + """ + ), + 17 + ) + ); + } } @Test From 51ef26c6f91cb42ea8ad0866d59d5e9c0869cac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Merlin=20B=C3=B6gershausen?= Date: Wed, 18 Jun 2025 13:11:01 +0200 Subject: [PATCH 2/7] manually migrate from `for(val s : strings)` to `for(var s : strings)` to avoid java template --- .../migrate/lombok/LombokValToFinalVar.java | 42 ++++++++++--------- .../lombok/LombokValToFinalVarTest.java | 12 +++--- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java index 3a6826373a..490f8a034b 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java @@ -15,17 +15,17 @@ */ package org.openrewrite.java.migrate.lombok; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.RemoveUnusedImports; import org.openrewrite.java.search.MaybeUsesImport; import org.openrewrite.java.search.UsesType; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; +import org.openrewrite.java.service.AnnotationService; +import org.openrewrite.java.tree.*; +import org.openrewrite.marker.Markers; import java.time.Duration; import java.util.Collections; @@ -75,26 +75,28 @@ public J.CompilationUnit visitCompilationUnit(J.CompilationUnit compilationUnit, @Override public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations mv, ExecutionContext ctx) { J.VariableDeclarations varDecls = super.visitVariableDeclarations(mv, ctx); + if (TypeUtils.isOfClassType(varDecls.getType(), LOMBOK_VAL) || - (varDecls.getTypeExpression() instanceof J.Identifier && ((J.Identifier) varDecls.getTypeExpression()).getSimpleName().equals("val"))) { + (varDecls.getTypeExpression() instanceof J.Identifier && ((J.Identifier) varDecls.getTypeExpression()).getSimpleName().equals("val"))) { maybeRemoveImport(LOMBOK_VAL); J.VariableDeclarations.NamedVariable nv = mv.getVariables().get(0); - String finalVarVariableTemplateString; - Object[] args; if (nv.getInitializer() == null) { - finalVarVariableTemplateString = "final var #{}"; - args = new Object[]{nv.getSimpleName()}; + // manually transoform to var, as val in this case has no sufficent type information due to https://github.com/openrewrite/rewrite/pull/5637 + TypeTree typeExpression = varDecls.getTypeExpression(); + J.Identifier varType = new J.Identifier(Tree.randomId(), + typeExpression.getPrefix(), + typeExpression.getMarkers(), + service(AnnotationService.class).getAllAnnotations(getCursor()), + "var", + nv.getType(), + null); + varDecls = varDecls.withTypeExpression(varType); } else { - finalVarVariableTemplateString = "final var #{} = #{any()};"; - args = new Object[]{nv.getSimpleName(), nv.getInitializer()}; - } - varDecls = JavaTemplate.builder(finalVarVariableTemplateString) - .contextSensitive() - .build() - .apply(updateCursor(varDecls), varDecls.getCoordinates().replace(), args); - - if (nv.getInitializer() != null) { + varDecls = JavaTemplate.builder("final var #{} = #{any()};") + .contextSensitive() + .build() + .apply(updateCursor(varDecls), varDecls.getCoordinates().replace(), nv.getSimpleName(), nv.getInitializer()); varDecls = varDecls.withVariables(ListUtils.map(varDecls.getVariables(), namedVar -> namedVar .withInitializer(namedVar.getInitializer().withPrefix(nv.getInitializer().getPrefix())))); } diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java index 2e51540a06..bf0d4cb8cd 100755 --- a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java @@ -17,7 +17,9 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ExpectedToFail; import org.openrewrite.DocumentExample; +import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -136,13 +138,13 @@ void bar() { } """, """ - import java.util.List; import java.util.ArrayList; + import java.util.List; class A { void bar() { List lst = new ArrayList<>(); - for (final var s : lst) {} + for (var s : lst) {} } } """ @@ -177,7 +179,7 @@ void bar() { class A { void bar() { String[] lst = new String[]{"ABC", "DEF", "DOESN'T", "MATTER"}; - for (final var s : lst) {} + for (var s : lst) {} } } """ @@ -212,7 +214,7 @@ static void bar(final List lst) { class A { static void bar(final List lst) { - for (final var s : lst) {} + for (var s : lst) {} } } """ @@ -250,7 +252,7 @@ void bar() { class A { Mapper mapper; void bar() { - for (final var s : mapper.getNamesList()) {} + for (var s : mapper.getNamesList()) {} } } """ From 904ee0ab46da8fa13753014c195efa8a47e25123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Merlin=20B=C3=B6gershausen?= Date: Wed, 18 Jun 2025 23:41:15 +0200 Subject: [PATCH 3/7] fix type and imports --- .../java/migrate/lombok/LombokValToFinalVar.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java index 490f8a034b..abbeda085a 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java @@ -18,14 +18,13 @@ import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; -import org.openrewrite.java.RemoveUnusedImports; import org.openrewrite.java.search.MaybeUsesImport; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.service.AnnotationService; -import org.openrewrite.java.tree.*; -import org.openrewrite.marker.Markers; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.TypeTree; +import org.openrewrite.java.tree.TypeUtils; import java.time.Duration; import java.util.Collections; @@ -82,7 +81,7 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m J.VariableDeclarations.NamedVariable nv = mv.getVariables().get(0); if (nv.getInitializer() == null) { - // manually transoform to var, as val in this case has no sufficent type information due to https://github.com/openrewrite/rewrite/pull/5637 + // manually transform to var, as val in this case has no sufficient type information, and the java template parsing would fail, see https://github.com/openrewrite/rewrite/pull/5637 TypeTree typeExpression = varDecls.getTypeExpression(); J.Identifier varType = new J.Identifier(Tree.randomId(), typeExpression.getPrefix(), From 4f623e5a07508969483ab18c0d78f8173bb0f84d Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 19 Jun 2025 07:48:47 +0200 Subject: [PATCH 4/7] Apply suggestions from code review --- .../openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java index bf0d4cb8cd..b02b3c097a 100755 --- a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java @@ -17,7 +17,6 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junitpioneer.jupiter.ExpectedToFail; import org.openrewrite.DocumentExample; import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; From 8ab619fd9af38f627077efeb51081c731765a925 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 19 Jun 2025 08:25:09 +0200 Subject: [PATCH 5/7] Apply suggestions from code review --- .../openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java index b02b3c097a..b79bf3fe29 100755 --- a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; From 009ef66c4a0b1b3fd1508670c79aed84a18bf03f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 8 Jul 2025 23:40:27 +0200 Subject: [PATCH 6/7] Add early return for new case --- .../migrate/lombok/LombokValToFinalVar.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java index abbeda085a..acc7f6e7ec 100644 --- a/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java +++ b/src/main/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVar.java @@ -76,12 +76,13 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m J.VariableDeclarations varDecls = super.visitVariableDeclarations(mv, ctx); if (TypeUtils.isOfClassType(varDecls.getType(), LOMBOK_VAL) || - (varDecls.getTypeExpression() instanceof J.Identifier && ((J.Identifier) varDecls.getTypeExpression()).getSimpleName().equals("val"))) { + (varDecls.getTypeExpression() instanceof J.Identifier && "val".equals(((J.Identifier) varDecls.getTypeExpression()).getSimpleName()))) { maybeRemoveImport(LOMBOK_VAL); J.VariableDeclarations.NamedVariable nv = mv.getVariables().get(0); if (nv.getInitializer() == null) { - // manually transform to var, as val in this case has no sufficient type information, and the java template parsing would fail, see https://github.com/openrewrite/rewrite/pull/5637 + // manually transform to var, as val in this case has no sufficient type information + // and the java template parsing would fail, see https://github.com/openrewrite/rewrite/pull/5637 TypeTree typeExpression = varDecls.getTypeExpression(); J.Identifier varType = new J.Identifier(Tree.randomId(), typeExpression.getPrefix(), @@ -90,15 +91,15 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m "var", nv.getType(), null); - varDecls = varDecls.withTypeExpression(varType); - } else { - varDecls = JavaTemplate.builder("final var #{} = #{any()};") - .contextSensitive() - .build() - .apply(updateCursor(varDecls), varDecls.getCoordinates().replace(), nv.getSimpleName(), nv.getInitializer()); - varDecls = varDecls.withVariables(ListUtils.map(varDecls.getVariables(), namedVar -> namedVar - .withInitializer(namedVar.getInitializer().withPrefix(nv.getInitializer().getPrefix())))); + return varDecls.withTypeExpression(varType); } + + varDecls = JavaTemplate.builder("final var #{} = #{any()};") + .contextSensitive() + .build() + .apply(updateCursor(varDecls), varDecls.getCoordinates().replace(), nv.getSimpleName(), nv.getInitializer()); + varDecls = varDecls.withVariables(ListUtils.map(varDecls.getVariables(), namedVar -> namedVar + .withInitializer(namedVar.getInitializer().withPrefix(nv.getInitializer().getPrefix())))); } return varDecls; } From 10f11f4ae0161a6c4ea2f2dc154f873055c20b60 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 8 Jul 2025 23:45:47 +0200 Subject: [PATCH 7/7] Minimize test text blocks --- .../lombok/LombokValToFinalVarTest.java | 56 ++----------------- 1 file changed, 6 insertions(+), 50 deletions(-) diff --git a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java index 74c5ed4735..680ff5157a 100755 --- a/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java +++ b/src/test/java/org/openrewrite/java/migrate/lombok/LombokValToFinalVarTest.java @@ -125,23 +125,19 @@ void list() { """ import lombok.val; - import java.util.ArrayList; import java.util.List; class A { - void bar() { - List lst = new ArrayList<>(); + void bar(List lst) { for (val s : lst) {} } } """, """ - import java.util.ArrayList; import java.util.List; class A { - void bar() { - List lst = new ArrayList<>(); + void bar(List lst) { for (var s : lst) {} } } @@ -164,8 +160,7 @@ void array() { import java.util.ArrayList; class A { - void bar() { - String[] lst = new String[]{"ABC", "DEF", "DOESN'T", "MATTER"}; + void bar(String[] lst) { for (val s : lst) {} } } @@ -175,8 +170,7 @@ void bar() { import java.util.ArrayList; class A { - void bar() { - String[] lst = new String[]{"ABC", "DEF", "DOESN'T", "MATTER"}; + void bar(String[] lst) { for (var s : lst) {} } } @@ -187,42 +181,6 @@ void bar() { ); } - @Test - void parameter() { - //language=java - rewriteRun( - version( - java( - """ - import lombok.val; - import java.nio.file.Path; - import java.util.List; - import java.util.ArrayList; - - class A { - static void bar(final List lst) { - for (val s : lst) {} - } - } - """, - """ - import java.nio.file.Path; - import java.util.List; - import java.util.ArrayList; - - class A { - static void bar(final List lst) { - for (var s : lst) {} - } - } - """ - ), - 17 - ) - ); - } - - @Test void valuesFromMethod() { //language=java @@ -240,16 +198,14 @@ interface Mapper { import lombok.val; class A { - Mapper mapper; - void bar() { + void bar(Mapper mapper) { for (val s : mapper.getNamesList()) {} } } """, """ class A { - Mapper mapper; - void bar() { + void bar(Mapper mapper) { for (var s : mapper.getNamesList()) {} } }