From 5de58b4bc74ad7d30d6f28dcd2a8c57320b4e006 Mon Sep 17 00:00:00 2001 From: Greg Oledzki Date: Mon, 13 Jul 2026 15:39:44 +0200 Subject: [PATCH 1/2] Add Go tests for selected 7 recipes --- build.gradle.kts | 43 ++++++++++++++++ .../AllBranchesIdenticalTest.java | 32 ++++++++++++ .../CollapsibleIfStatementsTest.java | 44 ++++++++++++++++ .../MergeIdenticalBranchesTest.java | 50 +++++++++++++++++++ .../RemoveDuplicateConditionsTest.java | 32 ++++++++++++ .../RemoveSelfAssignmentTest.java | 37 ++++++++++++++ ...RemoveUnconditionalValueOverwriteTest.java | 31 ++++++++++++ ...implifyRedundantLogicalExpressionTest.java | 24 +++++++++ 8 files changed, 293 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index ff11d7085..c4f222121 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,7 @@ @file:Suppress("UnstableApiUsage") +import java.io.File +import org.gradle.api.file.RelativePath + plugins { id("org.openrewrite.build.recipe-library") version "latest.release" id("org.openrewrite.build.moderne-source-available-license") version "latest.release" @@ -7,6 +10,10 @@ plugins { group = "org.openrewrite.recipe" description = "The first Static Analysis and REMEDIATION tool" +rewriteRecipe { + rewriteVersion.set("latest.release") +} + val provided = configurations.named("provided") val rewriteVersion = rewriteRecipe.rewriteVersion.get() dependencies { @@ -25,6 +32,7 @@ dependencies { provided("org.openrewrite:rewrite-kotlin:${rewriteVersion}") provided("org.openrewrite:rewrite-csharp:${rewriteVersion}") provided("org.openrewrite:rewrite-python:${rewriteVersion}") + provided("org.openrewrite:rewrite-go:${rewriteVersion}") annotationProcessor("org.openrewrite:rewrite-templating:${rewriteVersion}") implementation("org.openrewrite:rewrite-templating:${rewriteVersion}") @@ -47,8 +55,43 @@ dependencies { testRuntimeOnly("com.google.code.findbugs:jsr305:latest.release") } +val rewriteGoRpcClasspath = configurations.detachedConfiguration( + dependencies.create("org.openrewrite:rewrite-go:${rewriteVersion}") +) +val rewriteGoJar = rewriteGoRpcClasspath.elements.map { artifacts -> + artifacts.map { it.asFile }.single { it.name.startsWith("rewrite-go-") && it.extension == "jar" } +} +val rewriteGoSourceDir = layout.buildDirectory.dir("rewrite-go-src") +val rewriteGoRpcDir = layout.buildDirectory.dir("rewrite-go-rpc") +val rewriteGoRpcBinary = rewriteGoRpcDir.map { it.file("rewrite-go-rpc") } + +val installRewriteGoRpc by tasks.registering(Exec::class) { + inputs.file(rewriteGoJar) + outputs.file(rewriteGoRpcBinary) + + doFirst { + delete(rewriteGoSourceDir) + copy { + from(zipTree(rewriteGoJar.get())) { + include("META-INF/rewrite-go/src/**") + eachFile { + relativePath = RelativePath(true, *relativePath.segments.drop(3).toTypedArray()) + } + includeEmptyDirs = false + } + into(rewriteGoSourceDir) + } + rewriteGoRpcDir.get().asFile.mkdirs() + } + + workingDir(rewriteGoSourceDir) + commandLine("go", "build", "-o", rewriteGoRpcBinary.get().asFile.absolutePath, "./cmd/rpc") +} + tasks.withType { jvmArgs("-Xmx1g", "-Xms512m") + dependsOn(installRewriteGoRpc) + environment("PATH", rewriteGoRpcDir.get().asFile.absolutePath + File.pathSeparator + System.getenv("PATH")) } tasks.withType { diff --git a/src/test/java/org/openrewrite/staticanalysis/AllBranchesIdenticalTest.java b/src/test/java/org/openrewrite/staticanalysis/AllBranchesIdenticalTest.java index 44e689c49..4edc1cb0d 100644 --- a/src/test/java/org/openrewrite/staticanalysis/AllBranchesIdenticalTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/AllBranchesIdenticalTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -288,4 +289,35 @@ def test(a): ) ); } + + @Test + void collapseIdenticalBranchesGo() { + rewriteRun( + //language=go + go( + """ + package main + + func applyPromotion(eligible bool) { + if eligible { + applyDiscount() + } else { + applyDiscount() + } + } + + func applyDiscount() {} + """, + """ + package main + + func applyPromotion(eligible bool) { + applyDiscount() + } + + func applyDiscount() {} + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/CollapsibleIfStatementsTest.java b/src/test/java/org/openrewrite/staticanalysis/CollapsibleIfStatementsTest.java index 772b87329..eff787f7c 100644 --- a/src/test/java/org/openrewrite/staticanalysis/CollapsibleIfStatementsTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/CollapsibleIfStatementsTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -340,4 +341,47 @@ def test(a, b): ) ); } + + @Test + void mergeNestedIfsGo() { + rewriteRun( + //language=go + go( + """ + package main + + type User struct { + Active bool + EmailVerified bool + } + + func welcome(user User) { + if user.Active { + if user.EmailVerified { + sendWelcome(user) + } + } + } + + func sendWelcome(user User) {} + """, + """ + package main + + type User struct { + Active bool + EmailVerified bool + } + + func welcome(user User) { + if user.Active && user.EmailVerified { + sendWelcome(user) + } + } + + func sendWelcome(user User) {} + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/MergeIdenticalBranchesTest.java b/src/test/java/org/openrewrite/staticanalysis/MergeIdenticalBranchesTest.java index 94d99fac0..a879de99d 100644 --- a/src/test/java/org/openrewrite/staticanalysis/MergeIdenticalBranchesTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/MergeIdenticalBranchesTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -321,4 +322,53 @@ def test(a, b): ) ); } + + @Test + void mergeIdenticalBranchesGo() { + rewriteRun( + //language=go + go( + """ + package main + + type Order struct { + Expedited bool + GiftWrapped bool + } + + func route(order Order) { + if order.Expedited { + queueFastLane(order) + } else if order.GiftWrapped { + queueFastLane(order) + } else { + queueStandard(order) + } + } + + func queueFastLane(order Order) {} + func queueStandard(order Order) {} + """, + """ + package main + + type Order struct { + Expedited bool + GiftWrapped bool + } + + func route(order Order) { + if order.Expedited || order.GiftWrapped { + queueFastLane(order) + } else { + queueStandard(order) + } + } + + func queueFastLane(order Order) {} + func queueStandard(order Order) {} + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/RemoveDuplicateConditionsTest.java b/src/test/java/org/openrewrite/staticanalysis/RemoveDuplicateConditionsTest.java index 59e9f8483..a030a37d6 100644 --- a/src/test/java/org/openrewrite/staticanalysis/RemoveDuplicateConditionsTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/RemoveDuplicateConditionsTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -286,4 +287,35 @@ void removeDuplicateElseIfPython() { ) ); } + + @Test + void removeDuplicateElseIfGo() { + rewriteRun( + //language=go + go( + """ + package main + + func deliveryStatus(paid bool, shipped bool) string { + if paid { + return "ready" + } else if paid { + return "duplicate" + } + return "waiting" + } + """, + """ + package main + + func deliveryStatus(paid bool, shipped bool) string { + if paid { + return "ready" + } + return "waiting" + } + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/RemoveSelfAssignmentTest.java b/src/test/java/org/openrewrite/staticanalysis/RemoveSelfAssignmentTest.java index a4ef8c472..7985a8f6c 100644 --- a/src/test/java/org/openrewrite/staticanalysis/RemoveSelfAssignmentTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/RemoveSelfAssignmentTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -233,4 +234,40 @@ void removeSelfAssignmentPython() { ) ); } + + @Test + void removeSelfAssignmentGo() { + rewriteRun( + //language=go + go( + """ + package main + + type Profile struct { + Name string + } + + func normalize(profile *Profile) { + profile.Name = profile.Name + trimName(profile) + } + + func trimName(profile *Profile) {} + """, + """ + package main + + type Profile struct { + Name string + } + + func normalize(profile *Profile) { + trimName(profile) + } + + func trimName(profile *Profile) {} + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/RemoveUnconditionalValueOverwriteTest.java b/src/test/java/org/openrewrite/staticanalysis/RemoveUnconditionalValueOverwriteTest.java index 8b25c894c..55a7d9633 100644 --- a/src/test/java/org/openrewrite/staticanalysis/RemoveUnconditionalValueOverwriteTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/RemoveUnconditionalValueOverwriteTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -279,4 +280,34 @@ def test(): ) ); } + + @Test + void removeOverwrittenMapIndexGo() { + rewriteRun( + //language=go + go( + """ + package main + + func recordStatus(counts map[string]int) { + counts["pending"] = 1 + counts["pending"] = 2 + publish(counts) + } + + func publish(counts map[string]int) {} + """, + """ + package main + + func recordStatus(counts map[string]int) { + counts["pending"] = 2 + publish(counts) + } + + func publish(counts map[string]int) {} + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/staticanalysis/SimplifyRedundantLogicalExpressionTest.java b/src/test/java/org/openrewrite/staticanalysis/SimplifyRedundantLogicalExpressionTest.java index 121b75bb6..f92016dbe 100644 --- a/src/test/java/org/openrewrite/staticanalysis/SimplifyRedundantLogicalExpressionTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/SimplifyRedundantLogicalExpressionTest.java @@ -20,6 +20,7 @@ import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import static org.openrewrite.golang.Assertions.go; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.javascript.Assertions.typescript; @@ -334,4 +335,27 @@ void simplifyLogicalAndPython() { ) ); } + + @Test + void simplifyLogicalAndGo() { + rewriteRun( + //language=go + go( + """ + package main + + func shouldSend(enabled bool) bool { + return enabled && enabled + } + """, + """ + package main + + func shouldSend(enabled bool) bool { + return enabled + } + """ + ) + ); + } } From ff91d34b4282342fc3cb2cf37a38cbfbf968397a Mon Sep 17 00:00:00 2001 From: Greg Oledzki Date: Mon, 13 Jul 2026 16:16:23 +0200 Subject: [PATCH 2/2] Remove version pinning --- build.gradle.kts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c4f222121..c093e9193 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,10 +10,6 @@ plugins { group = "org.openrewrite.recipe" description = "The first Static Analysis and REMEDIATION tool" -rewriteRecipe { - rewriteVersion.set("latest.release") -} - val provided = configurations.named("provided") val rewriteVersion = rewriteRecipe.rewriteVersion.get() dependencies {