Skip to content

Commit 95aa6bd

Browse files
committed
Parse freestanding gradle scripts with the gradle parser.
1 parent 545cace commit 95aa6bd

File tree

2 files changed

+43
-25
lines changed

2 files changed

+43
-25
lines changed

plugin/src/main/java/org/openrewrite/gradle/isolated/DefaultProjectParser.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@
4646
import org.openrewrite.gradle.GradleProjectParser;
4747
import org.openrewrite.gradle.RewriteExtension;
4848
import org.openrewrite.gradle.SanitizedMarkerPrinter;
49-
import org.openrewrite.gradle.marker.GradleProject;
50-
import org.openrewrite.gradle.marker.GradleProjectBuilder;
51-
import org.openrewrite.gradle.marker.GradleSettings;
52-
import org.openrewrite.gradle.marker.GradleSettingsBuilder;
49+
import org.openrewrite.gradle.marker.*;
5350
import org.openrewrite.groovy.GroovyParser;
5451
import org.openrewrite.internal.InMemoryLargeSourceSet;
5552
import org.openrewrite.internal.ListUtils;
@@ -65,6 +62,7 @@
6562
import org.openrewrite.kotlin.tree.K;
6663
import org.openrewrite.marker.*;
6764
import org.openrewrite.marker.ci.BuildEnvironment;
65+
import org.openrewrite.maven.tree.MavenRepository;
6866
import org.openrewrite.polyglot.*;
6967
import org.openrewrite.properties.PropertiesParser;
7068
import org.openrewrite.quark.Quark;
@@ -1379,6 +1377,8 @@ protected ResultsContainer listResults(ExecutionContext ctx) {
13791377
}
13801378
}
13811379

1380+
Set<MavenRepository> allBuildscriptRepositories = new LinkedHashSet<>();
1381+
Set<MavenRepository> allRepositories = new LinkedHashSet<>();
13821382
org.openrewrite.java.style.Autodetect.Detector javaDetector = org.openrewrite.java.style.Autodetect.detector();
13831383
org.openrewrite.kotlin.style.Autodetect.Detector kotlinDetector = org.openrewrite.kotlin.style.Autodetect.detector();
13841384
org.openrewrite.xml.style.Autodetect.Detector xmlDetector = org.openrewrite.xml.style.Autodetect.detector();
@@ -1389,14 +1389,24 @@ protected ResultsContainer listResults(ExecutionContext ctx) {
13891389
} else if (s instanceof J.CompilationUnit) {
13901390
javaDetector.sample(s);
13911391
}
1392+
s.getMarkers()
1393+
.findFirst(GradleProject.class)
1394+
.ifPresent(gp -> {
1395+
allBuildscriptRepositories.addAll(gp.getBuildscript().getMavenRepositories());
1396+
allRepositories.addAll(gp.getMavenRepositories());
1397+
});
13921398
})
13931399
.peek(xmlDetector::sample)
13941400
.collect(toList());
1395-
Map<Class<? extends Tree>, NamedStyles> stylesByType = new HashMap<>();
1401+
Map<Class<? extends SourceFile>, NamedStyles> stylesByType = new HashMap<>();
13961402
stylesByType.put(J.CompilationUnit.class, javaDetector.build());
13971403
stylesByType.put(K.CompilationUnit.class, kotlinDetector.build());
13981404
stylesByType.put(Xml.Document.class, xmlDetector.build());
1399-
sourceFiles = ListUtils.map(sourceFiles, applyAutodetectedStyle(stylesByType));
1405+
// Construct a synthetic marker to apply to freestanding Gradle scripts to aid recipes in resolving dependencies
1406+
GradleProject freestandingScriptMarker = new GradleProject(
1407+
randomId(), "", "", "", "", emptyList(), new ArrayList<>(allRepositories),
1408+
emptyList(), emptyMap(), new GradleBuildscript(randomId(), new ArrayList<>(allBuildscriptRepositories), emptyMap()));
1409+
sourceFiles = ListUtils.map(sourceFiles, applyAutodetected(stylesByType, freestandingScriptMarker));
14001410

14011411
logger.lifecycle("All sources parsed, running active recipes: {}", String.join(", ", getActiveRecipes()));
14021412
RecipeRun recipeRun = recipe.run(new InMemoryLargeSourceSet(sourceFiles), ctx);
@@ -1417,13 +1427,22 @@ public void shutdownRewrite() {
14171427
GradleProjectBuilder.clearCaches();
14181428
}
14191429

1420-
private UnaryOperator<SourceFile> applyAutodetectedStyle(Map<Class<? extends Tree>, NamedStyles> stylesByType) {
1430+
private UnaryOperator<SourceFile> applyAutodetected(
1431+
Map<Class<? extends SourceFile>, NamedStyles> stylesByType,
1432+
GradleProject freestandingScriptMarker) {
14211433
return before -> {
1422-
for (Map.Entry<Class<? extends Tree>, NamedStyles> styleTypeEntry : stylesByType.entrySet()) {
1434+
for (Map.Entry<Class<? extends SourceFile>, NamedStyles> styleTypeEntry : stylesByType.entrySet()) {
14231435
if (styleTypeEntry.getKey().isAssignableFrom(before.getClass())) {
14241436
before = before.withMarkers(before.getMarkers().add(styleTypeEntry.getValue()));
14251437
}
14261438
}
1439+
// Add the synthetic GradleProject marker to any freestanding Gradle scripts
1440+
String path = before.getSourcePath().toString();
1441+
if ((path.endsWith(".gradle") || path.endsWith(".gradle.kts"))
1442+
&& !before.getMarkers().findFirst(GradleProject.class).isPresent()
1443+
&& !before.getMarkers().findFirst(GradleSettings.class).isPresent()) {
1444+
before = before.withMarkers(before.getMarkers().add(freestandingScriptMarker));
1445+
}
14271446
return before;
14281447
};
14291448
}

plugin/src/test/kotlin/org/openrewrite/gradle/RewriteRunTest.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,14 +1469,14 @@ class RewriteRunTest : RewritePluginTest {
14691469
apply from: 'dependencies.gradle'
14701470
""")
14711471
otherGradleScript("dependencies.gradle", """
1472-
repositories {
1472+
repositories {
14731473
mavenLocal()
14741474
mavenCentral()
14751475
maven {
14761476
url = uri("https://oss.sonatype.org/content/repositories/snapshots")
14771477
}
14781478
}
1479-
dependencies {
1479+
dependencies {
14801480
implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2")
14811481
}
14821482
""")
@@ -1486,20 +1486,19 @@ class RewriteRunTest : RewritePluginTest {
14861486
val rewriteRunResult = result.task(":${taskName()}")!!
14871487
assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS)
14881488

1489-
//TODO: Uncomment once corresponding recipe changes have been made
1490-
// assertThat(projectDir.resolve("dependencies.gradle").readText())
1491-
// //language=groovy
1492-
// .isEqualTo("""
1493-
// repositories {
1494-
// mavenLocal()
1495-
// mavenCentral()
1496-
// maven {
1497-
// url = uri("https://oss.sonatype.org/content/repositories/snapshots")
1498-
// }
1499-
// }
1500-
// dependencies {
1501-
// implementation("com.fasterxml.jackson.core:jackson-databind:2.17.2")
1502-
// }
1503-
// """.trimIndent())
1489+
assertThat(projectDir.resolve("dependencies.gradle").readText())
1490+
//language=groovy
1491+
.isEqualTo("""
1492+
repositories {
1493+
mavenLocal()
1494+
mavenCentral()
1495+
maven {
1496+
url = uri("https://oss.sonatype.org/content/repositories/snapshots")
1497+
}
1498+
}
1499+
dependencies {
1500+
implementation("com.fasterxml.jackson.core:jackson-databind:2.17.2")
1501+
}
1502+
""".trimIndent())
15041503
}
15051504
}

0 commit comments

Comments
 (0)