Skip to content

Commit 7c22a78

Browse files
author
Vincent Potucek
committed
[Experimental] Add rewrite support for errorprone.refasterrules.StringRulesRecipes
1 parent ff973d3 commit 7c22a78

File tree

11 files changed

+121
-48
lines changed

11 files changed

+121
-48
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ jobs:
2929
java-version: 21
3030
- name: gradle caching
3131
uses: gradle/actions/setup-gradle@v4
32-
- name: spotlessCheck
33-
run: ./gradlew spotlessCheck
32+
- name: spotlessCheck & rewriteDryRun
33+
run: ./gradlew spotlessCheck rewriteDryRun
3434
- name: assemble testClasses
3535
run: ./gradlew assemble testClasses
3636
build:
@@ -66,10 +66,10 @@ jobs:
6666
uses: gradle/actions/setup-gradle@v4
6767
- name: build (maven-only)
6868
if: matrix.kind == 'maven'
69-
run: ./gradlew :plugin-maven:build -x spotlessCheck
69+
run: ./gradlew :plugin-maven:build -x spotlessCheck -x rewriteDryRun
7070
- name: build (everything-but-maven)
7171
if: matrix.kind == 'gradle'
72-
run: ./gradlew build -x spotlessCheck -PSPOTLESS_EXCLUDE_MAVEN=true
72+
run: ./gradlew build -x spotlessCheck -x rewriteDryRun -PSPOTLESS_EXCLUDE_MAVEN=true
7373
- name: test npm
7474
if: matrix.kind == 'npm'
7575
run: ./gradlew testNpm

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
1616
* Adds support for worktrees (fixes [#1765](https://github.com/diffplug/spotless/issues/1765))
1717
* Bump default `google-java-format` version to latest `1.24.0` -> `1.28.0`. ([#2345](https://github.com/diffplug/spotless/pull/2345))
1818
* Bump default `ktlint` version to latest `1.5.0` -> `1.7.1`. ([#2555](https://github.com/diffplug/spotless/pull/2555))
19+
* [Experimental] Add `rewrite` support for `RemoveUnusedPrivateMethods` & `RemoveUnusedImports` ([#2576](https://github.com/diffplug/spotless/pull/2576))
1920

2021
## [3.3.1] - 2025-07-21
2122
### Fixed

build.gradle

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
apply plugin: 'dev.equo.ide'
2+
3+
apply from: rootProject.file('gradle/changelog.gradle')
4+
apply from: rootProject.file('gradle/java-publish.gradle')
5+
apply from: rootProject.file('gradle/spotless-freshmark.gradle')
6+
7+
allprojects {
8+
apply from: rootProject.file('gradle/spotless.gradle')
9+
apply from: rootProject.file('gradle/rewrite.gradle')
10+
}
11+
212
equoIde {
313
branding().title('Spotless').icon(file('_images/spotless_logo.png'))
414
welcome().openUrl('https://github.com/diffplug/spotless/blob/main/CONTRIBUTING.md')
@@ -9,21 +19,10 @@ repositories {
919
mavenCentral()
1020
}
1121

12-
apply from: rootProject.file('gradle/java-publish.gradle')
13-
apply from: rootProject.file('gradle/changelog.gradle')
14-
allprojects {
15-
apply from: rootProject.file('gradle/spotless.gradle')
16-
}
17-
apply from: rootProject.file('gradle/spotless-freshmark.gradle')
18-
19-
spotless {
20-
groovyGradle {
21-
target '*.gradle', 'gradle/*.gradle'
22-
}
23-
format 'dotfiles', {
24-
target '.gitignore', '.gitattributes', '.editorconfig'
25-
leadingTabsToSpaces(2)
26-
trimTrailingWhitespace()
27-
endWithNewline()
28-
}
22+
dependencies {
23+
rewrite(
24+
"org.openrewrite.recipe:rewrite-rewrite:0.10.1",
25+
"org.openrewrite.recipe:rewrite-static-analysis:2.12.0",
26+
"org.openrewrite.recipe:rewrite-third-party:0.24.1"
27+
)
2928
}

gradle/rewrite.gradle

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
apply plugin: 'org.openrewrite.rewrite'
2+
3+
rewrite {
4+
activeRecipe(
5+
"tech.picnic.errorprone.refasterrules.StringRulesRecipes",
6+
//"org.openrewrite.gradle.GradleBestPractices",
7+
//"org.openrewrite.java.OrderImports",
8+
//"org.openrewrite.java.RemoveUnusedImports",
9+
//"org.openrewrite.java.format.RemoveTrailingWhitespace",
10+
//"org.openrewrite.java.migrate.UpgradeToJava17",
11+
//"org.openrewrite.java.migrate.util.MigrateCollectionsSingletonList",
12+
//"org.openrewrite.java.migrate.util.MigrateCollectionsUnmodifiableList",
13+
//"org.openrewrite.java.recipes.JavaRecipeBestPractices",
14+
//"org.openrewrite.java.recipes.RecipeNullabilityBestPractices",
15+
//"org.openrewrite.java.recipes.RecipeTestingBestPractices",
16+
//"org.openrewrite.staticanalysis.CodeCleanup",
17+
//"org.openrewrite.staticanalysis.EmptyBlock",
18+
//"org.openrewrite.staticanalysis.EqualsAvoidsNull",
19+
//"org.openrewrite.staticanalysis.JavaApiBestPractices",
20+
//"org.openrewrite.staticanalysis.MissingOverrideAnnotation",
21+
//"org.openrewrite.staticanalysis.ModifierOrder",
22+
//"org.openrewrite.staticanalysis.NoFinalizer",
23+
//"org.openrewrite.staticanalysis.RemoveCallsToSystemGc",
24+
//"org.openrewrite.staticanalysis.RemoveUnneededAssertion",
25+
//"org.openrewrite.staticanalysis.RemoveUnusedLocalVariables",
26+
//"org.openrewrite.staticanalysis.RemoveUnusedPrivateFields",
27+
//"org.openrewrite.staticanalysis.RemoveUnusedPrivateMethods",
28+
//"org.openrewrite.staticanalysis.StringLiteralEquality",
29+
//"org.openrewrite.staticanalysis.UnnecessaryParentheses",
30+
//"org.openrewrite.staticanalysis.UnnecessaryThrows",
31+
//"org.openrewrite.text.EndOfLineAtEndOfFile",
32+
//"tech.picnic.errorprone.refasterrules.CollectionRulesRecipes",
33+
//"tech.picnic.errorprone.refasterrules.FileRulesRecipes",
34+
//"tech.picnic.errorprone.refasterrules.NullRulesRecipes",
35+
//"tech.picnic.errorprone.refasterrules.StreamRulesRecipes",
36+
)
37+
// bugs
38+
exclusions.add("**package-info.java")
39+
exclusions.add("**AJacksonFormatterFunc.java")
40+
exclusions.add("**gradle/java-publish.gradle")
41+
failOnDryRunResults = true
42+
}
43+
44+
// off switch for release: ' -x check' or ' -x rewriteDryRun'
45+
//tasks {
46+
// check.dependsOn(rewriteDryRun)
47+
//}
48+
49+
// > Task :rewriteDryRun FAILED
50+
//
51+
//2 problems were found storing the configuration cache.
52+
//- Task `:rewriteDryRun` of type `org.openrewrite.gradle.RewriteDryRunTask`: cannot serialize object of type 'org.gradle.api.internal.project.DefaultProject', a subtype of 'org.gradle.api.Project', as these are not supported with the configuration cache.
53+
// See https://docs.gradle.org/8.14.3/userguide/configuration_cache.html#config_cache:requirements:disallowed_types
54+
//- Task `:rewriteDryRun` of type `org.openrewrite.gradle.RewriteDryRunTask`: invocation of 'Task.project' at execution time is unsupported.
55+
// See https://docs.gradle.org/8.14.3/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution
56+
57+
// FAILURE: Build failed with an exception.
58+
//
59+
//* What went wrong:
60+
//Execution failed for task ':rewriteDryRun'.
61+
//> java.lang.RuntimeException: Applying recipes would make changes. See logs for more details.

gradle/spotless.gradle

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
11
apply plugin: 'com.diffplug.spotless'
2+
23
spotless {
4+
groovyGradle {
5+
target '*.gradle', 'gradle/*.gradle'
6+
greclipse().configFile rootProject.files('gradle/spotless.eclipseformat.xml', 'gradle/spotless.groovyformat.prefs')
7+
}
8+
format 'dotfiles', {
9+
target '.gitignore', '.gitattributes', '.editorconfig'
10+
leadingTabsToSpaces(2)
11+
trimTrailingWhitespace()
12+
endWithNewline()
13+
}
314
def noInternalDepsClosure = {
415
String text = it
516
/*
617
* No good way to get around using this import:
718
* https://github.com/gradle/gradle/issues/3191
819
*/
920
String regex = "import org\\.gradle\\.api\\.internal\\.(?!plugins\\.DslObject)(?!project\\.ProjectInternal)"
10-
if ((text.contains('import org.gradle.internal.') || text.find(regex)) &&
11-
!text.contains('def noInternalDepsClosure')) {
21+
if ((text.contains('import org.gradle.internal.') || text.find(regex))
22+
&& !text.contains('def noInternalDepsClosure')) {
1223
throw new AssertionError("Accidental internal import")
1324
}
1425
}
15-
if (project != rootProject) {
16-
// the rootProject doesn't have any java
17-
java {
18-
ratchetFrom 'origin/main'
19-
bumpThisNumberIfACustomStepChanges(1)
20-
licenseHeaderFile rootProject.file('gradle/spotless.license')
21-
importOrderFile rootProject.file('gradle/spotless.importorder')
22-
eclipse().configFile rootProject.file('gradle/spotless.eclipseformat.xml')
23-
trimTrailingWhitespace()
24-
removeUnusedImports()
25-
formatAnnotations()
26-
custom 'noInternalDeps', noInternalDepsClosure
27-
}
28-
}
29-
groovyGradle {
30-
target '*.gradle'
31-
greclipse().configFile rootProject.files('gradle/spotless.eclipseformat.xml', 'gradle/spotless.groovyformat.prefs')
26+
java {
27+
target '*.gitignore'
28+
ratchetFrom 'origin/main'
29+
bumpThisNumberIfACustomStepChanges(1)
30+
licenseHeaderFile rootProject.file('gradle/spotless.license')
31+
importOrderFile rootProject.file('gradle/spotless.importorder')
32+
eclipse().configFile rootProject.file('gradle/spotless.eclipseformat.xml')
33+
trimTrailingWhitespace()
34+
removeUnusedImports()
35+
formatAnnotations()
36+
custom 'noInternalDeps', noInternalDepsClosure
3237
}
3338
}

lib/src/main/java/com/diffplug/spotless/JarState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private static JarState provisionWithTransitives(boolean withTransitives, Collec
128128
Objects.requireNonNull(provisioner, "provisioner");
129129
Set<File> jars = provisioner.provisionWithTransitives(withTransitives, mavenCoordinates);
130130
if (jars.isEmpty()) {
131-
throw new NoSuchElementException("Resolved to an empty result: " + mavenCoordinates.stream().collect(Collectors.joining(", ")));
131+
throw new NoSuchElementException("Resolved to an empty result: " + String.join(", ", mavenCoordinates));
132132
}
133133
FileSignature fileSignature = FileSignature.signAsSet(jars);
134134
return new JarState(fileSignature);

lib/src/main/java/com/diffplug/spotless/npm/PrettierFormatterStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ private String assertFilepathInConfigOptions(File file) {
137137
return prettierConfigOptions;
138138
}
139139
// if the file has no name, we cannot use it
140-
if (file.getName().trim().length() == 0) {
140+
if (file.getName().trim().isEmpty()) {
141141
return prettierConfigOptions;
142142
}
143143
// if it is not there, we add it at the beginning of the Options

plugin-gradle/src/test/java/com/diffplug/gradle/spotless/GradleIntegrationHarness.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.diffplug.gradle.spotless;
1717

18+
import static com.diffplug.common.base.Strings.isNullOrEmpty;
1819
import static org.junit.jupiter.api.Assertions.fail;
1920

2021
import java.io.File;
@@ -231,7 +232,7 @@ static String buildResultToString(BuildResult result) {
231232

232233
private static File getTestKitDir() {
233234
String gradleUserHome = System.getenv("GRADLE_USER_HOME");
234-
if (gradleUserHome == null || gradleUserHome.isEmpty()) {
235+
if (isNullOrEmpty(gradleUserHome)) {
235236
gradleUserHome = new File(System.getProperty("user.home"), ".gradle").getAbsolutePath();
236237
}
237238
return new File(gradleUserHome, "testkit");

plugin-maven/src/main/java/com/diffplug/spotless/maven/AbstractSpotlessMojo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.diffplug.spotless.maven;
1717

18+
import static com.diffplug.common.base.Strings.isNullOrEmpty;
1819
import static java.util.stream.Collectors.toList;
1920

2021
import java.io.File;
@@ -290,7 +291,7 @@ private List<File> collectFiles(FormatterFactory formatterFactory, FormatterConf
290291
} else {
291292
files = collectFilesFromFormatterFactory(formatterFactory);
292293
}
293-
if (filePatterns == null || filePatterns.isEmpty()) {
294+
if (isNullOrEmpty(filePatterns)) {
294295
return files;
295296
}
296297
final String[] includePatterns = this.filePatterns.split(",");

plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessApplyMojo.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import java.io.File;
1919
import java.io.IOException;
2020

21+
import com.diffplug.common.base.Strings;
22+
2123
import org.apache.maven.plugin.MojoExecutionException;
2224
import org.apache.maven.plugins.annotations.Mojo;
2325
import org.apache.maven.plugins.annotations.Parameter;
@@ -26,6 +28,8 @@
2628
import com.diffplug.spotless.Formatter;
2729
import com.diffplug.spotless.maven.incremental.UpToDateChecker;
2830

31+
import static com.diffplug.common.base.Strings.isNullOrEmpty;
32+
2933
/**
3034
* Performs formatting of all source files according to configured formatters.
3135
*/
@@ -86,6 +90,6 @@ protected void process(String name, Iterable<File> files, Formatter formatter, U
8690
}
8791

8892
private boolean isIdeHook() {
89-
return !(spotlessIdeHook == null || spotlessIdeHook.isEmpty());
93+
return !isNullOrEmpty(spotlessIdeHook);
9094
}
9195
}

0 commit comments

Comments
 (0)