Skip to content

Commit fb59f2f

Browse files
committed
Update FIR parsing to prefer abbreviated type
This ensures we continue to get typealias names, rather than their expanded type names.
1 parent 1c3bb67 commit fb59f2f

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,20 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInterface
2727
import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
2828
import org.jetbrains.kotlin.fir.pipeline.FirResult
2929
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
30+
import org.jetbrains.kotlin.fir.resolve.toSymbol
31+
import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag
3032
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
3133
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
34+
import org.jetbrains.kotlin.fir.types.ConeKotlinType
35+
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
3236
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
3337
import org.jetbrains.kotlin.fir.types.FirStarProjection
3438
import org.jetbrains.kotlin.fir.types.FirTypeProjection
3539
import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance
3640
import org.jetbrains.kotlin.fir.types.FirTypeRef
3741
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
42+
import org.jetbrains.kotlin.fir.types.abbreviatedTypeOrSelf
43+
import org.jetbrains.kotlin.fir.types.coneType
3844
import org.jetbrains.kotlin.name.ClassId
3945
import org.jetbrains.kotlin.name.FqName
4046
import org.jetbrains.kotlin.name.Name
@@ -131,24 +137,33 @@ internal class FirZiplineApiReader(
131137
val signature = buildString {
132138
if (isSuspend) append("suspend ")
133139
append("fun ${symbol.name.identifier}(")
134-
append(valueParameters.joinToString { it.returnTypeRef.asString() })
140+
valueParameters.joinTo(this) { it.returnTypeRef.asString() }
135141
append("): ${returnTypeRef.asString()}")
136142
}
137143

138144
return FirZiplineFunction(signature)
139145
}
140146

141147
private fun FirProperty.asDeclaredZiplineFunction(): FirZiplineFunction {
142-
val signature = when {
143-
isVar -> "var ${symbol.name.identifier}: ${returnTypeRef.asString()}"
144-
else -> "val ${symbol.name.identifier}: ${returnTypeRef.asString()}"
145-
}
148+
val valOrVar = if (isVar) "var" else "val"
149+
val signature = "$valOrVar ${symbol.name.identifier}: ${returnTypeRef.asString()}"
146150
return FirZiplineFunction(signature)
147151
}
148152

153+
// TODO This available natively in Kotlin 2.1.0 or newer and can be deleted after upgrading.
154+
val ConeKotlinType.lookupTagIfAny: ConeClassifierLookupTag?
155+
get() = (this as? ConeLookupTagBasedType)?.lookupTag
156+
157+
// TODO This available natively in Kotlin 2.1.0 or newer and can be deleted after upgrading.
158+
fun ConeClassifierLookupTag.toClassLikeSymbol(useSiteSession: FirSession): FirClassLikeSymbol<*>? {
159+
return toSymbol(useSiteSession) as? FirClassLikeSymbol<*>
160+
}
161+
149162
/** See [app.cash.zipline.kotlin.asString]. */
150163
private fun FirTypeRef.asString(): String {
151-
val classLikeSymbol = toClassLikeSymbol(session) ?: error("unexpected class: $this")
164+
// Abbreviated type gets us the name of typealiases rather than what they expand to.
165+
val classLikeSymbol = coneType.abbreviatedTypeOrSelf.lookupTagIfAny
166+
?.toClassLikeSymbol(session) ?: error("unexpected class: $this")
152167

153168
val typeRef = when (this) {
154169
is FirResolvedTypeRef -> delegatedTypeRef ?: this

0 commit comments

Comments
 (0)