Upgrade JVM toolchain to 25 and Kotlin toolchain to 2.3.20 (#1516)

Motivation
- Enable correct NullAway analysis
- Pick up toolchain fixes and improvements

Toolchains
- Require JDK 25 for JVM toolchain (keep Java 17 runtime compatibility)
- Require Kotlin 2.3.20 for Kotlin toolchain (keep Kotlin 2.2 runtime
compatibility)
- Require JDK 25 for Gradle daemon JVM (via
gradle-daemon-jvm.properties)
- Fix javac and kotlinc warnings from toolchain upgrades

CI
- Bump GitHub workflows to JDK 25

Building Kotlin
- Bump Kotlin language level to 2.2 to match stdlib version
- Consolidate build logic into pklKotlinBase.gradle.kts
- Adopt modern Kotlin plugin syntax
- Fix new kotlinc warnings
- Update ktfmt to 0.62
  - first version compatible with Kotlin 2.3.20
  - changes formatting compared to 0.61
- Replace dependency resolution rule with BOM alignment
  - rule was too broad and interfered with toolchain/runtime separation

Testing
- Expand matrix to JDK 25 (LTS) and 26
- Ensure each matrix task can be run independently
- Fix KotlinCodeGeneratorsTest and EmbeddedExecutorsTest on affected
JDKs
- Disable one test in CliCommandTest on affected JDKs (failure cause
unknown)

Compatibility fixes
- Fix reflective access in DocGenerator on affected JDKs

Build fixes
- Fix misuse of `task.enabled` vs. `report.required`
- Fix `gradlew tasks` on Windows
- Downgrade Spotless to 8.3.0 to (hopefully) work around sporadic
NoClassDefFoundError

Result
- NullAway runs correctly
- Broader JDK test coverage
- More reproducible and potentially faster builds
This commit is contained in:
odenix
2026-04-14 11:57:09 -07:00
committed by GitHub
parent 20f403e751
commit 2d4286ee7b
49 changed files with 1347 additions and 1096 deletions
@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -47,7 +47,8 @@ class PClassInfoTest {
@Test
fun isExactTypeOf() {
assertThat(PClassInfo.Any.isExactClassOf(Object())).isFalse
assertThat(PClassInfo.Typed.isExactClassOf(Object())).isFalse
// Any() is the equivalent of Java's Object()
assertThat(PClassInfo.Any.isExactClassOf(Any())).isFalse
assertThat(PClassInfo.Typed.isExactClassOf(Any())).isFalse
}
}
@@ -1,5 +1,5 @@
/*
* Copyright © 2025 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2025-2026 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ import org.pkl.core.util.pklbinary.PklBinaryCode
class PklBinaryDecoderTest {
@Test
fun `decoding succeeds`() {
val moduleUri = URI.create("file:///\$snippetsDir/input/api/encoding1.msgpack.yaml.pkl")
val moduleUri = URI.create($$"file:///$snippetsDir/input/api/encoding1.msgpack.yaml.pkl")
// based on pkl-core/src/test/files/LanguageSnippetTests/input/api/encoding1.msgpack.yaml.pkl
// but Class, TypeAlias, and IntSeq values are nil'd
// and any module URIs are normalized to use $snippetsDir instead of an absoulute path
@@ -63,7 +63,7 @@ class PklBinaryDecoderTest {
PObject(
PClassInfo.get("pkl.base", "PcfRenderer", PClassInfo.pklBaseUri),
mapOf(
"converters" to emptyMap<Object, Object>(),
"converters" to emptyMap<Any, Any>(),
"extension" to "pcf",
"indent" to " ",
"omitNullProperties" to false,