Skip to content

Commit e5d7c93

Browse files
authored
UpdateGradleWrapper: handle TaskContainer-based Wrapper DSL patterns (#7035)
The WrapperDslVisitor only recognized `tasks.named('wrapper')` and `wrapper { ... }` patterns. Add support for `tasks.wrapper { ... }` and `tasks.withType(Wrapper) { ... }` / `tasks.withType<Wrapper> { ... }` so that gradleVersion and distributionType assignments inside these blocks are updated as well. Closes moderneinc/support-morganstanley#206
1 parent 486b65b commit e5d7c93

2 files changed

Lines changed: 192 additions & 0 deletions

File tree

rewrite-gradle/src/main/java/org/openrewrite/gradle/UpdateGradleWrapper.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,26 @@ private static boolean isWrapperTaskConfiguration(J.MethodInvocation m) {
475475
m.getArguments().size() == 1 && m.getArguments().get(0) instanceof J.Lambda) {
476476
return true;
477477
}
478+
// Pattern: tasks.wrapper { ... } (property-style access on TaskContainer)
479+
if ("wrapper".equals(m.getSimpleName()) && m.getSelect() instanceof J.Identifier &&
480+
"tasks".equals(((J.Identifier) m.getSelect()).getSimpleName())) {
481+
return true;
482+
}
483+
// Pattern: tasks.withType(Wrapper) { ... } or tasks.withType<Wrapper> { ... }
484+
if ("withType".equals(m.getSimpleName()) && m.getSelect() instanceof J.Identifier &&
485+
"tasks".equals(((J.Identifier) m.getSelect()).getSimpleName())) {
486+
List<Expression> args = m.getArguments();
487+
// Groovy: tasks.withType(Wrapper) { ... }
488+
if (!args.isEmpty() && args.get(0) instanceof J.Identifier &&
489+
"Wrapper".equals(((J.Identifier) args.get(0)).getSimpleName())) {
490+
return true;
491+
}
492+
// Kotlin: tasks.withType<Wrapper> { ... } (type param, single lambda arg)
493+
if (m.getTypeParameters() != null && !m.getTypeParameters().isEmpty()) {
494+
return m.getTypeParameters().stream()
495+
.anyMatch(tp -> tp instanceof J.Identifier && "Wrapper".equals(((J.Identifier) tp).getSimpleName()));
496+
}
497+
}
478498
return false;
479499
}
480500

rewrite-gradle/src/test/java/org/openrewrite/gradle/UpdateGradleWrapperTest.java

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,6 +1301,178 @@ void updateWrapperDistributionURLInKotlinDsl() {
13011301
);
13021302
}
13031303

1304+
@Test
1305+
void updateWrapperVersionViaTasksPropertyAccessInGroovyDSL() {
1306+
rewriteRun(
1307+
spec -> spec.recipe(new UpdateGradleWrapper("7.4.2", "bin", null, null, null))
1308+
.allSources(source -> source.markers(new BuildTool(Tree.randomId(), BuildTool.Type.Gradle, "7.4"))),
1309+
properties(
1310+
"""
1311+
distributionBase=GRADLE_USER_HOME
1312+
distributionPath=wrapper/dists
1313+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4-all.zip
1314+
zipStoreBase=GRADLE_USER_HOME
1315+
zipStorePath=wrapper/dists
1316+
""",
1317+
"""
1318+
distributionBase=GRADLE_USER_HOME
1319+
distributionPath=wrapper/dists
1320+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4.2-bin.zip
1321+
zipStoreBase=GRADLE_USER_HOME
1322+
zipStorePath=wrapper/dists
1323+
distributionSha256Sum=29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda
1324+
""",
1325+
spec -> spec.path("gradle/wrapper/gradle-wrapper.properties")
1326+
),
1327+
buildGradle(
1328+
"""
1329+
tasks.wrapper {
1330+
gradleVersion = '7.4'
1331+
distributionType = Wrapper.DistributionType.ALL
1332+
}
1333+
""",
1334+
"""
1335+
tasks.wrapper {
1336+
gradleVersion = '7.4.2'
1337+
distributionType = Wrapper.DistributionType.BIN
1338+
}
1339+
"""
1340+
),
1341+
gradlew,
1342+
gradlewBat,
1343+
gradleWrapperJarQuark
1344+
);
1345+
}
1346+
1347+
@Test
1348+
void updateWrapperVersionViaTasksPropertyAccessInKotlinDSL() {
1349+
rewriteRun(
1350+
spec -> spec.recipe(new UpdateGradleWrapper("7.4.2", "bin", null, null, null))
1351+
.allSources(source -> source.markers(new BuildTool(Tree.randomId(), BuildTool.Type.Gradle, "7.4"))),
1352+
properties(
1353+
"""
1354+
distributionBase=GRADLE_USER_HOME
1355+
distributionPath=wrapper/dists
1356+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4-all.zip
1357+
zipStoreBase=GRADLE_USER_HOME
1358+
zipStorePath=wrapper/dists
1359+
""",
1360+
"""
1361+
distributionBase=GRADLE_USER_HOME
1362+
distributionPath=wrapper/dists
1363+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4.2-bin.zip
1364+
zipStoreBase=GRADLE_USER_HOME
1365+
zipStorePath=wrapper/dists
1366+
distributionSha256Sum=29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda
1367+
""",
1368+
spec -> spec.path("gradle/wrapper/gradle-wrapper.properties")
1369+
),
1370+
buildGradleKts(
1371+
"""
1372+
tasks.wrapper {
1373+
gradleVersion = "7.4"
1374+
distributionType = Wrapper.DistributionType.ALL
1375+
}
1376+
""",
1377+
"""
1378+
tasks.wrapper {
1379+
gradleVersion = "7.4.2"
1380+
distributionType = Wrapper.DistributionType.BIN
1381+
}
1382+
"""
1383+
),
1384+
gradlew,
1385+
gradlewBat,
1386+
gradleWrapperJarQuark
1387+
);
1388+
}
1389+
1390+
@Test
1391+
void updateWrapperVersionViaTasksWithTypeInGroovyDSL() {
1392+
rewriteRun(
1393+
spec -> spec.recipe(new UpdateGradleWrapper("7.4.2", "bin", null, null, null))
1394+
.allSources(source -> source.markers(new BuildTool(Tree.randomId(), BuildTool.Type.Gradle, "7.4"))),
1395+
properties(
1396+
"""
1397+
distributionBase=GRADLE_USER_HOME
1398+
distributionPath=wrapper/dists
1399+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4-all.zip
1400+
zipStoreBase=GRADLE_USER_HOME
1401+
zipStorePath=wrapper/dists
1402+
""",
1403+
"""
1404+
distributionBase=GRADLE_USER_HOME
1405+
distributionPath=wrapper/dists
1406+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4.2-bin.zip
1407+
zipStoreBase=GRADLE_USER_HOME
1408+
zipStorePath=wrapper/dists
1409+
distributionSha256Sum=29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda
1410+
""",
1411+
spec -> spec.path("gradle/wrapper/gradle-wrapper.properties")
1412+
),
1413+
buildGradle(
1414+
"""
1415+
tasks.withType(Wrapper) {
1416+
gradleVersion = '7.4'
1417+
distributionType = Wrapper.DistributionType.ALL
1418+
}
1419+
""",
1420+
"""
1421+
tasks.withType(Wrapper) {
1422+
gradleVersion = '7.4.2'
1423+
distributionType = Wrapper.DistributionType.BIN
1424+
}
1425+
"""
1426+
),
1427+
gradlew,
1428+
gradlewBat,
1429+
gradleWrapperJarQuark
1430+
);
1431+
}
1432+
1433+
@Test
1434+
void updateWrapperVersionViaTasksWithTypeInKotlinDSL() {
1435+
rewriteRun(
1436+
spec -> spec.recipe(new UpdateGradleWrapper("7.4.2", "bin", null, null, null))
1437+
.allSources(source -> source.markers(new BuildTool(Tree.randomId(), BuildTool.Type.Gradle, "7.4"))),
1438+
properties(
1439+
"""
1440+
distributionBase=GRADLE_USER_HOME
1441+
distributionPath=wrapper/dists
1442+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4-all.zip
1443+
zipStoreBase=GRADLE_USER_HOME
1444+
zipStorePath=wrapper/dists
1445+
""",
1446+
"""
1447+
distributionBase=GRADLE_USER_HOME
1448+
distributionPath=wrapper/dists
1449+
distributionUrl=https\\://downloads.gradle.org/distributions/gradle-7.4.2-bin.zip
1450+
zipStoreBase=GRADLE_USER_HOME
1451+
zipStorePath=wrapper/dists
1452+
distributionSha256Sum=29e49b10984e585d8118b7d0bc452f944e386458df27371b49b4ac1dec4b7fda
1453+
""",
1454+
spec -> spec.path("gradle/wrapper/gradle-wrapper.properties")
1455+
),
1456+
buildGradleKts(
1457+
"""
1458+
tasks.withType<Wrapper> {
1459+
gradleVersion = "7.4"
1460+
distributionType = Wrapper.DistributionType.ALL
1461+
}
1462+
""",
1463+
"""
1464+
tasks.withType<Wrapper> {
1465+
gradleVersion = "7.4.2"
1466+
distributionType = Wrapper.DistributionType.BIN
1467+
}
1468+
"""
1469+
),
1470+
gradlew,
1471+
gradlewBat,
1472+
gradleWrapperJarQuark
1473+
);
1474+
}
1475+
13041476
private <S extends SourceFile> S result(RecipeRun run, Class<S> clazz, String endsWith) {
13051477
return run.getChangeset().getAllResults().stream()
13061478
.map(Result::getAfter)

0 commit comments

Comments
 (0)