From 63c5482ed2ac10b4437f710b93f21899f0c9fcac Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Fri, 21 Nov 2025 15:15:09 +0100 Subject: [PATCH] [rewrite] bump `UpgradeToJava21` Signed-off-by: Vincent Potucek --- .github/workflows/ci.yml | 8 +-- gradle.properties | 3 +- gradle/error-prone.gradle | 63 +++++++++---------- .../integration/DiffMessageFormatter.java | 2 +- .../com/diffplug/spotless/PaddedCell.java | 2 +- .../diffplug/spotless/biome/BiomeStep.java | 34 ++++------ .../spotless/java/ImportSorterImpl.java | 4 +- .../diffplug/spotless/npm/TimedLogger.java | 4 +- .../spotless/rdf/ReflectionHelper.java | 4 +- .../sql/dbeaver/SQLTokenizedFormatter.java | 12 ++-- .../gradle/spotless/SpotlessPlugin.java | 2 +- .../spotless/maven/SpotlessCheckMojo.java | 2 +- rewrite.yml | 2 +- .../com/diffplug/spotless/PaddedCellTest.java | 14 ++--- 14 files changed, 72 insertions(+), 84 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab763eb6a5..82199daf82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,19 +41,19 @@ jobs: matrix: kind: [maven, gradle] # Test on the latest Java version once Gradle & Maven support it. - jre: [17, 21, 24] + jre: [21, 24] os: [ubuntu-latest, windows-latest] include: # npm on linux only (crazy slow on windows) - kind: npm - jre: 17 + jre: 21 os: ubuntu-latest - kind: shfmt - jre: 17 + jre: 21 os: ubuntu-latest shfmt-version: v3.8.0 - kind: idea - jre: 17 + jre: 21 os: ubuntu-latest runs-on: ${{ matrix.os }} steps: diff --git a/gradle.properties b/gradle.properties index 8768d0d418..13f607d345 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,11 +21,12 @@ artifactIdMaven=spotless-maven-plugin artifactIdGradle=spotless-plugin-gradle # Build requirements +# bump 21 after: https://github.com/gradle/gradle/issues/35768 VER_JAVA=17 VER_JSR_305=3.0.2 # Dependencies provided by Spotless plugin -VER_SLF4J=[1.6,2.0[ +VER_SLF4J=[1.6,2.0] # Used in multiple places VER_DURIAN=1.2.0 diff --git a/gradle/error-prone.gradle b/gradle/error-prone.gradle index a3aff16cfa..2ca44b8d4f 100644 --- a/gradle/error-prone.gradle +++ b/gradle/error-prone.gradle @@ -2,49 +2,48 @@ apply plugin: 'net.ltgt.errorprone' dependencies { errorprone('com.google.errorprone:error_prone_core:2.42.0') - errorprone('tech.picnic.error-prone-support:error-prone-contrib:0.26.0') + // errorprone('tech.picnic.error-prone-support:error-prone-contrib:0.26.0') // bug: https://github.com/google/error-prone/issues/5365 } tasks.withType(JavaCompile).configureEach { options.errorprone { + disableAllWarnings = true // https://github.com/diffplug/spotless/issues/2745 disable( // consider fix, or reasoning. 'FunctionalInterfaceMethodChanged', 'JavaxInjectOnAbstractMethod', 'OverridesJavaxInjectableMethod', ) - error( - 'AmbiguousJsonCreator', - 'AssertJNullnessAssertion', - 'AutowiredConstructor', - 'CanonicalAnnotationSyntax', - 'CollectorMutability', - 'ConstantNaming', - 'DirectReturn', - 'EmptyMethod', - 'ExplicitArgumentEnumeration', - 'ExplicitEnumOrdering', - 'IdentityConversion', - 'ImmutablesSortedSetComparator', - 'IsInstanceLambdaUsage', - 'MockitoMockClassReference', - 'MockitoStubbing', - 'NestedOptionals', - 'PrimitiveComparison', - 'RedundantStringConversion', - 'RedundantStringEscape', - 'ReturnValueIgnored', - 'SelfAssignment', - 'StringJoin', - 'StringJoining', - 'UnnecessarilyFullyQualified', - 'UnnecessaryLambda', - ) + // error( + // 'AmbiguousJsonCreator', + // 'AssertJNullnessAssertion', + // 'AutowiredConstructor', + // 'CanonicalAnnotationSyntax', + // 'CollectorMutability', + // 'ConstantNaming', + // 'DirectReturn', + // 'EmptyMethod', + // 'ExplicitArgumentEnumeration', + // 'ExplicitEnumOrdering', + // 'IdentityConversion', + // 'ImmutablesSortedSetComparator', + // 'IsInstanceLambdaUsage', + // 'MockitoMockClassReference', + // 'MockitoStubbing', + // 'NestedOptionals', + // 'PrimitiveComparison', + // 'RedundantStringConversion', + // 'RedundantStringEscape', + // 'ReturnValueIgnored', + // 'SelfAssignment', + // 'StringJoin', + // 'StringJoining', + // 'UnnecessarilyFullyQualified', + // 'UnnecessaryLambda', + // ) // bug: this only happens when the file is dirty. // might be an up2date (caching) issue, as file is currently in corrupt state. // ForbidGradleInternal(import org.gradle.api.internal.project.ProjectInternal;) - errorproneArgs.add('-XepExcludedPaths:' + - '.*/SelfTest.java|' + - '.*/GradleIntegrationHarness.java' - ) + // excludedPaths.add('.*/SelfTest.java'); + // excludedPaths.add('.*/GradleIntegrationHarness.java'); } } diff --git a/lib-extra/src/main/java/com/diffplug/spotless/extra/integration/DiffMessageFormatter.java b/lib-extra/src/main/java/com/diffplug/spotless/extra/integration/DiffMessageFormatter.java index fb9d176eac..263f73a5bb 100644 --- a/lib-extra/src/main/java/com/diffplug/spotless/extra/integration/DiffMessageFormatter.java +++ b/lib-extra/src/main/java/com/diffplug/spotless/extra/integration/DiffMessageFormatter.java @@ -201,7 +201,7 @@ private void addFile(String arg) { // ... (more lines that didn't fit) List lines = NEWLINE_SPLITTER.splitToList(arg); if (!lines.isEmpty()) { - addIntendedLine(NORMAL_INDENT, lines.get(0)); + addIntendedLine(NORMAL_INDENT, lines.getFirst()); } for (int i = 1; i < Math.min(MIN_LINES_PER_FILE, lines.size()); i++) { addIntendedLine(DIFF_INDENT, lines.get(i)); diff --git a/lib/src/main/java/com/diffplug/spotless/PaddedCell.java b/lib/src/main/java/com/diffplug/spotless/PaddedCell.java index f6973a6daa..cb69bc4841 100644 --- a/lib/src/main/java/com/diffplug/spotless/PaddedCell.java +++ b/lib/src/main/java/com/diffplug/spotless/PaddedCell.java @@ -152,7 +152,7 @@ public boolean isResolvable() { public String canonical() { // @formatter:off switch (type) { - case CONVERGE: return steps.get(steps.size() - 1); + case CONVERGE: return steps.getLast(); case CYCLE: return Collections.min(steps, Comparator.comparingInt(String::length).thenComparing(Function.identity())); case DIVERGE: throw new IllegalArgumentException("No canonical form for a diverging result"); default: throw new IllegalArgumentException("Unknown type: " + type); diff --git a/lib/src/main/java/com/diffplug/spotless/biome/BiomeStep.java b/lib/src/main/java/com/diffplug/spotless/biome/BiomeStep.java index 848481e07e..73412827a3 100644 --- a/lib/src/main/java/com/diffplug/spotless/biome/BiomeStep.java +++ b/lib/src/main/java/com/diffplug/spotless/biome/BiomeStep.java @@ -456,32 +456,22 @@ private String resolveFileName(File file) { } var dot = name.lastIndexOf("."); var ext = dot >= 0 ? name.substring(dot + 1) : name; - switch (language) { - case "js?": - return "jsx".equals(ext) || "js".equals(ext) || "mjs".equals(ext) || "cjs".equals(ext) ? name + return switch (language) { + case "js?" -> "jsx".equals(ext) || "js".equals(ext) || "mjs".equals(ext) || "cjs".equals(ext) ? name : "file.js"; - case "ts?": - return "tsx".equals(ext) || "ts".equals(ext) || "mts".equals(ext) || "cts".equals(ext) ? name + case "ts?" -> "tsx".equals(ext) || "ts".equals(ext) || "mts".equals(ext) || "cts".equals(ext) ? name : "file.js"; - case "js": - return "js".equals(ext) || "mjs".equals(ext) || "cjs".equals(ext) ? name : "file.js"; - case "jsx": - return "jsx".equals(ext) ? name : "file.jsx"; - case "ts": - return "ts".equals(ext) || "mts".equals(ext) || "cts".equals(ext) ? name : "file.ts"; - case "tsx": - return "tsx".equals(ext) ? name : "file.tsx"; - case "json": - return "json".equals(ext) ? name : "file.json"; - case "jsonc": - return "jsonc".equals(ext) ? name : "file.jsonc"; - case "css": - return "css".equals(ext) ? name : "file.css"; + case "js" -> "js".equals(ext) || "mjs".equals(ext) || "cjs".equals(ext) ? name : "file.js"; + case "jsx" -> "jsx".equals(ext) ? name : "file.jsx"; + case "ts" -> "ts".equals(ext) || "mts".equals(ext) || "cts".equals(ext) ? name : "file.ts"; + case "tsx" -> "tsx".equals(ext) ? name : "file.tsx"; + case "json" -> "json".equals(ext) ? name : "file.json"; + case "jsonc" -> "jsonc".equals(ext) ? name : "file.jsonc"; + case "css" -> "css".equals(ext) ? name : "file.css"; // so that we can support new languages such as css or yaml when Biome adds // support for them without having to change the code - default: - return "file." + language; - } + default -> "file." + language; + }; } /** diff --git a/lib/src/main/java/com/diffplug/spotless/java/ImportSorterImpl.java b/lib/src/main/java/com/diffplug/spotless/java/ImportSorterImpl.java index e9e28c2576..dd80c9e59f 100644 --- a/lib/src/main/java/com/diffplug/spotless/java/ImportSorterImpl.java +++ b/lib/src/main/java/com/diffplug/spotless/java/ImportSorterImpl.java @@ -203,8 +203,8 @@ private List mergeMatchingItems() { } } // if there is \n on the end, remove it - if (!template.isEmpty() && ImportSorter.N.equals(template.get(template.size() - 1))) { - template.remove(template.size() - 1); + if (!template.isEmpty() && ImportSorter.N.equals(template.getLast())) { + template.removeLast(); } return template; } diff --git a/lib/src/main/java/com/diffplug/spotless/npm/TimedLogger.java b/lib/src/main/java/com/diffplug/spotless/npm/TimedLogger.java index eaf51320c4..d4e366471c 100644 --- a/lib/src/main/java/com/diffplug/spotless/npm/TimedLogger.java +++ b/lib/src/main/java/com/diffplug/spotless/npm/TimedLogger.java @@ -111,7 +111,7 @@ public final void close() { } private Object[] paramsForEnd() { - if (params.isEmpty() || !(params.get(params.size() - 1) instanceof Throwable)) { + if (params.isEmpty() || !(params.getLast() instanceof Throwable)) { // if the last element is not a throwable, we can add the duration as the last element return Stream.concat(params.stream(), Stream.of(lazy(this::durationString))).toArray(); } @@ -119,7 +119,7 @@ private Object[] paramsForEnd() { return Stream.concat( params.stream().limit(params.size() - 1), Stream.of(lazy(this::durationString), - params.get(params.size() - 1))) + params.getLast())) .toArray(); } diff --git a/lib/src/main/java/com/diffplug/spotless/rdf/ReflectionHelper.java b/lib/src/main/java/com/diffplug/spotless/rdf/ReflectionHelper.java index 061062434f..61db1306b7 100644 --- a/lib/src/main/java/com/diffplug/spotless/rdf/ReflectionHelper.java +++ b/lib/src/main/java/com/diffplug/spotless/rdf/ReflectionHelper.java @@ -317,7 +317,7 @@ private void callBuilderMethod(Object builder, Method method, String parameterVa "Found more than 1 enum value for name %s, that should never happen".formatted( parameterValueAsString)); } - method.invoke(builder, selectedEnumValueList.get(0)); + method.invoke(builder, selectedEnumValueList.getFirst()); } else if (param.equals(NumberFormat.class)) { method.invoke(builder, new DecimalFormat(parameterValueAsString, DecimalFormatSymbols.getInstance(Locale.US))); } else if (param.equals(Boolean.class) || param.equals(Boolean.TYPE)) { @@ -455,7 +455,7 @@ private Method getBuilderMethod(String optionName) { "More than one builder method found for configuration parameter name: %s".formatted( optionName)); } - Method method = methods.get(0); + Method method = methods.getFirst(); if (method.getParameterCount() != 1) { throw new RuntimeException( "Method with unexpected parameter count %s found for configuration parameter name: %s".formatted( diff --git a/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java b/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java index 52665bf716..db60ce6c8d 100644 --- a/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java +++ b/lib/src/main/java/com/diffplug/spotless/sql/dbeaver/SQLTokenizedFormatter.java @@ -78,17 +78,17 @@ private List format(final List argList) { return argList; } - FormatterToken token = argList.get(0); + FormatterToken token = argList.getFirst(); if (token.getType() == TokenType.SPACE) { - argList.remove(0); + argList.removeFirst(); if (argList.isEmpty()) { return argList; } } - token = argList.get(argList.size() - 1); + token = argList.getLast(); if (token.getType() == TokenType.SPACE) { - argList.remove(argList.size() - 1); + argList.removeLast(); if (argList.isEmpty()) { return argList; } @@ -161,9 +161,9 @@ private List format(final List argList) { indent++; index += insertReturnAndIndent(argList, index + 1, indent); } else if (")".equals(tokenString) && !bracketIndent.isEmpty() && !functionBracket.isEmpty()) { - indent = bracketIndent.remove(bracketIndent.size() - 1); + indent = bracketIndent.removeLast(); index += insertReturnAndIndent(argList, index, indent); - functionBracket.remove(functionBracket.size() - 1); + functionBracket.removeLast(); } else if (",".equals(tokenString)) { index += insertReturnAndIndent(argList, index + 1, indent); } else if (statementDelimiters.contains(tokenString)) { diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java index 2bd773f2d3..d3e28a6060 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java @@ -29,7 +29,7 @@ public class SpotlessPlugin implements Plugin { static final String SPOTLESS_MODERN = "spotlessModern"; static final String VER_GRADLE_MIN = "8.1"; static final String VER_GRADLE_MIN_VERSION_FOR_CUSTOM = "8.4"; - private static final int MINIMUM_JRE = 17; + private static final int MINIMUM_JRE = 21; @Override public void apply(Project project) { diff --git a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java index 910a004dfe..df996b68dc 100644 --- a/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java +++ b/plugin-maven/src/main/java/com/diffplug/spotless/maven/SpotlessCheckMojo.java @@ -120,7 +120,7 @@ protected void process(String name, Iterable files, Formatter formatter, U .getMessage()); } else if (!lintProblems.isEmpty()) { // Show lints only if there are no formatting violations - Map.Entry firstLintProblem = lintProblems.get(0); + Map.Entry firstLintProblem = lintProblems.getFirst(); File file = firstLintProblem.getKey(); LintState lintState = firstLintProblem.getValue(); String stepName = lintState.getLintsByStep(formatter).keySet().iterator().next(); diff --git a/rewrite.yml b/rewrite.yml index 00f05a6fa4..850cceae65 100644 --- a/rewrite.yml +++ b/rewrite.yml @@ -16,7 +16,7 @@ recipeList: - org.openrewrite.java.format.NormalizeFormat - org.openrewrite.java.format.NormalizeLineBreaks - org.openrewrite.java.format.RemoveTrailingWhitespace - - org.openrewrite.java.migrate.UpgradeToJava17 + - org.openrewrite.java.migrate.UpgradeToJava21 - org.openrewrite.java.migrate.lang.StringRulesRecipes - org.openrewrite.java.migrate.util.JavaLangAPIs - org.openrewrite.java.migrate.util.JavaUtilAPIs diff --git a/testlib/src/test/java/com/diffplug/spotless/PaddedCellTest.java b/testlib/src/test/java/com/diffplug/spotless/PaddedCellTest.java index 2820aadeef..9a3558e3b5 100644 --- a/testlib/src/test/java/com/diffplug/spotless/PaddedCellTest.java +++ b/testlib/src/test/java/com/diffplug/spotless/PaddedCellTest.java @@ -84,16 +84,14 @@ void pingPong() throws IOException { @Test void fourState() throws IOException { - misbehaved(input -> { + misbehaved(input -> // @formatter:off switch (input) { - case "A": return "B"; - case "B": return "C"; - case "C": return "D"; - default: return "A"; - } - // @formatter:on - }, "CCC", CYCLE, "A,B,C,D", "A"); + case "A" -> "B"; + case "B" -> "C"; + case "C" -> "D"; + default -> "A"; + }, "CCC", CYCLE, "A,B,C,D", "A"); } @Test