Skip to content

Commit 30aacb8

Browse files
author
Vincent Potucek
committed
[Experimental] Add rewrite support for RemoveUnusedPrivateMethods & RemoveUnusedImports
1 parent ff973d3 commit 30aacb8

File tree

154 files changed

+389
-733
lines changed

Some content is hidden

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

154 files changed

+389
-733
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ jobs:
3131
uses: gradle/actions/setup-gradle@v4
3232
- name: spotlessCheck
3333
run: ./gradlew spotlessCheck
34+
- name: rewriteDryRun
35+
run: ./gradlew rewriteDryRun
3436
- name: assemble testClasses
3537
run: ./gradlew assemble testClasses
3638
build:
@@ -66,10 +68,10 @@ jobs:
6668
uses: gradle/actions/setup-gradle@v4
6769
- name: build (maven-only)
6870
if: matrix.kind == 'maven'
69-
run: ./gradlew :plugin-maven:build -x spotlessCheck
71+
run: ./gradlew :plugin-maven:build -x spotlessCheck -x rewriteDryRun
7072
- name: build (everything-but-maven)
7173
if: matrix.kind == 'gradle'
72-
run: ./gradlew build -x spotlessCheck -PSPOTLESS_EXCLUDE_MAVEN=true
74+
run: ./gradlew build -x spotlessCheck -x rewriteDryRun -PSPOTLESS_EXCLUDE_MAVEN=true
7375
- name: test npm
7476
if: matrix.kind == 'npm'
7577
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: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
apply plugin: 'org.openrewrite.rewrite'
2+
3+
rewrite {
4+
activeRecipe(
5+
"org.openrewrite.gradle.GradleBestPractices",
6+
"org.openrewrite.java.OrderImports",
7+
"org.openrewrite.java.RemoveUnusedImports",
8+
"org.openrewrite.java.format.RemoveTrailingWhitespace",
9+
"org.openrewrite.java.recipes.JavaRecipeBestPractices",
10+
"org.openrewrite.java.recipes.RecipeTestingBestPractices",
11+
"org.openrewrite.staticanalysis.EmptyBlock",
12+
"org.openrewrite.staticanalysis.EqualsAvoidsNull",
13+
"org.openrewrite.staticanalysis.JavaApiBestPractices",
14+
"org.openrewrite.staticanalysis.MissingOverrideAnnotation",
15+
"org.openrewrite.staticanalysis.ModifierOrder",
16+
"org.openrewrite.staticanalysis.NoFinalizer",
17+
"org.openrewrite.staticanalysis.RemoveCallsToSystemGc",
18+
"org.openrewrite.staticanalysis.RemoveUnneededAssertion",
19+
"org.openrewrite.staticanalysis.RemoveUnusedLocalVariables",
20+
"org.openrewrite.staticanalysis.RemoveUnusedPrivateFields",
21+
"org.openrewrite.staticanalysis.RemoveUnusedPrivateMethods",
22+
"org.openrewrite.staticanalysis.StringLiteralEquality",
23+
"org.openrewrite.staticanalysis.UnnecessaryParentheses",
24+
"org.openrewrite.text.EndOfLineAtEndOfFile",
25+
"tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes"
26+
// bugs
27+
//"org.openrewrite.java.recipes.RecipeNullabilityBestPractices",
28+
//"org.openrewrite.staticanalysis.CodeCleanup",
29+
//"org.openrewrite.staticanalysis.UnnecessaryThrows",
30+
)
31+
// bugs
32+
exclusions.add("**package-info.java")
33+
exclusions.add("**AJacksonFormatterFunc.java")
34+
exclusions.add("**gradle/java-publish.gradle")
35+
failOnDryRunResults = true
36+
}
37+
38+
// off switch for release: ' -x check' or ' -x rewriteDryRun'
39+
//tasks {
40+
// check.dependsOn(rewriteDryRun)
41+
//}
42+
43+
// > Task :rewriteDryRun FAILED
44+
//
45+
//2 problems were found storing the configuration cache.
46+
//- 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.
47+
// See https://docs.gradle.org/8.14.3/userguide/configuration_cache.html#config_cache:requirements:disallowed_types
48+
//- Task `:rewriteDryRun` of type `org.openrewrite.gradle.RewriteDryRunTask`: invocation of 'Task.project' at execution time is unsupported.
49+
// See https://docs.gradle.org/8.14.3/userguide/configuration_cache.html#config_cache:requirements:use_project_during_execution
50+
51+
// FAILURE: Build failed with an exception.
52+
//
53+
//* What went wrong:
54+
//Execution failed for task ':rewriteDryRun'.
55+
//> 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-extra/src/groovy/java/com/diffplug/spotless/extra/glue/groovy/GrEclipseFormatterStepImpl.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
import java.io.ByteArrayOutputStream;
2020
import java.io.IOException;
2121
import java.nio.file.Files;
22-
import java.util.ArrayList;
23-
import java.util.Collections;
24-
import java.util.List;
25-
import java.util.Map;
26-
import java.util.Properties;
22+
import java.util.*;
2723

24+
import dev.equo.solstice.NestedJars;
25+
import dev.equo.solstice.ShimIdeBootstrapServices;
26+
import dev.equo.solstice.Solstice;
27+
import dev.equo.solstice.p2.CacheLocations;
2828
import org.codehaus.groovy.eclipse.GroovyLogManager;
2929
import org.codehaus.groovy.eclipse.IGroovyLogger;
3030
import org.codehaus.groovy.eclipse.TraceCategory;
@@ -43,11 +43,6 @@
4343
import org.eclipse.text.edits.TextEdit;
4444
import org.osgi.framework.Constants;
4545

46-
import dev.equo.solstice.NestedJars;
47-
import dev.equo.solstice.ShimIdeBootstrapServices;
48-
import dev.equo.solstice.Solstice;
49-
import dev.equo.solstice.p2.CacheLocations;
50-
5146
/** Spotless-Formatter step which calls out to the Groovy-Eclipse formatter. */
5247
public class GrEclipseFormatterStepImpl {
5348
static {

lib-extra/src/jdt/java/com/diffplug/spotless/extra/glue/jdt/DefaultJavaElementComparator.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,7 @@
2020
import java.util.StringTokenizer;
2121

2222
import org.eclipse.jdt.core.Flags;
23-
import org.eclipse.jdt.core.dom.ASTNode;
24-
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
25-
import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
26-
import org.eclipse.jdt.core.dom.BodyDeclaration;
27-
import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
28-
import org.eclipse.jdt.core.dom.FieldDeclaration;
29-
import org.eclipse.jdt.core.dom.MethodDeclaration;
30-
import org.eclipse.jdt.core.dom.Modifier;
31-
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
32-
import org.eclipse.jdt.core.dom.Type;
33-
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
23+
import org.eclipse.jdt.core.dom.*;
3424
import org.eclipse.jdt.core.util.CompilationUnitSorter;
3525
import org.eclipse.jdt.internal.core.dom.NaiveASTFlattener;
3626

@@ -368,8 +358,8 @@ private boolean isSortPreserved(BodyDeclaration bodyDeclaration) {
368358
}
369359

370360
private int preserveRelativeOrder(BodyDeclaration bodyDeclaration1, BodyDeclaration bodyDeclaration2) {
371-
int value1 = ((Integer) bodyDeclaration1.getProperty(CompilationUnitSorter.RELATIVE_ORDER));
372-
int value2 = ((Integer) bodyDeclaration2.getProperty(CompilationUnitSorter.RELATIVE_ORDER));
361+
int value1 = (Integer) bodyDeclaration1.getProperty(CompilationUnitSorter.RELATIVE_ORDER);
362+
int value2 = (Integer) bodyDeclaration2.getProperty(CompilationUnitSorter.RELATIVE_ORDER);
373363
return value1 - value2;
374364
}
375365

lib-extra/src/jdt/java/com/diffplug/spotless/extra/glue/jdt/EclipseJdtSortMembers.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@
2424
import org.eclipse.core.resources.IResource;
2525
import org.eclipse.core.runtime.CoreException;
2626
import org.eclipse.core.runtime.IProgressMonitor;
27-
import org.eclipse.jdt.core.IBuffer;
28-
import org.eclipse.jdt.core.IBufferChangedListener;
29-
import org.eclipse.jdt.core.ICompilationUnit;
30-
import org.eclipse.jdt.core.IJavaElement;
31-
import org.eclipse.jdt.core.IOpenable;
32-
import org.eclipse.jdt.core.JavaModelException;
27+
import org.eclipse.jdt.core.*;
3328
import org.eclipse.jdt.core.dom.AST;
3429
import org.eclipse.jdt.internal.core.SortElementsOperation;
3530

lib-extra/src/jdt/java/com/diffplug/spotless/extra/glue/jdt/JdtFlags.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,7 @@
1616
package com.diffplug.spotless.extra.glue.jdt;
1717

1818
import org.eclipse.core.runtime.Assert;
19-
import org.eclipse.jdt.core.dom.ASTNode;
20-
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
21-
import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration;
22-
import org.eclipse.jdt.core.dom.BodyDeclaration;
23-
import org.eclipse.jdt.core.dom.EnumConstantDeclaration;
24-
import org.eclipse.jdt.core.dom.EnumDeclaration;
25-
import org.eclipse.jdt.core.dom.Modifier;
26-
import org.eclipse.jdt.core.dom.TypeDeclaration;
19+
import org.eclipse.jdt.core.dom.*;
2720

2821
/**
2922
* This class is derived and adapted code from the Eclipse JDT project (Derivative Works according to EPL 2.0 license).
@@ -48,7 +41,7 @@ && isInterfaceOrAnnotationMember(bodyDeclaration))
4841
}
4942

5043
private static boolean isPackageVisible(BodyDeclaration bodyDeclaration) {
51-
return (!isPrivate(bodyDeclaration) && !isProtected(bodyDeclaration) && !isPublic(bodyDeclaration));
44+
return !isPrivate(bodyDeclaration) && !isProtected(bodyDeclaration) && !isPublic(bodyDeclaration);
5245
}
5346

5447
private static boolean isPrivate(BodyDeclaration bodyDeclaration) {

lib-extra/src/main/java/com/diffplug/spotless/extra/EclipseBasedStepBuilder.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,15 @@
1515
*/
1616
package com.diffplug.spotless.extra;
1717

18-
import java.io.ByteArrayOutputStream;
19-
import java.io.File;
20-
import java.io.IOException;
21-
import java.io.InputStream;
22-
import java.io.Serializable;
18+
import java.io.*;
2319
import java.nio.charset.StandardCharsets;
2420
import java.util.ArrayList;
2521
import java.util.List;
2622
import java.util.Objects;
2723
import java.util.Properties;
2824

2925
import com.diffplug.common.base.Errors;
30-
import com.diffplug.spotless.FileSignature;
31-
import com.diffplug.spotless.FormatterFunc;
32-
import com.diffplug.spotless.FormatterProperties;
33-
import com.diffplug.spotless.FormatterStep;
34-
import com.diffplug.spotless.JarState;
35-
import com.diffplug.spotless.Provisioner;
36-
import com.diffplug.spotless.SerializedFunction;
26+
import com.diffplug.spotless.*;
3727

3828
/**
3929
* Generic Eclipse based formatter step {@link State} builder.

0 commit comments

Comments
 (0)