Skip to content

Commit 29aa3e5

Browse files
authored
Merge branch 'main' into fix/change-type-source-path
2 parents eec546e + 9416341 commit 29aa3e5

101 files changed

Lines changed: 3505 additions & 618 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle.kts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import java.util.Calendar
2+
13
plugins {
24
id("org.openrewrite.build.root") version "latest.release"
35
id("org.openrewrite.build.java-base") version "latest.release"
@@ -23,6 +25,29 @@ allprojects {
2325
description = "Eliminate tech-debt. Automatically."
2426
}
2527

28+
subprojects {
29+
tasks.withType<JavaExec>().configureEach {
30+
if (name == "generateAntlrSources") {
31+
doLast {
32+
val idx = args?.indexOf("-o") ?: return@doLast
33+
if (idx < 0 || idx + 1 >= args!!.size) return@doLast
34+
val rootPrefix = rootProject.projectDir.absolutePath + "/"
35+
val year = Calendar.getInstance().get(Calendar.YEAR)
36+
val licenseHeader = "/*\n" + rootProject.file("gradle/licenseHeader.txt")
37+
.readText().trim()
38+
.replace("\${year}", year.toString())
39+
.lines()
40+
.joinToString("\n") { " * $it".trimEnd() } + "\n */\n"
41+
project.file(args!![idx + 1]).walk().filter { it.extension == "java" }.forEach { file ->
42+
file.writeText(licenseHeader + file.readLines().joinToString("\n") { line ->
43+
line.trimEnd().replace("// Generated from $rootPrefix", "// Generated from ")
44+
} + "\n")
45+
}
46+
}
47+
}
48+
}
49+
}
50+
2651
// Use this task locally between different dependency check runs to have updated analysis:
2752
// OSSINDEX_PASSWORD=... OSSINDEX_USERNAME=... gradle cleanReports dCAg --no-parallel
2853
tasks.register<Delete>("cleanReports") {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME
77
zipStorePath=wrapper/dists
8-
distributionSha256Sum=0d585f69da091fc5b2beced877feab55a3064d43b8a1d46aeb07996b0915e0e0
8+
distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06

rewrite-core/src/main/java/org/openrewrite/Singleton.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,8 @@ public class Singleton extends Recipe {
8181
"The easiest way is to use Lombok's `@Value` annotation on your recipe class, which automatically " +
8282
"generates correct `equals()` and `hashCode()` implementations based on all fields.";
8383

84-
@Nullable Integer recipeIndex;
85-
8684
public boolean isSingleton(ExecutionContext ctx) {
87-
if (recipeIndex == null) {
88-
recipeIndex = ctx.getCycleDetails().getRecipePosition();
89-
}
85+
Integer recipeIndex = ctx.computeMessageIfAbsent(getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(this)), key -> ctx.getCycleDetails().getRecipePosition());
9086
return recipeIndex == ctx.getCycleDetails().getRecipePosition();
9187
}
9288

rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,16 @@ private void initializeDeclarativeRecipe(DeclarativeRecipe declarativeRecipe, St
161161
}
162162
}
163163

164-
@SuppressWarnings("NotNullFieldNotInitialized")
165164
@JsonIgnore
166-
private transient Accumulator accumulator;
165+
private transient ThreadLocal<Accumulator> accumulator = new ThreadLocal<>();
167166

168167
@Override
169168
public Accumulator getInitialValue(ExecutionContext ctx) {
170169
Accumulator acc = new Accumulator();
171170
for (Recipe precondition : preconditions) {
172171
registerNestedScanningRecipes(precondition, acc, ctx);
173172
}
174-
accumulator = acc;
173+
accumulator.set(acc);
175174
return acc;
176175
}
177176

@@ -509,7 +508,8 @@ private TreeVisitor<?, ExecutionContext> orVisitors(Recipe recipe) {
509508
//noinspection rawtypes
510509
ScanningRecipe scanning = (ScanningRecipe) recipe;
511510
//noinspection unchecked
512-
conditions.add(scanning.getVisitor(accumulator.recipeToAccumulator.get(scanning)));
511+
Accumulator acc = accumulator.get();
512+
conditions.add(scanning.getVisitor(acc != null ? acc.recipeToAccumulator.get(scanning) : null));
513513
} else {
514514
conditions.add(recipe.getVisitor());
515515
}
@@ -602,6 +602,18 @@ private static class LazyLoadedRecipe extends Recipe {
602602
String description = "Recipe that is loaded lazily.";
603603
}
604604

605+
@Override
606+
public void onComplete(ExecutionContext ctx) {
607+
accumulator.remove();
608+
}
609+
610+
@Override
611+
public DeclarativeRecipe clone() {
612+
DeclarativeRecipe cloned = (DeclarativeRecipe) super.clone();
613+
cloned.accumulator = new ThreadLocal<>();
614+
return cloned;
615+
}
616+
605617
@Override
606618
protected RecipeDescriptor createRecipeDescriptor() {
607619
List<RecipeDescriptor> preconditionDescriptors = new ArrayList<>();

rewrite-core/src/main/java/org/openrewrite/marketplace/RecipeListing.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import java.time.Duration;
2727
import java.util.*;
2828

29-
import static java.util.Collections.singleton;
30-
3129
@Getter
3230
@RequiredArgsConstructor
3331
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@@ -92,10 +90,9 @@ public int compareTo(RecipeListing o) {
9290

9391
public static RecipeListing fromDescriptor(RecipeDescriptor descriptor, RecipeBundle bundle) {
9492
int recipeCount = 1;
95-
RecipeDescriptor d = descriptor;
96-
for (Queue<RecipeDescriptor> queue = new LinkedList<>(singleton(descriptor)); !queue.isEmpty();
97-
d = queue.poll()) {
98-
recipeCount += d.getRecipeList().size();
93+
for (Queue<RecipeDescriptor> queue = new LinkedList<>(descriptor.getRecipeList()); !queue.isEmpty(); ) {
94+
RecipeDescriptor d = queue.poll();
95+
recipeCount++;
9996
queue.addAll(d.getRecipeList());
10097
}
10198

rewrite-gradle/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ java {
8989
tasks.withType<Test>().configureEach {
9090
dependsOn(pluginLocalTestClasspath)
9191
systemProperty("org.openrewrite.gradle.local.use-embedded-classpath", pluginLocalTestClasspath.files.find { it.name == "test-manifest.txt" }!!.path)
92+
maxHeapSize = "2g"
9293
}
9394

9495
// This seems to be the only way to get the groovy compiler to emit java-8 compatible bytecode

rewrite-gradle/src/main/groovy/Plugin.groovy

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
interface PluginSpec {
16+
import org.gradle.plugin.use.PluginDependenciesSpec
17+
import org.gradle.plugin.use.PluginDependencySpec
18+
19+
interface PluginSpec extends PluginDependenciesSpec {
1720
Plugin id(String i)
1821
}
1922

20-
interface Plugin {
23+
interface Plugin extends PluginDependencySpec {
2124
Plugin version(String v)
2225
Plugin apply(boolean a)
2326
}

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
import org.openrewrite.gradle.marker.GradleDependencyConfiguration;
2323
import org.openrewrite.gradle.marker.GradleProject;
2424
import org.openrewrite.gradle.trait.GradleMultiDependency;
25-
import org.openrewrite.groovy.GroovyIsoVisitor;
26-
import org.openrewrite.groovy.tree.G;
2725
import org.openrewrite.internal.ListUtils;
2826
import org.openrewrite.internal.StringUtils;
27+
import org.openrewrite.java.JavaIsoVisitor;
2928
import org.openrewrite.java.tree.J;
29+
import org.openrewrite.java.tree.JavaSourceFile;
3030
import org.openrewrite.semver.DependencyMatcher;
3131

3232
import java.util.HashMap;
@@ -76,26 +76,28 @@ public Validated<Object> validate() {
7676

7777
@Override
7878
public TreeVisitor<?, ExecutionContext> getVisitor() {
79-
return Preconditions.check(new IsBuildGradle<>(), new GroovyIsoVisitor<ExecutionContext>() {
79+
return Preconditions.check(new IsBuildGradle<>(), new JavaIsoVisitor<ExecutionContext>() {
8080
final DependencyMatcher depMatcher = requireNonNull(DependencyMatcher.build(groupId + ":" + artifactId).getValue());
8181

8282
@SuppressWarnings("NotNullFieldNotInitialized")
8383
GradleProject gradleProject;
8484

8585
@Override
86-
public G.CompilationUnit visitCompilationUnit(G.CompilationUnit cu, ExecutionContext ctx) {
87-
Optional<GradleProject> maybeGp = cu.getMarkers().findFirst(GradleProject.class);
88-
if (!maybeGp.isPresent()) {
89-
return cu;
90-
}
91-
92-
gradleProject = maybeGp.get();
93-
94-
G.CompilationUnit g = super.visitCompilationUnit(cu, ctx);
95-
if (g != cu) {
96-
g = g.withMarkers(g.getMarkers().setByType(updateGradleModel(gradleProject)));
86+
public @Nullable J visit(@Nullable Tree tree, ExecutionContext ctx) {
87+
if (tree instanceof JavaSourceFile) {
88+
JavaSourceFile sf = (JavaSourceFile) tree;
89+
Optional<GradleProject> maybeGp = sf.getMarkers().findFirst(GradleProject.class);
90+
if (maybeGp.isPresent()) {
91+
gradleProject = maybeGp.get();
92+
J result = super.visit(tree, ctx);
93+
if (result != tree && result instanceof JavaSourceFile) {
94+
JavaSourceFile updated = (JavaSourceFile) result;
95+
return updated.withMarkers(updated.getMarkers().setByType(updateGradleModel(gradleProject)));
96+
}
97+
}
98+
return sf;
9799
}
98-
return g;
100+
return super.visit(tree, ctx);
99101
}
100102

101103
@Override

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

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
import org.openrewrite.gradle.marker.GradleDependencyConfiguration;
2323
import org.openrewrite.gradle.marker.GradleProject;
2424
import org.openrewrite.gradle.trait.GradleMultiDependency;
25-
import org.openrewrite.groovy.GroovyIsoVisitor;
26-
import org.openrewrite.groovy.tree.G;
2725
import org.openrewrite.internal.ListUtils;
2826
import org.openrewrite.internal.StringUtils;
27+
import org.openrewrite.java.JavaIsoVisitor;
2928
import org.openrewrite.java.tree.J;
29+
import org.openrewrite.java.tree.JavaSourceFile;
3030
import org.openrewrite.semver.DependencyMatcher;
3131

3232
import java.util.HashMap;
@@ -76,26 +76,28 @@ public Validated<Object> validate() {
7676

7777
@Override
7878
public TreeVisitor<?, ExecutionContext> getVisitor() {
79-
return Preconditions.check(new IsBuildGradle<>(), new GroovyIsoVisitor<ExecutionContext>() {
79+
return Preconditions.check(new IsBuildGradle<>(), new JavaIsoVisitor<ExecutionContext>() {
8080
final DependencyMatcher depMatcher = requireNonNull(DependencyMatcher.build(groupId + ":" + artifactId).getValue());
8181

8282
@SuppressWarnings("NotNullFieldNotInitialized")
8383
GradleProject gradleProject;
8484

8585
@Override
86-
public G.CompilationUnit visitCompilationUnit(G.CompilationUnit cu, ExecutionContext ctx) {
87-
Optional<GradleProject> maybeGp = cu.getMarkers().findFirst(GradleProject.class);
88-
if (!maybeGp.isPresent()) {
89-
return cu;
90-
}
91-
92-
gradleProject = maybeGp.get();
93-
94-
G.CompilationUnit g = super.visitCompilationUnit(cu, ctx);
95-
if (g != cu) {
96-
g = g.withMarkers(g.getMarkers().setByType(updateGradleModel(gradleProject)));
86+
public @Nullable J visit(@Nullable Tree tree, ExecutionContext ctx) {
87+
if (tree instanceof JavaSourceFile) {
88+
JavaSourceFile sf = (JavaSourceFile) tree;
89+
Optional<GradleProject> maybeGp = sf.getMarkers().findFirst(GradleProject.class);
90+
if (maybeGp.isPresent()) {
91+
gradleProject = maybeGp.get();
92+
J result = super.visit(tree, ctx);
93+
if (result != tree && result instanceof JavaSourceFile) {
94+
JavaSourceFile updated = (JavaSourceFile) result;
95+
return updated.withMarkers(updated.getMarkers().setByType(updateGradleModel(gradleProject)));
96+
}
97+
}
98+
return sf;
9799
}
98-
return g;
100+
return super.visit(tree, ctx);
99101
}
100102

101103
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
@EqualsAndHashCode(callSuper = false)
4646
public class DependencyConstraintToRule extends Recipe {
4747

48-
private static final MethodMatcher DEPENDENCIES_DSL_MATCHER = new MethodMatcher("RewriteGradleProject dependencies(..)");
48+
private static final MethodMatcher DEPENDENCIES_DSL_MATCHER = new MethodMatcher("org.gradle.api.Project dependencies(..)", true);
4949
private static final String CONSTRAINT_MATCHER = "org.gradle.api.artifacts.dsl.DependencyHandler *(..)";
5050

5151
String displayName = "Dependency constraint to resolution rule";

0 commit comments

Comments
 (0)