[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.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
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-7
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user