[Commonizer] Fix calculation of type parameter IDs for nested classes and their members
This commit is contained in:
+7
-4
@@ -11,9 +11,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.*
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassTypeImpl
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirTypeAliasTypeImpl
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.*
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.declarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.extractExpandedType
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.*
|
||||
|
||||
@@ -118,6 +115,7 @@ object CirTypeFactory {
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
fun createTypeParameterType(
|
||||
index: Int,
|
||||
isMarkedNullable: Boolean
|
||||
@@ -197,7 +195,12 @@ object CirTypeFactory {
|
||||
var index = index
|
||||
var parent = containingDeclaration
|
||||
|
||||
while ((parent as? ClassifierDescriptorWithTypeParameters)?.isInner != false) {
|
||||
if (parent is CallableMemberDescriptor) {
|
||||
parent = parent.containingDeclaration as? ClassifierDescriptorWithTypeParameters ?: return index
|
||||
index += parent.declaredTypeParameters.size
|
||||
}
|
||||
|
||||
while (parent is ClassifierDescriptorWithTypeParameters) {
|
||||
parent = parent.containingDeclaration as? ClassifierDescriptorWithTypeParameters ?: break
|
||||
index += parent.declaredTypeParameters.size
|
||||
}
|
||||
|
||||
+4
-7
@@ -148,9 +148,7 @@ private class MetadataBuildingVisitor(private val statsCollector: StatsCollector
|
||||
val fullClassName = classContext.currentPath.toString()
|
||||
|
||||
val directNestedClasses: Collection<KmClass> = node.classes.mapNotNull { (nestedClassName, nestedClassNode) ->
|
||||
val isInnerClass = classContext.get<CirClass>(nestedClassNode)?.isInner ?: return@mapNotNull null
|
||||
val outerClassTypeParametersCount = if (isInnerClass) classTypeParametersCount else 0
|
||||
val nestedClassContext = classContext.classifierContext(nestedClassName, isInnerClass, outerClassTypeParametersCount)
|
||||
val nestedClassContext = classContext.classifierContext(nestedClassName, classTypeParametersCount)
|
||||
val nestedClass: KmClass = nestedClassNode.accept(this, nestedClassContext)?.cast() ?: return@mapNotNull null
|
||||
classConsumer.consume(nestedClass)
|
||||
statsCollector?.logClass(nestedClass, nestedClassContext)
|
||||
@@ -305,6 +303,7 @@ internal data class MetadataBuildingVisitorContext(
|
||||
override fun toString() = ""
|
||||
}
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
class Module(val moduleName: Name) : Path() {
|
||||
override fun toString() = moduleName.strip()
|
||||
}
|
||||
@@ -355,17 +354,15 @@ internal data class MetadataBuildingVisitorContext(
|
||||
|
||||
fun classifierContext(
|
||||
classifierName: Name,
|
||||
isInner: Boolean = false,
|
||||
outerClassTypeParametersCount: Int = 0
|
||||
): MetadataBuildingVisitorContext {
|
||||
val newPath = when (currentPath) {
|
||||
is Path.Package -> {
|
||||
check(!isInner)
|
||||
check(outerClassTypeParametersCount == 0)
|
||||
currentPath.nestedClassifier(classifierName)
|
||||
}
|
||||
is Path.Classifier -> {
|
||||
check((isInner && outerClassTypeParametersCount >= 0) || (!isInner && outerClassTypeParametersCount == 0))
|
||||
check(outerClassTypeParametersCount >= 0)
|
||||
currentPath.nestedClassifier(classifierName)
|
||||
}
|
||||
else -> error("Illegal state")
|
||||
@@ -375,7 +372,7 @@ internal data class MetadataBuildingVisitorContext(
|
||||
targetIndex = targetIndex,
|
||||
target = target,
|
||||
isCommon = isCommon,
|
||||
typeParameterIndexOffset = if (isInner) typeParameterIndexOffset + outerClassTypeParametersCount else 0,
|
||||
typeParameterIndexOffset = typeParameterIndexOffset + outerClassTypeParametersCount,
|
||||
currentPath = newPath
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user