diff --git a/rewrite-gradle/src/main/groovy/RewriteGradleProject.groovy b/rewrite-gradle/src/main/groovy/RewriteGradleProject.groovy index 7abff2f4862..e30d5835348 100644 --- a/rewrite-gradle/src/main/groovy/RewriteGradleProject.groovy +++ b/rewrite-gradle/src/main/groovy/RewriteGradleProject.groovy @@ -20,6 +20,7 @@ import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.ExternalDependency import org.gradle.api.artifacts.ModuleDependency import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.file.FileCollection @@ -37,57 +38,57 @@ import org.gradle.process.ProcessForkOptions interface DependencyHandlerSpec extends DependencyHandler { Dependency annotationProcessor(String dependencyNotation) - Dependency annotationProcessor(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency annotationProcessor(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency annotationProcessor(Map dependencyNotation) - Dependency annotationProcessor(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency annotationProcessor(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency api(String dependencyNotation) - Dependency api(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency api(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency api(Map dependencyNotation) - Dependency api(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency api(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency classpath(String dependencyNotation) - Dependency classpath(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency classpath(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency classpath(Map dependencyNotation) - Dependency classpath(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency classpath(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency compile(String dependencyNotation) - Dependency compile(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency compile(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency compile(Map dependencyNotation) - Dependency compile(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency compile(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency compileOnly(String dependencyNotation) - Dependency compileOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency compileOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency compileOnly(Map dependencyNotation) - Dependency compileOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency compileOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency implementation(String dependencyNotation) - Dependency implementation(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency implementation(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency implementation(Map dependencyNotation) - Dependency implementation(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency implementation(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtime(String dependencyNotation) - Dependency runtime(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtime(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtime(Map dependencyNotation) - Dependency runtime(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtime(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtimeOnly(String dependencyNotation) - Dependency runtimeOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtimeOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtimeOnly(Map dependencyNotation) - Dependency runtimeOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtimeOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtimeClasspath(String dependencyNotation) - Dependency runtimeClasspath(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtimeClasspath(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency runtimeClasspath(Map dependencyNotation) - Dependency runtimeClasspath(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency runtimeClasspath(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testCompile(String dependencyNotation) - Dependency testCompile(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testCompile(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testCompile(Map dependencyNotation) - Dependency testCompile(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testCompile(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testImplementation(String dependencyNotation) - Dependency testImplementation(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testImplementation(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testImplementation(Map dependencyNotation) - Dependency testImplementation(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testImplementation(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testRuntime(String dependencyNotation) - Dependency testRuntime(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testRuntime(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testRuntime(Map dependencyNotation) - Dependency testRuntime(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testRuntime(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testRuntimeOnly(String dependencyNotation) - Dependency testRuntimeOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testRuntimeOnly(String dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) Dependency testRuntimeOnly(Map dependencyNotation) - Dependency testRuntimeOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ModuleDependency) Closure closure) + Dependency testRuntimeOnly(Map dependencyNotation, @DelegatesTo(strategy=Closure.DELEGATE_ONLY, value= ExternalDependency) Closure closure) } interface RewriteTestSpec { diff --git a/rewrite-gradle/src/main/java/org/openrewrite/gradle/UpgradeDependencyVersion.java b/rewrite-gradle/src/main/java/org/openrewrite/gradle/UpgradeDependencyVersion.java index 7ae1bb1de15..679f29237cd 100644 --- a/rewrite-gradle/src/main/java/org/openrewrite/gradle/UpgradeDependencyVersion.java +++ b/rewrite-gradle/src/main/java/org/openrewrite/gradle/UpgradeDependencyVersion.java @@ -206,7 +206,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) return e.warn(m); } } - } else if (depArgs.size() == 3 && depArgs.get(0) instanceof G.MapEntry + } else if (depArgs.size() >= 3 && depArgs.get(0) instanceof G.MapEntry && depArgs.get(1) instanceof G.MapEntry && depArgs.get(2) instanceof G.MapEntry) { Expression groupValue = ((G.MapEntry) depArgs.get(0)).getValue(); @@ -248,6 +248,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) versionLiteral .withValueSource(requireNonNull(versionLiteral.getValueSource()).replace(version, newVersion)) .withValue(newVersion))); + newArgs.addAll(depArgs.subList(3, depArgs.size())); return m.withArguments(newArgs); } else if(versionExp instanceof J.Identifier) { diff --git a/rewrite-gradle/src/test/java/org/openrewrite/gradle/UpgradeDependencyVersionTest.java b/rewrite-gradle/src/test/java/org/openrewrite/gradle/UpgradeDependencyVersionTest.java index c019e534251..904aa749417 100644 --- a/rewrite-gradle/src/test/java/org/openrewrite/gradle/UpgradeDependencyVersionTest.java +++ b/rewrite-gradle/src/test/java/org/openrewrite/gradle/UpgradeDependencyVersionTest.java @@ -49,7 +49,10 @@ void guava() { } dependencies { - implementation 'com.google.guava:guava:29.0-jre' + compileOnly 'com.google.guava:guava:29.0-jre' + runtimeOnly ('com.google.guava:guava:29.0-jre') { + force = true + } } """, """ @@ -62,30 +65,31 @@ void guava() { } dependencies { - implementation 'com.google.guava:guava:30.1.1-jre' + compileOnly 'com.google.guava:guava:30.1.1-jre' + runtimeOnly ('com.google.guava:guava:30.1.1-jre') { + force = true + } } """, - spec -> { - spec.afterRecipe(after -> { - Optional maybeGp = after.getMarkers().findFirst(GradleProject.class); - assertThat(maybeGp).isPresent(); - GradleProject gp = maybeGp.get(); - GradleDependencyConfiguration compileClasspath = gp.getConfiguration("compileClasspath"); - assertThat(compileClasspath).isNotNull(); - assertThat( - compileClasspath.getRequested().stream() - .filter(dep -> "com.google.guava".equals(dep.getGroupId()) && "guava".equals(dep.getArtifactId()) && "30.1.1-jre".equals(dep.getVersion())) - .findAny()) - .as("GradleProject requested dependencies should have been updated with the new version of guava") - .isPresent(); - assertThat( - compileClasspath.getResolved().stream() - .filter(dep -> "com.google.guava".equals(dep.getGroupId()) && "guava".equals(dep.getArtifactId()) && "30.1.1-jre".equals(dep.getVersion())) - .findAny()) - .as("GradleProject requested dependencies should have been updated with the new version of guava") - .isPresent(); - }); - } + spec -> spec.afterRecipe(after -> { + Optional maybeGp = after.getMarkers().findFirst(GradleProject.class); + assertThat(maybeGp).isPresent(); + GradleProject gp = maybeGp.get(); + GradleDependencyConfiguration compileClasspath = gp.getConfiguration("compileClasspath"); + assertThat(compileClasspath).isNotNull(); + assertThat( + compileClasspath.getRequested().stream() + .filter(dep -> "com.google.guava".equals(dep.getGroupId()) && "guava".equals(dep.getArtifactId()) && "30.1.1-jre".equals(dep.getVersion())) + .findAny()) + .as("GradleProject requested dependencies should have been updated with the new version of guava") + .isPresent(); + assertThat( + compileClasspath.getResolved().stream() + .filter(dep -> "com.google.guava".equals(dep.getGroupId()) && "guava".equals(dep.getArtifactId()) && "30.1.1-jre".equals(dep.getVersion())) + .findAny()) + .as("GradleProject requested dependencies should have been updated with the new version of guava") + .isPresent(); + }) ) ); } @@ -106,7 +110,9 @@ void updateVersionInVariable() { } dependencies { - implementation "com.google.guava:guava:$guavaVersion" + implementation ("com.google.guava:guava:$guavaVersion") { + force = true + } implementation "com.fasterxml.jackson.core:jackson-databind:$otherVersion" } """, @@ -122,7 +128,9 @@ void updateVersionInVariable() { } dependencies { - implementation "com.google.guava:guava:$guavaVersion" + implementation ("com.google.guava:guava:$guavaVersion") { + force = true + } implementation "com.fasterxml.jackson.core:jackson-databind:$otherVersion" } """ @@ -180,7 +188,9 @@ void mapNotationLiteral() { } dependencies { - implementation group: "com.google.guava", name: "guava", version: '29.0-jre' + implementation (group: "com.google.guava", name: "guava", version: '29.0-jre') { + force = true + } } """, """ @@ -193,7 +203,9 @@ void mapNotationLiteral() { } dependencies { - implementation group: "com.google.guava", name: "guava", version: '30.1.1-jre' + implementation (group: "com.google.guava", name: "guava", version: '30.1.1-jre') { + force = true + } } """ )