[Commonizer] Remove computing signatures from metadata
This commit is contained in:
committed by
Space
parent
f3ff9814a8
commit
8acfeb3e17
@@ -5,10 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.commonizer.utils
|
package org.jetbrains.kotlin.commonizer.utils
|
||||||
|
|
||||||
import gnu.trove.TIntHashSet
|
|
||||||
import kotlinx.metadata.*
|
import kotlinx.metadata.*
|
||||||
import org.jetbrains.kotlin.commonizer.cir.CirTypeSignature
|
|
||||||
import org.jetbrains.kotlin.commonizer.metadata.CirTypeParameterResolver
|
|
||||||
|
|
||||||
internal inline val KmTypeParameter.filteredUpperBounds: List<KmType>
|
internal inline val KmTypeParameter.filteredUpperBounds: List<KmType>
|
||||||
get() = upperBounds.takeUnless { it.singleOrNull()?.isNullableAny == true } ?: emptyList()
|
get() = upperBounds.takeUnless { it.singleOrNull()?.isNullableAny == true } ?: emptyList()
|
||||||
@@ -23,84 +20,5 @@ private inline val KmType.isAny: Boolean
|
|||||||
get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && !Flag.Type.IS_NULLABLE(flags)
|
get() = (classifier as? KmClassifier.Class)?.name == ANY_CLASS_FULL_NAME && !Flag.Type.IS_NULLABLE(flags)
|
||||||
|
|
||||||
|
|
||||||
internal fun KmType.computeSignature(typeParameterResolver: CirTypeParameterResolver): CirTypeSignature {
|
|
||||||
// use of interner saves up to 95% of duplicates
|
|
||||||
return typeSignatureInterner.intern(
|
|
||||||
buildString {
|
|
||||||
buildTypeSignature(
|
|
||||||
type = this@computeSignature,
|
|
||||||
typeParameterResolver = typeParameterResolver,
|
|
||||||
exploredTypeParameters = TIntHashSet()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun StringBuilder.buildTypeSignature(
|
|
||||||
type: KmType,
|
|
||||||
typeParameterResolver: CirTypeParameterResolver,
|
|
||||||
exploredTypeParameters: TIntHashSet
|
|
||||||
) {
|
|
||||||
when (val classifier = type.classifier) {
|
|
||||||
is KmClassifier.TypeParameter -> {
|
|
||||||
// N.B this is type parameter type
|
|
||||||
val typeParameter = typeParameterResolver.resolveTypeParameter(classifier.id)
|
|
||||||
?: error("Unresolved type parameter #${classifier.id} in type ${type.classifier}")
|
|
||||||
|
|
||||||
append(typeParameter.name)
|
|
||||||
|
|
||||||
if (exploredTypeParameters.add(classifier.id)) { // print upper bounds once the first time when type parameter type is met
|
|
||||||
append(':').append('[')
|
|
||||||
typeParameter.filteredUpperBounds.forEachIndexed { index, upperBoundType ->
|
|
||||||
if (index > 0)
|
|
||||||
append(',')
|
|
||||||
buildTypeSignature(upperBoundType, typeParameterResolver, exploredTypeParameters)
|
|
||||||
}
|
|
||||||
append(']')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Flag.Type.IS_NULLABLE(type.flags))
|
|
||||||
append('?')
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
val abbreviation = type.abbreviatedType ?: type
|
|
||||||
|
|
||||||
val classifierId = when (val abbreviationClassifier = abbreviation.classifier) {
|
|
||||||
is KmClassifier.Class -> abbreviationClassifier.name
|
|
||||||
is KmClassifier.TypeAlias -> abbreviationClassifier.name
|
|
||||||
else -> error("Unexpected classifier type for non-type-parameter type: ${type.classifier}")
|
|
||||||
}
|
|
||||||
append(classifierId)
|
|
||||||
|
|
||||||
val arguments = abbreviation.arguments
|
|
||||||
if (arguments.isNotEmpty()) {
|
|
||||||
append('<')
|
|
||||||
arguments.forEachIndexed { index, argument ->
|
|
||||||
if (index > 0)
|
|
||||||
append(',')
|
|
||||||
|
|
||||||
val variance = argument.variance
|
|
||||||
val argumentType = argument.type
|
|
||||||
|
|
||||||
if (variance == null || argumentType == null)
|
|
||||||
append('*')
|
|
||||||
else {
|
|
||||||
when (variance) {
|
|
||||||
KmVariance.INVARIANT -> Unit
|
|
||||||
KmVariance.IN -> append("in ")
|
|
||||||
KmVariance.OUT -> append("out ")
|
|
||||||
}
|
|
||||||
buildTypeSignature(argumentType, typeParameterResolver, exploredTypeParameters)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
append('>')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Flag.Type.IS_NULLABLE(abbreviation.flags))
|
|
||||||
append('?')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// dedicated to hold unique entries of "signature"
|
|
||||||
private val typeSignatureInterner = Interner<CirTypeSignature>()
|
|
||||||
|
|||||||
Reference in New Issue
Block a user