diff --git a/README.md b/README.md index 9398a511e..e858fe591 100644 --- a/README.md +++ b/README.md @@ -182,12 +182,16 @@ shortcut.  -## Java 21 Support +## Java 26 Support -In [1211](https://github.com/palantir/palantir-java-format/pull/1211) we shipped Java 21 support. In order to use the -Java 21 formatting capabilities, ensure that either: +In [1211](https://github.com/palantir/palantir-java-format/pull/1211) we shipped Java 21 support. Since then we've +kept up with the language and now also support formatting the newer syntax introduced up through Java 26, including +module import declarations, compact source files and instance main methods, flexible constructor bodies, markdown +documentation comments, and unnamed patterns in deconstruction. In order to use these formatting capabilities, ensure +that either: -- the Gradle daemon and the Intellij Project SDK are set to Java 21 +- the Gradle daemon and the Intellij Project SDK are set to Java 26 (or, at minimum, to the JDK version in which the + feature you're relying on was finalized) - or that the gradle property `palantir.native.formatter=true`. This will run the formatter as a native image, - independent of the Gradle daemon/Intellij project JDK version. diff --git a/build.gradle b/build.gradle index af55b7e26..785718632 100644 --- a/build.gradle +++ b/build.gradle @@ -81,10 +81,43 @@ javaVersions { jdks { daemonTarget = 21 + jdk(22) { + distribution = 'azul-zulu' + jdkVersion = '22.32.15-22.0.2' + } + jdk(23) { distribution = 'graalvm-ce' jdkVersion = '23.0.1' } + jdk(25) { + distribution = 'azul-zulu' + jdkVersion = '25.32.21-25.0.2' + + // The bundled com.palantir.jdks.latest defaults (applied earlier in this file) + // pre-populate major version 25 with amazon-corretto, pinned per-OS/arch. JdkExtension + // configuration actions accumulate rather than replace, so those per-arch jdkVersion + // values are hard-set before this block runs and don't pick up the top-level override + // above. Re-pin every OS/arch explicitly to the desired Zulu build. + ['macos', 'linux-glibc', 'linux-musl', 'windows'].each { osName -> + os(osName) { + ['x86', 'x86-64', 'aarch64'].each { archName -> + arch(archName) { + jdkVersion = '25.32.21-25.0.2' + } + } + } + } + } + + jdk(26) { + distribution = 'azul-zulu' + jdkVersion = '26.30.11-26.0.1' + } + + jdkMajorVersionsToUse().add(JavaLanguageVersion.of("22")) jdkMajorVersionsToUse().add(JavaLanguageVersion.of("23")) + jdkMajorVersionsToUse().add(JavaLanguageVersion.of("25")) + jdkMajorVersionsToUse().add(JavaLanguageVersion.of("26")) } diff --git a/gradle/jdks/22/linux-glibc/aarch64/download-url b/gradle/jdks/22/linux-glibc/aarch64/download-url new file mode 100644 index 000000000..ebcf219b5 --- /dev/null +++ b/gradle/jdks/22/linux-glibc/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_aarch64.tar.gz diff --git a/gradle/jdks/22/linux-glibc/aarch64/local-path b/gradle/jdks/22/linux-glibc/aarch64/local-path new file mode 100644 index 000000000..675f9344d --- /dev/null +++ b/gradle/jdks/22/linux-glibc/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-glibc diff --git a/gradle/jdks/22/linux-glibc/x86-64/download-url b/gradle/jdks/22/linux-glibc/x86-64/download-url new file mode 100644 index 000000000..12925be39 --- /dev/null +++ b/gradle/jdks/22/linux-glibc/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_x64.tar.gz diff --git a/gradle/jdks/22/linux-glibc/x86-64/local-path b/gradle/jdks/22/linux-glibc/x86-64/local-path new file mode 100644 index 000000000..675f9344d --- /dev/null +++ b/gradle/jdks/22/linux-glibc/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-glibc diff --git a/gradle/jdks/22/linux-glibc/x86/download-url b/gradle/jdks/22/linux-glibc/x86/download-url new file mode 100644 index 000000000..760b58771 --- /dev/null +++ b/gradle/jdks/22/linux-glibc/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_i686.tar.gz diff --git a/gradle/jdks/22/linux-glibc/x86/local-path b/gradle/jdks/22/linux-glibc/x86/local-path new file mode 100644 index 000000000..675f9344d --- /dev/null +++ b/gradle/jdks/22/linux-glibc/x86/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-glibc diff --git a/gradle/jdks/22/linux-musl/aarch64/download-url b/gradle/jdks/22/linux-musl/aarch64/download-url new file mode 100644 index 000000000..f90d012b7 --- /dev/null +++ b/gradle/jdks/22/linux-musl/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_musl_aarch64.tar.gz diff --git a/gradle/jdks/22/linux-musl/aarch64/local-path b/gradle/jdks/22/linux-musl/aarch64/local-path new file mode 100644 index 000000000..e6f386f1d --- /dev/null +++ b/gradle/jdks/22/linux-musl/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-musl diff --git a/gradle/jdks/22/linux-musl/x86-64/download-url b/gradle/jdks/22/linux-musl/x86-64/download-url new file mode 100644 index 000000000..4a4149970 --- /dev/null +++ b/gradle/jdks/22/linux-musl/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_musl_x64.tar.gz diff --git a/gradle/jdks/22/linux-musl/x86-64/local-path b/gradle/jdks/22/linux-musl/x86-64/local-path new file mode 100644 index 000000000..e6f386f1d --- /dev/null +++ b/gradle/jdks/22/linux-musl/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-musl diff --git a/gradle/jdks/22/linux-musl/x86/download-url b/gradle/jdks/22/linux-musl/x86/download-url new file mode 100644 index 000000000..b36072a01 --- /dev/null +++ b/gradle/jdks/22/linux-musl/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-linux_musl_i686.tar.gz diff --git a/gradle/jdks/22/linux-musl/x86/local-path b/gradle/jdks/22/linux-musl/x86/local-path new file mode 100644 index 000000000..e6f386f1d --- /dev/null +++ b/gradle/jdks/22/linux-musl/x86/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2-musl diff --git a/gradle/jdks/22/macos/aarch64/download-url b/gradle/jdks/22/macos/aarch64/download-url new file mode 100644 index 000000000..45ee86890 --- /dev/null +++ b/gradle/jdks/22/macos/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-macosx_aarch64.zip diff --git a/gradle/jdks/22/macos/aarch64/local-path b/gradle/jdks/22/macos/aarch64/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/macos/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/22/macos/x86-64/download-url b/gradle/jdks/22/macos/x86-64/download-url new file mode 100644 index 000000000..cd3cd9e96 --- /dev/null +++ b/gradle/jdks/22/macos/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-macosx_x64.zip diff --git a/gradle/jdks/22/macos/x86-64/local-path b/gradle/jdks/22/macos/x86-64/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/macos/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/22/macos/x86/download-url b/gradle/jdks/22/macos/x86/download-url new file mode 100644 index 000000000..cb109acc8 --- /dev/null +++ b/gradle/jdks/22/macos/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-macosx_i686.zip diff --git a/gradle/jdks/22/macos/x86/local-path b/gradle/jdks/22/macos/x86/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/macos/x86/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/22/windows/aarch64/download-url b/gradle/jdks/22/windows/aarch64/download-url new file mode 100644 index 000000000..9391ec9e9 --- /dev/null +++ b/gradle/jdks/22/windows/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-win_aarch64.zip diff --git a/gradle/jdks/22/windows/aarch64/local-path b/gradle/jdks/22/windows/aarch64/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/windows/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/22/windows/x86-64/download-url b/gradle/jdks/22/windows/x86-64/download-url new file mode 100644 index 000000000..f18afcc9b --- /dev/null +++ b/gradle/jdks/22/windows/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-win_x64.zip diff --git a/gradle/jdks/22/windows/x86-64/local-path b/gradle/jdks/22/windows/x86-64/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/windows/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/22/windows/x86/download-url b/gradle/jdks/22/windows/x86/download-url new file mode 100644 index 000000000..9890b09c5 --- /dev/null +++ b/gradle/jdks/22/windows/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu22.32.15-ca-jdk22.0.2-win_i686.zip diff --git a/gradle/jdks/22/windows/x86/local-path b/gradle/jdks/22/windows/x86/local-path new file mode 100644 index 000000000..345aa67b2 --- /dev/null +++ b/gradle/jdks/22/windows/x86/local-path @@ -0,0 +1 @@ +azul-zulu-22.32.15-22.0.2 diff --git a/gradle/jdks/25/linux-glibc/aarch64/download-url b/gradle/jdks/25/linux-glibc/aarch64/download-url new file mode 100644 index 000000000..3bde8cd3f --- /dev/null +++ b/gradle/jdks/25/linux-glibc/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_aarch64.tar.gz diff --git a/gradle/jdks/25/linux-glibc/aarch64/local-path b/gradle/jdks/25/linux-glibc/aarch64/local-path new file mode 100644 index 000000000..ff5679715 --- /dev/null +++ b/gradle/jdks/25/linux-glibc/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-glibc diff --git a/gradle/jdks/25/linux-glibc/x86-64/download-url b/gradle/jdks/25/linux-glibc/x86-64/download-url new file mode 100644 index 000000000..917813c83 --- /dev/null +++ b/gradle/jdks/25/linux-glibc/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_x64.tar.gz diff --git a/gradle/jdks/25/linux-glibc/x86-64/local-path b/gradle/jdks/25/linux-glibc/x86-64/local-path new file mode 100644 index 000000000..ff5679715 --- /dev/null +++ b/gradle/jdks/25/linux-glibc/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-glibc diff --git a/gradle/jdks/25/linux-glibc/x86/download-url b/gradle/jdks/25/linux-glibc/x86/download-url new file mode 100644 index 000000000..77f9d7b31 --- /dev/null +++ b/gradle/jdks/25/linux-glibc/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_i686.tar.gz diff --git a/gradle/jdks/25/linux-glibc/x86/local-path b/gradle/jdks/25/linux-glibc/x86/local-path new file mode 100644 index 000000000..ff5679715 --- /dev/null +++ b/gradle/jdks/25/linux-glibc/x86/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-glibc diff --git a/gradle/jdks/25/linux-musl/aarch64/download-url b/gradle/jdks/25/linux-musl/aarch64/download-url new file mode 100644 index 000000000..85214b695 --- /dev/null +++ b/gradle/jdks/25/linux-musl/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_musl_aarch64.tar.gz diff --git a/gradle/jdks/25/linux-musl/aarch64/local-path b/gradle/jdks/25/linux-musl/aarch64/local-path new file mode 100644 index 000000000..ebac669dd --- /dev/null +++ b/gradle/jdks/25/linux-musl/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-musl diff --git a/gradle/jdks/25/linux-musl/x86-64/download-url b/gradle/jdks/25/linux-musl/x86-64/download-url new file mode 100644 index 000000000..6f1edc957 --- /dev/null +++ b/gradle/jdks/25/linux-musl/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_musl_x64.tar.gz diff --git a/gradle/jdks/25/linux-musl/x86-64/local-path b/gradle/jdks/25/linux-musl/x86-64/local-path new file mode 100644 index 000000000..ebac669dd --- /dev/null +++ b/gradle/jdks/25/linux-musl/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-musl diff --git a/gradle/jdks/25/linux-musl/x86/download-url b/gradle/jdks/25/linux-musl/x86/download-url new file mode 100644 index 000000000..2bf982c93 --- /dev/null +++ b/gradle/jdks/25/linux-musl/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-linux_musl_i686.tar.gz diff --git a/gradle/jdks/25/linux-musl/x86/local-path b/gradle/jdks/25/linux-musl/x86/local-path new file mode 100644 index 000000000..ebac669dd --- /dev/null +++ b/gradle/jdks/25/linux-musl/x86/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2-musl diff --git a/gradle/jdks/25/macos/aarch64/download-url b/gradle/jdks/25/macos/aarch64/download-url new file mode 100644 index 000000000..aa5b68d6e --- /dev/null +++ b/gradle/jdks/25/macos/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-macosx_aarch64.zip diff --git a/gradle/jdks/25/macos/aarch64/local-path b/gradle/jdks/25/macos/aarch64/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/macos/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/25/macos/x86-64/download-url b/gradle/jdks/25/macos/x86-64/download-url new file mode 100644 index 000000000..281116f91 --- /dev/null +++ b/gradle/jdks/25/macos/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-macosx_x64.zip diff --git a/gradle/jdks/25/macos/x86-64/local-path b/gradle/jdks/25/macos/x86-64/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/macos/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/25/macos/x86/download-url b/gradle/jdks/25/macos/x86/download-url new file mode 100644 index 000000000..d2c5c3f9e --- /dev/null +++ b/gradle/jdks/25/macos/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-macosx_i686.zip diff --git a/gradle/jdks/25/macos/x86/local-path b/gradle/jdks/25/macos/x86/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/macos/x86/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/25/windows/aarch64/download-url b/gradle/jdks/25/windows/aarch64/download-url new file mode 100644 index 000000000..2b0265ac9 --- /dev/null +++ b/gradle/jdks/25/windows/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-win_aarch64.zip diff --git a/gradle/jdks/25/windows/aarch64/local-path b/gradle/jdks/25/windows/aarch64/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/windows/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/25/windows/x86-64/download-url b/gradle/jdks/25/windows/x86-64/download-url new file mode 100644 index 000000000..d21da7ffd --- /dev/null +++ b/gradle/jdks/25/windows/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-win_x64.zip diff --git a/gradle/jdks/25/windows/x86-64/local-path b/gradle/jdks/25/windows/x86-64/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/windows/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/25/windows/x86/download-url b/gradle/jdks/25/windows/x86/download-url new file mode 100644 index 000000000..9f6d9f9a2 --- /dev/null +++ b/gradle/jdks/25/windows/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu25.32.21-ca-jdk25.0.2-win_i686.zip diff --git a/gradle/jdks/25/windows/x86/local-path b/gradle/jdks/25/windows/x86/local-path new file mode 100644 index 000000000..5227b59b2 --- /dev/null +++ b/gradle/jdks/25/windows/x86/local-path @@ -0,0 +1 @@ +azul-zulu-25.32.21-25.0.2 diff --git a/gradle/jdks/26/linux-glibc/aarch64/download-url b/gradle/jdks/26/linux-glibc/aarch64/download-url new file mode 100644 index 000000000..95944f7a9 --- /dev/null +++ b/gradle/jdks/26/linux-glibc/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_aarch64.tar.gz diff --git a/gradle/jdks/26/linux-glibc/aarch64/local-path b/gradle/jdks/26/linux-glibc/aarch64/local-path new file mode 100644 index 000000000..02da9293e --- /dev/null +++ b/gradle/jdks/26/linux-glibc/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-glibc diff --git a/gradle/jdks/26/linux-glibc/x86-64/download-url b/gradle/jdks/26/linux-glibc/x86-64/download-url new file mode 100644 index 000000000..3da44a7ae --- /dev/null +++ b/gradle/jdks/26/linux-glibc/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_x64.tar.gz diff --git a/gradle/jdks/26/linux-glibc/x86-64/local-path b/gradle/jdks/26/linux-glibc/x86-64/local-path new file mode 100644 index 000000000..02da9293e --- /dev/null +++ b/gradle/jdks/26/linux-glibc/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-glibc diff --git a/gradle/jdks/26/linux-glibc/x86/download-url b/gradle/jdks/26/linux-glibc/x86/download-url new file mode 100644 index 000000000..3a135a15e --- /dev/null +++ b/gradle/jdks/26/linux-glibc/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_i686.tar.gz diff --git a/gradle/jdks/26/linux-glibc/x86/local-path b/gradle/jdks/26/linux-glibc/x86/local-path new file mode 100644 index 000000000..02da9293e --- /dev/null +++ b/gradle/jdks/26/linux-glibc/x86/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-glibc diff --git a/gradle/jdks/26/linux-musl/aarch64/download-url b/gradle/jdks/26/linux-musl/aarch64/download-url new file mode 100644 index 000000000..a40fab332 --- /dev/null +++ b/gradle/jdks/26/linux-musl/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_musl_aarch64.tar.gz diff --git a/gradle/jdks/26/linux-musl/aarch64/local-path b/gradle/jdks/26/linux-musl/aarch64/local-path new file mode 100644 index 000000000..581f02be5 --- /dev/null +++ b/gradle/jdks/26/linux-musl/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-musl diff --git a/gradle/jdks/26/linux-musl/x86-64/download-url b/gradle/jdks/26/linux-musl/x86-64/download-url new file mode 100644 index 000000000..00bfc67e8 --- /dev/null +++ b/gradle/jdks/26/linux-musl/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_musl_x64.tar.gz diff --git a/gradle/jdks/26/linux-musl/x86-64/local-path b/gradle/jdks/26/linux-musl/x86-64/local-path new file mode 100644 index 000000000..581f02be5 --- /dev/null +++ b/gradle/jdks/26/linux-musl/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-musl diff --git a/gradle/jdks/26/linux-musl/x86/download-url b/gradle/jdks/26/linux-musl/x86/download-url new file mode 100644 index 000000000..1f2d71b05 --- /dev/null +++ b/gradle/jdks/26/linux-musl/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-linux_musl_i686.tar.gz diff --git a/gradle/jdks/26/linux-musl/x86/local-path b/gradle/jdks/26/linux-musl/x86/local-path new file mode 100644 index 000000000..581f02be5 --- /dev/null +++ b/gradle/jdks/26/linux-musl/x86/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1-musl diff --git a/gradle/jdks/26/macos/aarch64/download-url b/gradle/jdks/26/macos/aarch64/download-url new file mode 100644 index 000000000..d3866121a --- /dev/null +++ b/gradle/jdks/26/macos/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-macosx_aarch64.zip diff --git a/gradle/jdks/26/macos/aarch64/local-path b/gradle/jdks/26/macos/aarch64/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/macos/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/gradle/jdks/26/macos/x86-64/download-url b/gradle/jdks/26/macos/x86-64/download-url new file mode 100644 index 000000000..de3944af3 --- /dev/null +++ b/gradle/jdks/26/macos/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-macosx_x64.zip diff --git a/gradle/jdks/26/macos/x86-64/local-path b/gradle/jdks/26/macos/x86-64/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/macos/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/gradle/jdks/26/macos/x86/download-url b/gradle/jdks/26/macos/x86/download-url new file mode 100644 index 000000000..67820c2e1 --- /dev/null +++ b/gradle/jdks/26/macos/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-macosx_i686.zip diff --git a/gradle/jdks/26/macos/x86/local-path b/gradle/jdks/26/macos/x86/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/macos/x86/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/gradle/jdks/26/windows/aarch64/download-url b/gradle/jdks/26/windows/aarch64/download-url new file mode 100644 index 000000000..e5aa35709 --- /dev/null +++ b/gradle/jdks/26/windows/aarch64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-win_aarch64.zip diff --git a/gradle/jdks/26/windows/aarch64/local-path b/gradle/jdks/26/windows/aarch64/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/windows/aarch64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/gradle/jdks/26/windows/x86-64/download-url b/gradle/jdks/26/windows/x86-64/download-url new file mode 100644 index 000000000..4fc5c3d92 --- /dev/null +++ b/gradle/jdks/26/windows/x86-64/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-win_x64.zip diff --git a/gradle/jdks/26/windows/x86-64/local-path b/gradle/jdks/26/windows/x86-64/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/windows/x86-64/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/gradle/jdks/26/windows/x86/download-url b/gradle/jdks/26/windows/x86/download-url new file mode 100644 index 000000000..6d93dd426 --- /dev/null +++ b/gradle/jdks/26/windows/x86/download-url @@ -0,0 +1 @@ +https://cdn.azul.com/zulu/bin/zulu26.30.11-ca-jdk26.0.1-win_i686.zip diff --git a/gradle/jdks/26/windows/x86/local-path b/gradle/jdks/26/windows/x86/local-path new file mode 100644 index 000000000..fa72b6eb5 --- /dev/null +++ b/gradle/jdks/26/windows/x86/local-path @@ -0,0 +1 @@ +azul-zulu-26.30.11-26.0.1 diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index 470e5cbaf..418481119 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -64,3 +64,45 @@ tasks.named("test") { javaVersion { target = 21 } + +// The default `test` task runs on JDK 21 (see the root `javaVersions.runtime`), which exercises +// the Java21InputAstVisitor dispatch branch and all Java-21-and-earlier golden tests; newer-feature +// golden tests self-skip on JDK 21 via FileBasedTests#assumeJavaVersionForTest. To get *native* +// coverage of the newer dispatch branches (Java25InputAstVisitor, Java26InputAstVisitor) and the +// golden tests gated on newer feature JDKs (MarkdownDoc @ 23, UnnamedPattern @ 22, +// FlexibleConstructor/ModuleImport/CompactSource @ 25), run the same version-gated golden suites +// again on each additional JDK registered in the root `jdks { }` block. The JDK-independent unit +// tests are already covered once by the default JDK-21 `test`, so these extra legs only re-run the +// file-based integration suites. +[22, 23, 25, 26].each { jdkVersion -> + tasks.register("testJdk${jdkVersion}", Test) { + group = 'verification' + description = "Runs the JDK-version-gated golden test suites on JDK ${jdkVersion}." + + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(jdkVersion) + } + + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath + useJUnitPlatform() + systemProperty 'recreate', System.getProperty('recreate', 'false') + + filter { + includeTestsMatching 'com.palantir.javaformat.java.FormatterIntegrationTest' + includeTestsMatching 'com.palantir.javaformat.java.StringWrapperIntegrationTest' + if (jdkVersion >= 25) { + // The module-import case in RemoveUnusedImportsTest guards a JDK-25+-only + // ClassCastException fix for JCModuleImport and self-skips below JDK 25, so it + // needs native coverage on these legs (it's otherwise never exercised by the + // JDK-21 default `test`, which skips it, or by the integration suites above, + // which never call removeUnusedImports). + includeTestsMatching 'com.palantir.javaformat.java.RemoveUnusedImportsTest' + } + } + } +} + +tasks.named('check') { + dependsOn tasks.named('testJdk22'), tasks.named('testJdk23'), tasks.named('testJdk25'), tasks.named('testJdk26') +} diff --git a/palantir-java-format/src/main/java/com/palantir/javaformat/java/Formatter.java b/palantir-java-format/src/main/java/com/palantir/javaformat/java/Formatter.java index ef8dab408..bfe4de0b7 100644 --- a/palantir-java-format/src/main/java/com/palantir/javaformat/java/Formatter.java +++ b/palantir-java-format/src/main/java/com/palantir/javaformat/java/Formatter.java @@ -132,7 +132,11 @@ static JavaOutput format( OpsBuilder opsBuilder = new OpsBuilder(javaInput); JavaInputAstVisitor visitor; - if (getRuntimeVersion() >= 21) { + if (getRuntimeVersion() >= 26) { + visitor = createVisitor("com.palantir.javaformat.java.java26.Java26InputAstVisitor", opsBuilder, options); + } else if (getRuntimeVersion() >= 25) { + visitor = createVisitor("com.palantir.javaformat.java.java25.Java25InputAstVisitor", opsBuilder, options); + } else if (getRuntimeVersion() >= 21) { visitor = createVisitor("com.palantir.javaformat.java.java21.Java21InputAstVisitor", opsBuilder, options); } else if (getRuntimeVersion() >= 14) { visitor = createVisitor("com.palantir.javaformat.java.java14.Java14InputAstVisitor", opsBuilder, options); diff --git a/palantir-java-format/src/main/java/com/palantir/javaformat/java/ImportOrderer.java b/palantir-java-format/src/main/java/com/palantir/javaformat/java/ImportOrderer.java index 1ba037e11..0687c9ae3 100644 --- a/palantir-java-format/src/main/java/com/palantir/javaformat/java/ImportOrderer.java +++ b/palantir-java-format/src/main/java/com/palantir/javaformat/java/ImportOrderer.java @@ -123,16 +123,25 @@ private String reorderImports() throws FormatterException { /** * A {@link Comparator} that orders {@link Import}s by Google Style, defined at * https://google.github.io/styleguide/javaguide.html#s3.3.3-import-ordering-and-spacing. + * + *
Module imports ({@code import module foo.bar;}, JEP 511) are sorted into their own leading group, ahead of
+ * both static and non-static type imports: they bind whole modules' worth of exported packages, so they read
+ * most naturally as the broadest, first declarations in the file.
*/
- private static final Comparator As with {@link #GOOGLE_IMPORT_COMPARATOR}, module imports sort into their own leading group.
*/
- private static final Comparator{@code
*
@@ -302,7 +330,14 @@ private ImportsAndIndex scanImports(int i) throws FormatterException {
if (isSpaceToken(i)) {
i++;
}
- boolean isStatic = tokenAt(i).equals("static");
+ boolean isModule = isModuleKeyword(i);
+ if (isModule) {
+ i++;
+ if (isSpaceToken(i)) {
+ i++;
+ }
+ }
+ boolean isStatic = !isModule && tokenAt(i).equals("static");
if (isStatic) {
i++;
if (isSpaceToken(i)) {
@@ -344,7 +379,7 @@ private ImportsAndIndex scanImports(int i) throws FormatterException {
i++;
}
}
- imports.add(new Import(importedName, trailing.toString(), isStatic));
+ imports.add(new Import(importedName, trailing.toString(), isStatic, isModule));
// Remember the position just after the import we just saw, before skipping blank lines.
// If the next thing after the blank lines is not another import then we don't want to
// include those blank lines in the text to be replaced.
@@ -452,6 +487,25 @@ private String tokenAt(int i) {
return toks.get(i).getOriginalText();
}
+ /**
+ * Returns true if the token at {@code i} is the {@code module} contextual keyword introducing a module import
+ * declaration ({@code import module foo.bar;}, JEP 511), as opposed to an ordinary import whose first segment
+ * happens to be an identifier literally named {@code module} (for example {@code import module.Foo;}). As with
+ * other contextual keywords ({@code var}, {@code yield}, ...), this is disambiguated by lookahead: {@code
+ * module} only introduces a module import when it is immediately followed by another identifier, rather than
+ * {@code .} or {@code ;}.
+ */
+ private boolean isModuleKeyword(int i) {
+ if (!tokenAt(i).equals("module")) {
+ return false;
+ }
+ int next = i + 1;
+ if (isSpaceToken(next)) {
+ next++;
+ }
+ return isIdentifierToken(next);
+ }
+
private boolean isIdentifierToken(int i) {
String s = tokenAt(i);
return !s.isEmpty() && Character.isJavaIdentifierStart(s.codePointAt(0));
diff --git a/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java b/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java
index 3917911ee..1c8186440 100644
--- a/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java
+++ b/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavaInputAstVisitor.java
@@ -132,6 +132,7 @@
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeScanner;
+import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
@@ -376,8 +377,15 @@ public Void visitCompilationUnit(CompilationUnitTree node, Void unused) {
builder.blankLineWanted(BlankLineWanted.YES);
}
markForPartialFormat();
- scan(type, null);
- builder.forcedBreak();
+ if (isCompactSourceFile(type)) {
+ // JEP 512 (Java 25): a "compact source file" has top-level fields/methods and no
+ // explicit class declaration. javac models this by synthesizing an implicit wrapper
+ // class; format its member list directly, at column zero, with no enclosing braces.
+ addBodyDeclarations(((ClassTree) type).getMembers(), BracesOrNot.NO, FirstDeclarationsOrNot.YES, ZERO);
+ } else {
+ scan(type, null);
+ builder.forcedBreak();
+ }
first = false;
dropEmptyDeclarations();
}
@@ -1381,6 +1389,17 @@ public Void visitAnnotatedType(AnnotatedTypeTree node, Void unused) {
protected static final long RECORD = 1L << 61;
+ // TODO: Use Flags.IMPLICIT_CLASS once if/when we drop support for Java 11. javac sets this flag
+ // on the synthetic wrapper class it generates for a "compact source file" (JEP 512, Java 25):
+ // top-level fields/methods with no explicit enclosing class declaration.
+ protected static final long IMPLICIT_CLASS = 1L << 19;
+
+ /** Is {@code type} the implicit wrapper class javac synthesizes for a compact source file? */
+ private static boolean isCompactSourceFile(Tree type) {
+ return type instanceof JCTree.JCClassDecl
+ && (((JCTree.JCClassDecl) type).mods.flags & IMPLICIT_CLASS) == IMPLICIT_CLASS;
+ }
+
@SuppressWarnings("for-rollout:NullAway")
@Override
public Void visitMethod(MethodTree node, Void unused) {
@@ -2609,7 +2628,7 @@ public Void visitUses(UsesTree node, Void unused) {
}
/** Helper method for import declarations, names, and qualified names. */
- private void visitName(Tree node) {
+ protected void visitName(Tree node) {
Deque