[Commonizer] Fix calculation of type parameter IDs for nested classes and their members

This commit is contained in:
Dmitriy Dolovov
2021-01-31 22:09:53 +03:00
parent 55c37183d9
commit a4438ad64f
2 changed files with 11 additions and 11 deletions
@@ -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
}
@@ -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
)
}