[Commonizer] Introduce CirProvided.ExportedForwardDeclarationClass
To represent classifiers that are actually exported forward declarations
This commit is contained in:
+4
-4
@@ -19,7 +19,7 @@ object CirFictitiousFunctionClassifiers : CirProvidedClassifiers {
|
|||||||
private val FUNCTION_PREFIXES = arrayOf("Function", "SuspendFunction")
|
private val FUNCTION_PREFIXES = arrayOf("Function", "SuspendFunction")
|
||||||
private val PACKAGE_NAME = CirPackageName.create("kotlin")
|
private val PACKAGE_NAME = CirPackageName.create("kotlin")
|
||||||
|
|
||||||
private val classifiers: Map<CirEntityId, CirProvided.Class> = THashMap<CirEntityId, CirProvided.Class>().apply {
|
private val classifiers: Map<CirEntityId, CirProvided.RegularClass> = THashMap<CirEntityId, CirProvided.RegularClass>().apply {
|
||||||
(MIN_ARITY..MAX_ARITY).forEach { arity ->
|
(MIN_ARITY..MAX_ARITY).forEach { arity ->
|
||||||
FUNCTION_PREFIXES.forEach { prefix ->
|
FUNCTION_PREFIXES.forEach { prefix ->
|
||||||
buildFictitiousFunctionClass(prefix, arity, this::set)
|
buildFictitiousFunctionClass(prefix, arity, this::set)
|
||||||
@@ -28,9 +28,9 @@ object CirFictitiousFunctionClassifiers : CirProvidedClassifiers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun hasClassifier(classifierId: CirEntityId) = classifierId in classifiers
|
override fun hasClassifier(classifierId: CirEntityId) = classifierId in classifiers
|
||||||
override fun classifier(classifierId: CirEntityId): CirProvided.Class? = classifiers[classifierId]
|
override fun classifier(classifierId: CirEntityId): CirProvided.RegularClass? = classifiers[classifierId]
|
||||||
|
|
||||||
private inline fun buildFictitiousFunctionClass(prefix: String, arity: Int, consumer: (CirEntityId, CirProvided.Class) -> Unit) {
|
private inline fun buildFictitiousFunctionClass(prefix: String, arity: Int, consumer: (CirEntityId, CirProvided.RegularClass) -> Unit) {
|
||||||
val typeParameters = List(arity + 1) { index ->
|
val typeParameters = List(arity + 1) { index ->
|
||||||
CirProvided.TypeParameter(
|
CirProvided.TypeParameter(
|
||||||
index = index,
|
index = index,
|
||||||
@@ -39,7 +39,7 @@ object CirFictitiousFunctionClassifiers : CirProvidedClassifiers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val classId = CirEntityId.create(PACKAGE_NAME, CirName.create("$prefix$arity"))
|
val classId = CirEntityId.create(PACKAGE_NAME, CirName.create("$prefix$arity"))
|
||||||
val clazz = CirProvided.Class(typeParameters, Visibilities.Public)
|
val clazz = CirProvided.RegularClass(typeParameters, Visibilities.Public)
|
||||||
|
|
||||||
consumer(classId, clazz)
|
consumer(classId, clazz)
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-3
@@ -5,9 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
|
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
|
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderKotlinNativeSyntheticPackages
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
|
|
||||||
/** A set of classes and type aliases provided by libraries (either the libraries to commonize, or their dependency libraries)/ */
|
/** A set of classes and type aliases provided by libraries (either the libraries to commonize, or their dependency libraries)/ */
|
||||||
@@ -59,10 +61,23 @@ object CirProvided {
|
|||||||
val typeParameters: List<TypeParameter>
|
val typeParameters: List<TypeParameter>
|
||||||
}
|
}
|
||||||
|
|
||||||
data class Class(
|
sealed interface Class : Classifier {
|
||||||
override val typeParameters: List<TypeParameter>,
|
|
||||||
val visibility: Visibility
|
val visibility: Visibility
|
||||||
) : Classifier
|
}
|
||||||
|
|
||||||
|
data class RegularClass(
|
||||||
|
override val typeParameters: List<TypeParameter>,
|
||||||
|
override val visibility: Visibility
|
||||||
|
) : Class
|
||||||
|
|
||||||
|
data class ExportedForwardDeclarationClass(val syntheticClassId: CirEntityId) : Class {
|
||||||
|
init {
|
||||||
|
check(syntheticClassId.packageName.isUnderKotlinNativeSyntheticPackages)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val typeParameters: List<TypeParameter> get() = emptyList()
|
||||||
|
override val visibility: Visibility get() = Visibilities.Public
|
||||||
|
}
|
||||||
|
|
||||||
data class TypeAlias(
|
data class TypeAlias(
|
||||||
override val typeParameters: List<TypeParameter>,
|
override val typeParameters: List<TypeParameter>,
|
||||||
|
|||||||
+25
-2
@@ -9,6 +9,7 @@ import com.intellij.util.containers.FactoryMap
|
|||||||
import gnu.trove.THashMap
|
import gnu.trove.THashMap
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
|
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.CInteropModuleAttributes
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPackageName
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPackageName
|
||||||
@@ -47,9 +48,10 @@ internal class CirProvidedClassifiersByModules private constructor(
|
|||||||
var hasForwardDeclarations = false
|
var hasForwardDeclarations = false
|
||||||
|
|
||||||
modulesProvider.loadModuleInfos().forEach { moduleInfo ->
|
modulesProvider.loadModuleInfos().forEach { moduleInfo ->
|
||||||
if (moduleInfo.cInteropAttributes != null) {
|
moduleInfo.cInteropAttributes?.let { cInteropAttributes ->
|
||||||
// this is a C-interop module
|
// this is a C-interop module
|
||||||
hasForwardDeclarations = true
|
hasForwardDeclarations = true
|
||||||
|
readExportedForwardDeclarations(cInteropAttributes, classifiers::set)
|
||||||
}
|
}
|
||||||
|
|
||||||
val metadata = modulesProvider.loadModuleMetadata(moduleInfo.name)
|
val metadata = modulesProvider.loadModuleMetadata(moduleInfo.name)
|
||||||
@@ -62,7 +64,28 @@ internal class CirProvidedClassifiersByModules private constructor(
|
|||||||
return CirProvidedClassifiersByModules(hasForwardDeclarations, classifiers)
|
return CirProvidedClassifiersByModules(hasForwardDeclarations, classifiers)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val FALLBACK_FORWARD_DECLARATION_CLASS = CirProvided.Class(emptyList(), Visibilities.Public)
|
private val FALLBACK_FORWARD_DECLARATION_CLASS = CirProvided.RegularClass(emptyList(), Visibilities.Public)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun readExportedForwardDeclarations(
|
||||||
|
cInteropAttributes: CInteropModuleAttributes,
|
||||||
|
consumer: (CirEntityId, CirProvided.Classifier) -> Unit
|
||||||
|
) {
|
||||||
|
val exportedForwardDeclarations = cInteropAttributes.exportedForwardDeclarations
|
||||||
|
if (exportedForwardDeclarations.isEmpty()) return
|
||||||
|
|
||||||
|
val mainPackageName = CirPackageName.create(cInteropAttributes.mainPackage)
|
||||||
|
|
||||||
|
exportedForwardDeclarations.forEach { classFqName ->
|
||||||
|
// Class has synthetic package FQ name (cnames/objcnames). Need to transfer it to the main package.
|
||||||
|
val syntheticPackageName = CirPackageName.create(classFqName.substringBeforeLast('.', missingDelimiterValue = ""))
|
||||||
|
val className = CirName.create(classFqName.substringAfterLast('.'))
|
||||||
|
|
||||||
|
val syntheticClassId = CirEntityId.create(syntheticPackageName, className)
|
||||||
|
val aliasedClassId = CirEntityId.create(mainPackageName, className)
|
||||||
|
|
||||||
|
consumer(aliasedClassId, CirProvided.ExportedForwardDeclarationClass(syntheticClassId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -27,7 +27,7 @@ object CirDeserializers {
|
|||||||
|
|
||||||
private fun annotation(source: KmAnnotation, typeResolver: CirTypeResolver): CirAnnotation {
|
private fun annotation(source: KmAnnotation, typeResolver: CirTypeResolver): CirAnnotation {
|
||||||
val classId = CirEntityId.create(source.className)
|
val classId = CirEntityId.create(source.className)
|
||||||
val clazz: CirProvided.Class = typeResolver.resolveClassifier(classId)
|
val clazz: CirProvided.RegularClass = typeResolver.resolveClassifier(classId)
|
||||||
|
|
||||||
val type = CirClassType.createInterned(
|
val type = CirClassType.createInterned(
|
||||||
classId = classId,
|
classId = classId,
|
||||||
@@ -352,7 +352,7 @@ object CirDeserializers {
|
|||||||
val clazz: CirProvided.Class = typeResolver.resolveClassifier(classId)
|
val clazz: CirProvided.Class = typeResolver.resolveClassifier(classId)
|
||||||
|
|
||||||
CirClassType.createInterned(
|
CirClassType.createInterned(
|
||||||
classId = classId,
|
classId = (clazz as? CirProvided.ExportedForwardDeclarationClass)?.syntheticClassId ?: classId,
|
||||||
outerType = outerType,
|
outerType = outerType,
|
||||||
visibility = clazz.visibility,
|
visibility = clazz.visibility,
|
||||||
arguments = arguments(source.arguments, typeResolver),
|
arguments = arguments(source.arguments, typeResolver),
|
||||||
|
|||||||
Reference in New Issue
Block a user