From d5cc199d753ffec747d286842fbd7315e964f99d Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Tue, 8 Jul 2025 09:24:45 +0200 Subject: [PATCH 1/2] feat: Add `RemoveUnusedDeclarations` --- .../java/RemoveUnusedDeclarationsStep.java | 28 ++++++++++++++ .../pjf/PalantirJavaFormatFormatterFunc.java | 37 +++++++++++++++++-- .../gradle/spotless/JavaExtension.java | 5 +++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java diff --git a/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java b/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java new file mode 100644 index 0000000000..bac36ba261 --- /dev/null +++ b/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java @@ -0,0 +1,28 @@ +/* + * Copyright 2016-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.spotless.java; + +import com.diffplug.spotless.FormatterStep; +import com.diffplug.spotless.glue.pjf.PalantirJavaFormatFormatterFunc; + +/** Uses google-java-format or cleanthat.UnnecessaryImport, but only to remove unused imports. */ +public interface RemoveUnusedDeclarationsStep { + String NAME = "removeUnusedImports"; + + static FormatterStep create() { + return new PalantirJavaFormatFormatterFunc("PALANTIR", true); + } +} diff --git a/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java index bdec215435..7c24d426f9 100644 --- a/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java +++ b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2024 DiffPlug + * Copyright 2022-2025 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,12 @@ */ package com.diffplug.spotless.glue.pjf; +import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.List; + +import javax.annotation.Nullable; import com.palantir.javaformat.java.Formatter; import com.palantir.javaformat.java.ImportOrderer; @@ -24,8 +28,10 @@ import com.palantir.javaformat.java.RemoveUnusedImports; import com.diffplug.spotless.FormatterFunc; +import com.diffplug.spotless.FormatterStep; +import com.diffplug.spotless.Lint; -public class PalantirJavaFormatFormatterFunc implements FormatterFunc { +public class PalantirJavaFormatFormatterFunc implements FormatterFunc, FormatterStep { private final Formatter formatter; @@ -52,7 +58,17 @@ public String apply(String input) throws Exception { String source = input; source = ImportOrderer.reorderImports(source, formatterStyle); source = RemoveUnusedImports.removeUnusedImports(source); - return formatter.formatSource(source); + return formatter.formatSourceAndFixImportsAndDeclarations(source); + } + + @Override + public String apply(String unix, File file) throws Exception { + return FormatterFunc.super.apply(unix, file); + } + + @Override + public List lint(String content, File file) throws Exception { + return FormatterFunc.super.lint(content, file); } @Override @@ -70,4 +86,19 @@ private static void applyFormatJavadoc(JavaFormatterOptions.Builder builder) { throw new IllegalStateException("Cannot enable formatJavadoc option, make sure you are using Palantir with version 2.36.0 or later", e); } } + + @Override + public String getName() { + return toString(); + } + + @Nullable @Override + public String format(String rawUnix, File file) throws Exception { + return apply(rawUnix); + } + + @Override + public void close() throws Exception { + + } } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java index f0530fb968..b0a526627c 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/JavaExtension.java @@ -40,6 +40,7 @@ import com.diffplug.spotless.java.GoogleJavaFormatStep; import com.diffplug.spotless.java.ImportOrderStep; import com.diffplug.spotless.java.PalantirJavaFormatStep; +import com.diffplug.spotless.java.RemoveUnusedDeclarationsStep; import com.diffplug.spotless.java.RemoveUnusedImportsStep; import com.diffplug.spotless.java.RemoveWildcardImportsStep; @@ -156,6 +157,10 @@ public void removeWildcardImports() { addStep(RemoveWildcardImportsStep.create()); } + public void removeUnusedDeclarations() { + addStep(RemoveUnusedDeclarationsStep.create()); + } + /** Uses the google-java-format jar to format source code. */ public GoogleJavaFormatConfig googleJavaFormat() { return googleJavaFormat(GoogleJavaFormatStep.defaultVersion()); From a851e9f7cf49b26f4ac4e76df8461e55683eb36a Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Tue, 8 Jul 2025 09:33:18 +0200 Subject: [PATCH 2/2] PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc --- .../java/RemoveUnusedDeclarationsStep.java | 3 +- ...ourceAndFixImportsAndDeclarationsFunc.java | 101 ++++++++++++++++++ .../pjf/PalantirJavaFormatFormatterFunc.java | 37 +------ 3 files changed, 106 insertions(+), 35 deletions(-) create mode 100644 lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc.java diff --git a/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java b/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java index bac36ba261..facec6842f 100644 --- a/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java +++ b/lib/src/main/java/com/diffplug/spotless/java/RemoveUnusedDeclarationsStep.java @@ -16,6 +16,7 @@ package com.diffplug.spotless.java; import com.diffplug.spotless.FormatterStep; +import com.diffplug.spotless.glue.pjf.PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc; import com.diffplug.spotless.glue.pjf.PalantirJavaFormatFormatterFunc; /** Uses google-java-format or cleanthat.UnnecessaryImport, but only to remove unused imports. */ @@ -23,6 +24,6 @@ public interface RemoveUnusedDeclarationsStep { String NAME = "removeUnusedImports"; static FormatterStep create() { - return new PalantirJavaFormatFormatterFunc("PALANTIR", true); + return new PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc("PALANTIR", true); } } diff --git a/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc.java b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc.java new file mode 100644 index 0000000000..29ed3c1ee0 --- /dev/null +++ b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc.java @@ -0,0 +1,101 @@ +/* + * Copyright 2022-2025 DiffPlug + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.diffplug.spotless.glue.pjf; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; + +import javax.annotation.Nullable; + +import com.palantir.javaformat.java.Formatter; +import com.palantir.javaformat.java.ImportOrderer; +import com.palantir.javaformat.java.JavaFormatterOptions; +import com.palantir.javaformat.java.RemoveUnusedImports; + +import com.diffplug.spotless.FormatterFunc; +import com.diffplug.spotless.FormatterStep; +import com.diffplug.spotless.Lint; + +public class PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc implements FormatterFunc, FormatterStep { + + private final Formatter formatter; + + private final JavaFormatterOptions.Style formatterStyle; + + /** + * Creates a new formatter func that formats code via Palantir. + * @param style The style to use for formatting. + * @param formatJavadoc Whether to format Java docs. Requires at least Palantir 2.36.0 or later, otherwise the + * constructor will throw. + */ + public PalantirJavaFormatFormatterFormatSourceAndFixImportsAndDeclarationsFunc(String style, boolean formatJavadoc) { + this.formatterStyle = JavaFormatterOptions.Style.valueOf(style); + JavaFormatterOptions.Builder builder = JavaFormatterOptions.builder(); + builder.style(formatterStyle); + if (formatJavadoc) { + applyFormatJavadoc(builder); + } + formatter = Formatter.createFormatter(builder.build()); + } + + @Override + public String apply(String input) throws Exception { + return formatter.formatSourceAndFixImportsAndDeclarations(input); + } + + @Override + public String apply(String unix, File file) throws Exception { + return FormatterFunc.super.apply(unix, file); + } + + @Override + public List lint(String content, File file) throws Exception { + return FormatterFunc.super.lint(content, file); + } + + @Override + public String toString() { + return "PalantirJavaFormatFormatterFunc{formatter=" + formatter + '}'; + } + + private static void applyFormatJavadoc(JavaFormatterOptions.Builder builder) { + // The formatJavadoc option is available since Palantir 2.36.0 + // To support older versions for now, attempt to invoke the builder method via reflection. + try { + Method formatJavadoc = JavaFormatterOptions.Builder.class.getMethod("formatJavadoc", boolean.class); + formatJavadoc.invoke(builder, true); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new IllegalStateException("Cannot enable formatJavadoc option, make sure you are using Palantir with version 2.36.0 or later", e); + } + } + + @Override + public String getName() { + return toString(); + } + + @Nullable @Override + public String format(String rawUnix, File file) throws Exception { + return apply(rawUnix); + } + + @Override + public void close() throws Exception { + + } +} diff --git a/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java index 7c24d426f9..bdec215435 100644 --- a/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java +++ b/lib/src/palantirJavaFormat/java/com/diffplug/spotless/glue/pjf/PalantirJavaFormatFormatterFunc.java @@ -1,5 +1,5 @@ /* - * Copyright 2022-2025 DiffPlug + * Copyright 2022-2024 DiffPlug * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,12 +15,8 @@ */ package com.diffplug.spotless.glue.pjf; -import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.List; - -import javax.annotation.Nullable; import com.palantir.javaformat.java.Formatter; import com.palantir.javaformat.java.ImportOrderer; @@ -28,10 +24,8 @@ import com.palantir.javaformat.java.RemoveUnusedImports; import com.diffplug.spotless.FormatterFunc; -import com.diffplug.spotless.FormatterStep; -import com.diffplug.spotless.Lint; -public class PalantirJavaFormatFormatterFunc implements FormatterFunc, FormatterStep { +public class PalantirJavaFormatFormatterFunc implements FormatterFunc { private final Formatter formatter; @@ -58,17 +52,7 @@ public String apply(String input) throws Exception { String source = input; source = ImportOrderer.reorderImports(source, formatterStyle); source = RemoveUnusedImports.removeUnusedImports(source); - return formatter.formatSourceAndFixImportsAndDeclarations(source); - } - - @Override - public String apply(String unix, File file) throws Exception { - return FormatterFunc.super.apply(unix, file); - } - - @Override - public List lint(String content, File file) throws Exception { - return FormatterFunc.super.lint(content, file); + return formatter.formatSource(source); } @Override @@ -86,19 +70,4 @@ private static void applyFormatJavadoc(JavaFormatterOptions.Builder builder) { throw new IllegalStateException("Cannot enable formatJavadoc option, make sure you are using Palantir with version 2.36.0 or later", e); } } - - @Override - public String getName() { - return toString(); - } - - @Nullable @Override - public String format(String rawUnix, File file) throws Exception { - return apply(rawUnix); - } - - @Override - public void close() throws Exception { - - } }