Skip to content

Commit ebf987b

Browse files
ting-yuanKSP Auto Pick
authored and
KSP Auto Pick
committed
Mangle jvm names for inline class
(cherry picked from commit 207b849)
1 parent 46556c2 commit ebf987b

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ResolverAAImpl.kt

+10-2
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,14 @@ class ResolverAAImpl(
510510
} else {
511511
"set"
512512
}
513+
val inlineSuffix = when (accessor) {
514+
is KSPropertyAccessorImpl -> accessor.ktPropertyAccessorSymbol.inlineSuffix
515+
else -> ""
516+
}
513517
val mangledName = if (accessor.modifiers.contains(Modifier.INTERNAL)) {
514518
"\$${ktModule.name}"
515519
} else ""
516-
return "${prefix}${accessor.receiver.simpleName.asString().capitalize()}$mangledName"
520+
return "${prefix}${accessor.receiver.simpleName.asString().capitalize()}$inlineSuffix$mangledName"
517521
}
518522

519523
// TODO: handle library symbols
@@ -525,10 +529,14 @@ class ResolverAAImpl(
525529
}?.let {
526530
return it.name
527531
}
532+
val inlineSuffix = when (declaration) {
533+
is KSFunctionDeclarationImpl -> declaration.ktFunctionSymbol.inlineSuffix
534+
else -> ""
535+
}
528536
val mangledName = if (declaration.modifiers.contains(Modifier.INTERNAL)) {
529537
"\$${ktModule.name}"
530538
} else ""
531-
return declaration.simpleName.asString() + mangledName
539+
return declaration.simpleName.asString() + inlineSuffix + mangledName
532540
}
533541

534542
override fun getKSNameFromString(name: String): KSName {

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt

+56
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ import org.jetbrains.kotlin.analysis.api.symbols.*
5555
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaDeclarationContainerSymbol
5656
import org.jetbrains.kotlin.analysis.api.types.*
5757
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
58+
import org.jetbrains.kotlin.codegen.state.InfoForMangling
59+
import org.jetbrains.kotlin.codegen.state.collectFunctionSignatureForManglingSuffix
60+
import org.jetbrains.kotlin.codegen.state.md5base64
5861
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
5962
import org.jetbrains.kotlin.fir.declarations.getTargetType
6063
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
@@ -923,3 +926,56 @@ fun <T : KaSymbol?> T.tryResolveToTypePhase(): T {
923926
(this as? KaFirSymbol<*>)?.firSymbol?.lazyResolveToPhase(FirResolvePhase.TYPES)
924927
return this
925928
}
929+
930+
private val KaType.upperBoundIfFlexible: KaType
931+
get() = (this as? KaFlexibleType)?.upperBound ?: this
932+
933+
private fun KaType.requiresMangling(): Boolean = (symbol as? KaNamedClassSymbol)?.isInline ?: false
934+
935+
private fun KaType.asInfoForMangling(): InfoForMangling? {
936+
val upperBound = upperBoundIfFlexible
937+
val fqName = upperBound.symbol?.classId?.asSingleFqName()?.toUnsafe() ?: return null
938+
val isValue = upperBound.requiresMangling()
939+
val isNullable = upperBound.nullability.isNullable
940+
return InfoForMangling(fqName = fqName, isValue = isValue, isNullable = isNullable)
941+
}
942+
943+
private fun mangleInlineSuffix(
944+
parameters: List<KaType>,
945+
returnType: KaType?,
946+
shouldMangleReturnType: Boolean
947+
): String {
948+
val signature = collectFunctionSignatureForManglingSuffix(
949+
false,
950+
parameters.any { it.requiresMangling() },
951+
parameters.map { it.asInfoForMangling() },
952+
if (shouldMangleReturnType) returnType?.asInfoForMangling() else null
953+
) ?: return ""
954+
return "-${md5base64(signature)}"
955+
}
956+
957+
private val KaSymbol.isKotlin: Boolean
958+
get() = when (origin) {
959+
KaSymbolOrigin.SOURCE, KaSymbolOrigin.LIBRARY -> true
960+
else -> false
961+
}
962+
963+
internal val KaFunctionSymbol.inlineSuffix: String
964+
get() = mangleInlineSuffix(
965+
valueParameters.map { it.returnType },
966+
returnType,
967+
analyze {
968+
returnType.requiresMangling() && isKotlin && this@inlineSuffix.containingSymbol is KaClassSymbol
969+
}
970+
)
971+
972+
internal val KaPropertyAccessorSymbol.inlineSuffix: String
973+
get() = when (this) {
974+
is KaPropertyGetterSymbol ->
975+
mangleInlineSuffix(
976+
emptyList(),
977+
returnType,
978+
returnType.requiresMangling() && isKotlin
979+
)
980+
is KaPropertySetterSymbol -> mangleInlineSuffix(listOf(parameter.returnType), null, false)
981+
}

0 commit comments

Comments
 (0)