From baa2b6b3fd20c730e91dfee6aa62fe9a50cd847a Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Fri, 27 Mar 2026 17:37:02 +1300 Subject: [PATCH 1/2] feat: support default gradle plugins --- .../visitors/GroovyAddPluginVisitor.java | 8 +++-- .../visitors/KotlinAddPluginVisitor.java | 8 +++-- .../rewrite/AddGradlePluginRecipeTests.java | 29 +++++++++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java b/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java index e15e9db7..6817fbf4 100644 --- a/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java +++ b/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java @@ -37,6 +37,8 @@ public class GroovyAddPluginVisitor extends GroovyIsoVisitor { private final String pluginTemplateGroovy = "plugins {\n\tid '%s' version '%s'\n}\n"; + private final String builtInTemplateGroovy = "plugins {\n\tid '%s'\n}\n"; + private final AddPluginVisitor visitor; private final SourceFile templateSource; @@ -46,10 +48,10 @@ public GroovyAddPluginVisitor(String pluginName, String pluginVersion) { .groovyParser(GroovyParser.builder().logCompilationWarningsAndErrors(true)); Parser parser = builder.build(); InMemoryExecutionContext context = new InMemoryExecutionContext(); + var pluginDefinition = (pluginVersion == null) ? String.format(builtInTemplateGroovy, pluginName) + : String.format(pluginTemplateGroovy, pluginName, pluginVersion); templateSource = parser - .parseInputs( - Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle"), - String.format(pluginTemplateGroovy, pluginName, pluginVersion))), + .parseInputs(Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle"), pluginDefinition)), Paths.get("/tmp"), context) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Could not parse as Gradle")); diff --git a/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java b/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java index 7478ddfb..8461e51e 100644 --- a/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java +++ b/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java @@ -37,6 +37,8 @@ public class KotlinAddPluginVisitor extends KotlinIsoVisitor { private final String pluginTemplateKotlin = "plugins {\n\tid(\"%s\") version \"%s\"\n}\n"; + private final String builtInTemplateKotlin = "plugins {\n\tid(\"%s\")\n}\n"; + private final AddPluginVisitor visitor; private final SourceFile templateSource; @@ -48,10 +50,10 @@ public KotlinAddPluginVisitor(String pluginName, String pluginVersion) { InMemoryExecutionContext context = new InMemoryExecutionContext(); // Use dummy file name to force the use of kotlin parser + var pluginDefinition = (pluginVersion == null) ? String.format(builtInTemplateKotlin, pluginName) + : String.format(pluginTemplateKotlin, pluginName, pluginVersion); templateSource = parser - .parseInputs( - Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle.kts"), - String.format(pluginTemplateKotlin, pluginName, pluginVersion))), + .parseInputs(Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle.kts"), pluginDefinition)), Paths.get("/tmp"), context) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Could not parse as Gradle Kotlin")); diff --git a/src/test/java/com/canonical/devpackspring/rewrite/AddGradlePluginRecipeTests.java b/src/test/java/com/canonical/devpackspring/rewrite/AddGradlePluginRecipeTests.java index 58107b3a..cc04e7fd 100644 --- a/src/test/java/com/canonical/devpackspring/rewrite/AddGradlePluginRecipeTests.java +++ b/src/test/java/com/canonical/devpackspring/rewrite/AddGradlePluginRecipeTests.java @@ -22,6 +22,35 @@ public class AddGradlePluginRecipeTests implements RewriteTest { + @Test + void testGroovyAddBuiltInPlugin() { + rewriteRun(spec -> spec.recipe(new AddGradlePluginRecipe("java", null, false)), Assertions.buildGradle(""" + group = 'com.example' + version = '1.0' + """, """ + plugins { + id 'java' + } + group = 'com.example' + version = '1.0'""")); + + } + + @Test + void testKotlinAddBuiltInPlugin() { + rewriteRun(spec -> spec.recipe(new AddGradlePluginRecipe("java", null, true)), Assertions.buildGradleKts(""" + group = "com.example" + version = "1.0" + """, """ + plugins { + id("java") + } + group = "com.example" + version = "1.0" + """)); + + } + @Test void testGroovyAddPluginNoPluginBlock() { rewriteRun(spec -> spec.recipe(new AddGradlePluginRecipe("org.springframework.boot", "3.4.3", false)), From af14d89164869e1a69535f74a69a8e19fc263b60 Mon Sep 17 00:00:00 2001 From: Vladimir Petko Date: Fri, 27 Mar 2026 18:09:16 +1300 Subject: [PATCH 2/2] chore: checkstyle violation --- .../rewrite/visitors/GroovyAddPluginVisitor.java | 7 +++---- .../rewrite/visitors/KotlinAddPluginVisitor.java | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java b/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java index 6817fbf4..c118ad31 100644 --- a/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java +++ b/src/main/java/com/canonical/devpackspring/rewrite/visitors/GroovyAddPluginVisitor.java @@ -17,7 +17,6 @@ package com.canonical.devpackspring.rewrite.visitors; import java.nio.file.Paths; -import java.util.Arrays; import java.util.List; import com.canonical.devpackspring.rewrite.StatementUtil; @@ -48,10 +47,10 @@ public GroovyAddPluginVisitor(String pluginName, String pluginVersion) { .groovyParser(GroovyParser.builder().logCompilationWarningsAndErrors(true)); Parser parser = builder.build(); InMemoryExecutionContext context = new InMemoryExecutionContext(); - var pluginDefinition = (pluginVersion == null) ? String.format(builtInTemplateGroovy, pluginName) - : String.format(pluginTemplateGroovy, pluginName, pluginVersion); + var pluginDefinition = (pluginVersion != null) ? String.format(pluginTemplateGroovy, pluginName, pluginVersion) + : String.format(builtInTemplateGroovy, pluginName); templateSource = parser - .parseInputs(Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle"), pluginDefinition)), + .parseInputs(List.of(Parser.Input.fromString(Paths.get("/tmp/build.gradle"), pluginDefinition)), Paths.get("/tmp"), context) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Could not parse as Gradle")); diff --git a/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java b/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java index 8461e51e..a42582ad 100644 --- a/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java +++ b/src/main/java/com/canonical/devpackspring/rewrite/visitors/KotlinAddPluginVisitor.java @@ -17,7 +17,6 @@ package com.canonical.devpackspring.rewrite.visitors; import java.nio.file.Paths; -import java.util.Arrays; import java.util.List; import com.canonical.devpackspring.rewrite.StatementUtil; @@ -50,10 +49,10 @@ public KotlinAddPluginVisitor(String pluginName, String pluginVersion) { InMemoryExecutionContext context = new InMemoryExecutionContext(); // Use dummy file name to force the use of kotlin parser - var pluginDefinition = (pluginVersion == null) ? String.format(builtInTemplateKotlin, pluginName) - : String.format(pluginTemplateKotlin, pluginName, pluginVersion); + var pluginDefinition = (pluginVersion != null) ? String.format(pluginTemplateKotlin, pluginName, pluginVersion) + : String.format(builtInTemplateKotlin, pluginName); templateSource = parser - .parseInputs(Arrays.asList(Parser.Input.fromString(Paths.get("/tmp/build.gradle.kts"), pluginDefinition)), + .parseInputs(List.of(Parser.Input.fromString(Paths.get("/tmp/build.gradle.kts"), pluginDefinition)), Paths.get("/tmp"), context) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Could not parse as Gradle Kotlin"));