Skip to content

Commit 0040888

Browse files
committed
Get Zipline building on Kotlin 2.2
This is an incremental step to make Zipline compatible with the Kotlin 2.2 compiler. Fixing deprecation warnings and removing suppressions is the necessary next step.
1 parent 71efca7 commit 0040888

File tree

10 files changed

+90
-46
lines changed

10 files changed

+90
-46
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
* In-development snapshots are now published to the Central Portal Snapshots repository at https://central.sonatype.com/repository/maven-snapshots/.
66

7+
* Upgrade: [Kotlin 2.2.0][kotlin_2_2_0].
8+
79

810
## [1.21.1] - 2025-07-17
911
[1.21.1]: https://github.com/cashapp/zipline/releases/tag/1.21.1
@@ -617,6 +619,7 @@ Initial release.
617619
[kotlin_1_9_23]: https://github.com/JetBrains/kotlin/releases/tag/v1.9.23
618620
[kotlin_2_0_0]: https://github.com/JetBrains/kotlin/releases/tag/v2.0.0
619621
[kotlin_2_1_21]: https://github.com/JetBrains/kotlin/releases/tag/v2.1.21
622+
[kotlin_2_2_0]: https://github.com/JetBrains/kotlin/releases/tag/v2.2.0
620623
[kotlin_serialization_1_4_0]: https://github.com/Kotlin/kotlinx.serialization/releases/tag/v1.4.0
621624
[kotlin_serialization_1_5_0]: https://github.com/Kotlin/kotlinx.serialization/releases/tag/v1.5.0
622625
[kotlin_serialization_1_5_1]: https://github.com/Kotlin/kotlinx.serialization/releases/tag/v1.5.1

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
androidx-compose = "1.8.3"
33
compileSdk = "35"
44
jetty = "12.0.23"
5-
kotlin = "2.1.21"
5+
kotlin = "2.2.0"
66
kotlinx-coroutines = "1.10.2"
7-
kotlinx-serialization = "1.8.1"
7+
kotlinx-serialization = "1.9.0"
88
okHttp = "4.12.0"
99
okio = "3.15.0"
1010
minSdk = "21"

zipline-api-validator/src/main/kotlin/app/cash/zipline/api/validator/fir/FirZiplineApiReader.kt

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,21 @@
1616
package app.cash.zipline.api.validator.fir
1717

1818
import java.io.File
19+
import org.jetbrains.kotlin.fir.FirElement
1920
import org.jetbrains.kotlin.fir.FirSession
2021
import org.jetbrains.kotlin.fir.analysis.checkers.isSupertypeOf
21-
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
22-
import org.jetbrains.kotlin.fir.declarations.FirFunction
23-
import org.jetbrains.kotlin.fir.declarations.FirProperty
22+
import org.jetbrains.kotlin.fir.declarations.FirFile
2423
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
24+
import org.jetbrains.kotlin.fir.declarations.processAllDeclarations
2525
import org.jetbrains.kotlin.fir.declarations.utils.isInterface
2626
import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
2727
import org.jetbrains.kotlin.fir.pipeline.FirResult
2828
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
2929
import org.jetbrains.kotlin.fir.resolve.toClassLikeSymbol
3030
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
3131
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
32+
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
33+
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
3234
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
3335
import org.jetbrains.kotlin.fir.types.FirStarProjection
3436
import org.jetbrains.kotlin.fir.types.FirTypeProjection
@@ -38,6 +40,7 @@ import org.jetbrains.kotlin.fir.types.FirUserTypeRef
3840
import org.jetbrains.kotlin.fir.types.abbreviatedTypeOrSelf
3941
import org.jetbrains.kotlin.fir.types.coneType
4042
import org.jetbrains.kotlin.fir.types.lookupTagIfAny
43+
import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor
4144
import org.jetbrains.kotlin.name.ClassId
4245
import org.jetbrains.kotlin.name.FqName
4346
import org.jetbrains.kotlin.name.Name
@@ -76,7 +79,7 @@ internal class FirZiplineApiReader(
7679

7780
fun read(): FirZiplineApi {
7881
val types = platformOutput.fir
79-
.flatMap { it.declarations.findRegularClassesRecursive() }
82+
.flatMap { it.regularClasses() }
8083
.filter { it.isInterface && it.isZiplineService }
8184

8285
val services = types
@@ -108,15 +111,15 @@ internal class FirZiplineApiReader(
108111
if (!supertype.isInterface) continue // Skip kotlin.Any.
109112
if (supertype.symbol.classId == autoCloseableClassId) continue // Skip AutoCloseable.
110113

111-
for (declaration in supertype.declarations) {
112-
when (declaration) {
113-
is FirFunction -> {
114-
if (declaration.isNonInterfaceFunction) continue
115-
result += declaration.asDeclaredZiplineFunction()
114+
supertype.processAllDeclarations(session) { symbol ->
115+
when (symbol) {
116+
is FirFunctionSymbol -> {
117+
if (symbol.isNonInterfaceFunction) return@processAllDeclarations
118+
result += symbol.asDeclaredZiplineFunction()
116119
}
117120

118-
is FirProperty -> {
119-
result += declaration.asDeclaredZiplineFunction()
121+
is FirPropertySymbol -> {
122+
result += symbol.asDeclaredZiplineFunction()
120123
}
121124

122125
else -> Unit
@@ -127,23 +130,23 @@ internal class FirZiplineApiReader(
127130
return result.toList()
128131
}
129132

130-
private val FirFunction.isNonInterfaceFunction: Boolean
131-
get() = symbol.name.identifier in NON_INTERFACE_FUNCTION_NAMES
133+
private val FirFunctionSymbol<*>.isNonInterfaceFunction: Boolean
134+
get() = name.identifier in NON_INTERFACE_FUNCTION_NAMES
132135

133-
private fun FirFunction.asDeclaredZiplineFunction(): FirZiplineFunction {
136+
private fun FirFunctionSymbol<*>.asDeclaredZiplineFunction(): FirZiplineFunction {
134137
val signature = buildString {
135138
if (isSuspend) append("suspend ")
136-
append("fun ${symbol.name.identifier}(")
137-
valueParameters.joinTo(this) { it.returnTypeRef.asString() }
138-
append("): ${returnTypeRef.asString()}")
139+
append("fun ${name.identifier}(")
140+
valueParameterSymbols.joinTo(this) { it.resolvedReturnTypeRef.asString() }
141+
append("): ${resolvedReturnTypeRef.asString()}")
139142
}
140143

141144
return FirZiplineFunction(signature)
142145
}
143146

144-
private fun FirProperty.asDeclaredZiplineFunction(): FirZiplineFunction {
147+
private fun FirPropertySymbol.asDeclaredZiplineFunction(): FirZiplineFunction {
145148
val valOrVar = if (isVar) "var" else "val"
146-
val signature = "$valOrVar ${symbol.name.identifier}: ${returnTypeRef.asString()}"
149+
val signature = "$valOrVar ${name.identifier}: ${resolvedReturnTypeRef.asString()}"
147150
return FirZiplineFunction(signature)
148151
}
149152

@@ -186,8 +189,28 @@ internal class FirZiplineApiReader(
186189
}
187190
}
188191

189-
private fun List<FirDeclaration>.findRegularClassesRecursive(): List<FirRegularClass> {
190-
val classes = filterIsInstance<FirRegularClass>()
191-
return classes + classes.flatMap { it.declarations.findRegularClassesRecursive() }
192+
/** Collect all regular class declarations in this. */
193+
private fun FirFile.regularClasses(): List<FirRegularClass> {
194+
val result = mutableListOf<FirRegularClass>()
195+
accept(
196+
visitor = object : FirDefaultVisitor<Unit, MutableList<FirRegularClass>>() {
197+
override fun visitRegularClass(
198+
regularClass: FirRegularClass,
199+
data: MutableList<FirRegularClass>
200+
) {
201+
super.visitRegularClass(regularClass, data)
202+
data.add(regularClass)
203+
}
204+
205+
override fun visitElement(
206+
element: FirElement,
207+
data: MutableList<FirRegularClass>
208+
) {
209+
element.acceptChildren(this, data)
210+
}
211+
},
212+
data = result,
213+
)
214+
return result
192215
}
193216
}

zipline-gradle-plugin/src/test/kotlin/app/cash/zipline/gradle/ZiplineGradlePluginTest.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ class ZiplineGradlePluginTest {
9393
.contains(result.task(taskName)!!.outcome)
9494
assertThat(result.output.lines()).containsMatchForEachInOrder(
9595
Regex("""app.cash.zipline.ZiplineException: \w+: boom!"""),
96-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
97-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
98-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
99-
Regex("""at <anonymous> \(app/cash/zipline/tests/CrashService.kt\)"""),
100-
Regex("""at <anonymous> \(lib.js\)"""),
101-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/InboundService.kt\)"""),
102-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/Endpoint.kt\)"""),
96+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
97+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
98+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
99+
Regex("""at [^ ]+ \(app/cash/zipline/tests/CrashService.kt\)"""),
100+
Regex("""at [^ ]+ \(lib.js\)"""),
101+
Regex("""at [^ ]+ \(app/cash/zipline/internal/bridge/InboundService.kt\)"""),
102+
Regex("""at [^ ]+ \(app/cash/zipline/internal/bridge/Endpoint.kt\)"""),
103103
Regex("""at app.cash.zipline.tests.CrashService[${'$'}]Companion[${'$'}]Adapter[${'$'}]GeneratedOutboundService.crash\(CrashService.kt:\d+\)"""),
104104
)
105105
}
@@ -120,13 +120,13 @@ class ZiplineGradlePluginTest {
120120
.contains(result.task(taskName)!!.outcome)
121121
assertThat(result.output.lines()).containsMatchForEachInOrder(
122122
Regex("""app.cash.zipline.ZiplineException: Exception: boom!"""),
123-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
124-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt:\d+\)"""),
125-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
126-
Regex("""at <anonymous> \(app/cash/zipline/tests/CrashService.kt\)"""),
127-
Regex("""at <anonymous> \(lib.js\)"""),
128-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/InboundService.kt:\d+\)"""),
129-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/Endpoint.kt:\d+\)"""),
123+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
124+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt:\d+\)"""),
125+
Regex("""at [^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
126+
Regex("""at [^ ]+ \(app/cash/zipline/tests/CrashService.kt\)"""),
127+
Regex("""at [^ ]+ \(lib.js\)"""),
128+
Regex("""at [^ ]+ \(app/cash/zipline/internal/bridge/InboundService.kt:\d+\)"""),
129+
Regex("""at [^ ]+ \(app/cash/zipline/internal/bridge/Endpoint.kt:\d+\)"""),
130130
Regex("""at app.cash.zipline.tests.CrashService[${'$'}]Companion[${'$'}]Adapter[${'$'}]GeneratedOutboundService.crash\(CrashService.kt:\d+\)"""),
131131
)
132132
}
@@ -146,12 +146,12 @@ class ZiplineGradlePluginTest {
146146
.contains(result.task(taskName)!!.outcome)
147147
assertThat(result.output.lines()).containsMatchForEachInOrder(
148148
Regex("""app.cash.zipline.ZiplineException: Exception: boom!"""),
149-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
150-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt:\d+\)"""),
151-
Regex("""at <anonymous> \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
152-
Regex("""at <anonymous> \(app/cash/zipline/tests/CrashService.kt\)"""),
153-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/InboundService.kt:\d+\)"""),
154-
Regex("""at <anonymous> \(app/cash/zipline/internal/bridge/Endpoint.kt:\d+\)"""),
149+
Regex("""at goBoom_[^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
150+
Regex("""at crash_[^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt:\d+\)"""),
151+
Regex("""at crash_[^ ]+ \(app/cash/zipline/tests/launchCrashServiceJs.kt\)"""),
152+
Regex("""at call_[^ ]+ \(app/cash/zipline/tests/CrashService.kt\)"""),
153+
Regex("""at call_[^ ]+ \(app/cash/zipline/internal/bridge/InboundService.kt:\d+\)"""),
154+
Regex("""at call_[^ ]+ \(app/cash/zipline/internal/bridge/Endpoint.kt:\d+\)"""),
155155
Regex("""at app.cash.zipline.tests.CrashService[${'$'}]Companion[${'$'}]Adapter[${'$'}]GeneratedOutboundService.crash\(CrashService.kt:\d+\)"""),
156156
)
157157
}

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/AdapterGenerator.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.ScopeWithIr
1922
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
2023
import org.jetbrains.kotlin.backend.common.ir.addDispatchReceiver

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/AddAdapterArgumentRewriter.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.ScopeWithIr
1922
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
2023
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
@@ -79,7 +82,7 @@ internal class AddAdapterArgumentRewriter(
7982
).adapterExpression(bridgedInterfaceType as IrSimpleType)
8083

8184
return irCall(original, rewrittenFunction).apply {
82-
putValueArgument(valueArgumentsCount - 1, adapterExpression)
85+
arguments += adapterExpression
8386
patchDeclarationParents(declarationParent)
8487
}
8588
}

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/BridgedInterface.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.ScopeWithIr
1922
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
2023
import org.jetbrains.kotlin.ir.IrElement

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/CallAdapterConstructorRewriter.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.ScopeWithIr
1922
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
2023
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/ZiplineApis.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
1922
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
2023
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
@@ -56,7 +59,7 @@ internal class ZiplineApis private constructor(
5659
val ziplineServiceClassId = ziplineFqPackage.classId("ZiplineService")
5760
private val ziplineServiceSerializerFunctionCallableId = ziplineFqPackage.callableId("ziplineServiceSerializer")
5861
private val ziplineServiceAdapterFunctionCallableId = bridgeFqPackage.callableId("ziplineServiceAdapter")
59-
private val ziplineServiceAdapterClassId = bridgeFqPackage.classId("ZiplineServiceAdapter")
62+
val ziplineServiceAdapterClassId = bridgeFqPackage.classId("ZiplineServiceAdapter")
6063
private val endpointClassId = bridgeFqPackage.classId("Endpoint")
6164
private val suspendCallbackClassId = bridgeFqPackage.classId("SuspendCallback")
6265
private val flowFqPackage = FqPackageName("kotlinx.coroutines.flow")

zipline-kotlin-plugin/src/main/kotlin/app/cash/zipline/kotlin/ir.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
@file:OptIn(DeprecatedForRemovalCompilerApi::class)
17+
1618
package app.cash.zipline.kotlin
1719

20+
import org.jetbrains.kotlin.DeprecatedForRemovalCompilerApi
1821
import org.jetbrains.kotlin.backend.common.ScopeWithIr
1922
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
2023
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder

0 commit comments

Comments
 (0)