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