diff options
author | Dmitriy Dolovov <Dmitriy.Dolovov@jetbrains.com> | 2020-07-01 00:13:00 +0700 |
---|---|---|
committer | Dmitriy Dolovov <Dmitriy.Dolovov@jetbrains.com> | 2020-07-10 19:14:28 +0700 |
commit | 7620dffee402a62e520a0ad27662cc0ec526812a (patch) | |
tree | 95f7127220b44b15dbb641967d0d9e6dd043f1b7 | |
parent | 2068d079088f476cc8850ef54e26b8bdd10c68d9 (diff) | |
download | kotlin-7620dffee402a62e520a0ad27662cc0ec526812a.tar.gz |
[Commonizer] Use ClassId instead of FqName for addressing classes and TAs
(cherry picked from commit ffd0c696986504e05c9c63ff0bad08afe4a35101)
39 files changed, 411 insertions, 264 deletions
diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedAnnotationDescriptor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedAnnotationDescriptor.kt index aacb3cdc1e3..85cfdc7bdce 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedAnnotationDescriptor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedAnnotationDescriptor.kt @@ -5,13 +5,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind.ANNOTATION_CLASS import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation import org.jetbrains.kotlin.descriptors.commonizer.utils.concat -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.constants.AnnotationValue import org.jetbrains.kotlin.storage.getValue @@ -19,14 +16,8 @@ class CommonizedAnnotationDescriptor( targetComponents: TargetDeclarationsBuilderComponents, cirAnnotation: CirAnnotation ) : AnnotationDescriptor { - override val fqName: FqName = cirAnnotation.fqName - override val type by targetComponents.storageManager.createLazyValue { - val annotationClass = findClassOrTypeAlias(targetComponents, fqName) - check(annotationClass is ClassDescriptor && annotationClass.kind == ANNOTATION_CLASS) { - "Not an annotation class: ${annotationClass::class.java}, $annotationClass" - } - annotationClass.defaultType + cirAnnotation.type.buildType(targetComponents, TypeParameterResolver.EMPTY) } override val allValueArguments by targetComponents.storageManager.createLazyValue { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt index 00ac861a6f1..37e86ce2359 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt @@ -80,7 +80,7 @@ internal class DeclarationsBuilderVisitor2( } override fun visitClassNode(node: CirClassNode, data: List<DeclarationDescriptor?>): List<DeclarationDescriptor?> { - val classes = components.cache.getCachedClasses(node.fqName) + val classes = components.cache.getCachedClasses(node.classId) // build class constructors: val allConstructorsByTargets = Array<MutableList<CommonizedClassConstructorDescriptor>>(node.dimension) { ArrayList() } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt index 0a2379e81b7..337b42e06b5 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt @@ -8,13 +8,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.commonizer.cir.* -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind.Companion.areCompatible -import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.cirSimpleTypeKind import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderStandardKotlinPackages -import org.jetbrains.kotlin.descriptors.commonizer.utils.resolveClassOrTypeAliasByFqName +import org.jetbrains.kotlin.descriptors.commonizer.utils.resolveClassOrTypeAlias import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl -import org.jetbrains.kotlin.incremental.components.NoLookupLocation -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.types.* @@ -106,17 +103,26 @@ internal fun CirSimpleType.buildType( targetComponents: TargetDeclarationsBuilderComponents, typeParameterResolver: TypeParameterResolver ): SimpleType { - val classifier: ClassifierDescriptor = when (kind) { - - CirSimpleTypeKind.TYPE_PARAMETER -> { - typeParameterResolver.resolve(fqName.shortName()) - ?: error("Type parameter $fqName not found in ${typeParameterResolver::class.java}, $typeParameterResolver for ${targetComponents.target}") + val classifier: ClassifierDescriptor = when (val classifierId = classifierId) { + is CirClassifierId.Class -> { + findClassOrTypeAlias(targetComponents, classifierId.classId).checkClassifierType<ClassDescriptor>() } - - CirSimpleTypeKind.CLASS, CirSimpleTypeKind.TYPE_ALIAS -> { - val classOrTypeAlias = findClassOrTypeAlias(targetComponents, fqName) - checkClassifier(classOrTypeAlias, kind, fqName.isUnderStandardKotlinPackages || !targetComponents.isCommon) - classOrTypeAlias + is CirClassifierId.TypeAlias -> { + val classId = classifierId.classId + val classOrTypeAlias: ClassifierDescriptorWithTypeParameters = findClassOrTypeAlias(targetComponents, classId) + + if (classId.packageFqName.isUnderStandardKotlinPackages || !targetComponents.isCommon) { + // classifier type could be only type alias + classOrTypeAlias.checkClassifierType<TypeAliasDescriptor>() + } else { + // classifier could be class or type alias + classOrTypeAlias + } + } + is CirClassifierId.TypeParameter -> { + val name = classifierId.name + typeParameterResolver.resolve(name) + ?: error("Type parameter $name not found in ${typeParameterResolver::class.java}, $typeParameterResolver for ${targetComponents.target}") } } @@ -141,36 +147,27 @@ internal fun CirSimpleType.buildType( internal fun findClassOrTypeAlias( targetComponents: TargetDeclarationsBuilderComponents, - fqName: FqName + classId: ClassId ): ClassifierDescriptorWithTypeParameters = when { - fqName.isUnderStandardKotlinPackages -> { + classId.packageFqName.isUnderStandardKotlinPackages -> { // look up for classifier in built-ins module: val builtInsModule = targetComponents.builtIns.builtInsModule // TODO: this works fine for Native as far as built-ins module contains full Native stdlib, but this is not enough for JVM and JS - builtInsModule.resolveClassOrTypeAliasByFqName(fqName, NoLookupLocation.FOR_ALREADY_TRACKED) - ?: error("Classifier $fqName not found in built-ins module $builtInsModule for ${targetComponents.target}") + builtInsModule.resolveClassOrTypeAlias(classId) + ?: error("Classifier ${classId.asString()} not found in built-ins module $builtInsModule for ${targetComponents.target}") } else -> { // otherwise, find the appropriate user classifier: - targetComponents.findAppropriateClassOrTypeAlias(fqName) - ?: error("Classifier $fqName not found in created descriptors cache for ${targetComponents.target}") + targetComponents.findAppropriateClassOrTypeAlias(classId) + ?: error("Classifier ${classId.asString()} not found in created descriptors cache for ${targetComponents.target}") } } -private fun checkClassifier(classifier: ClassifierDescriptor, kind: CirSimpleTypeKind, strict: Boolean) { - val classifierKind = classifier.cirSimpleTypeKind - - if (strict) { - check(kind == classifierKind) { - "Mismatched classifier kinds.\nFound: $classifierKind, ${classifier::class.java}, $classifier\nShould be: $kind" - } - } else { - check(areCompatible(classifierKind, kind)) { - "Incompatible classifier kinds.\nExpect: $classifierKind, ${classifier::class.java}, $classifier\nActual: $kind" - } - } +private inline fun <reified T : ClassifierDescriptorWithTypeParameters> ClassifierDescriptorWithTypeParameters.checkClassifierType(): T { + check(this is T) { "Mismatched classifier kinds.\nFound: ${this::class.java}, $this\nShould be: ${T::class.java}" } + return this } private fun CirTypeProjection.buildArgument( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt index 70d0182d198..dfaebf7dea2 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassConstructo import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirNode.Companion.indexOfCommon import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId internal fun CirClassNode.buildDescriptors( components: GlobalDeclarationsBuilderComponents, @@ -26,10 +26,10 @@ internal fun CirClassNode.buildDescriptors( val markAsActual = commonClass != null && commonClass.kind != ClassKind.ENUM_ENTRY targetDeclarations.forEachIndexed { index, clazz -> - clazz?.buildDescriptor(components, output, index, containingDeclarations, fqName, isActual = markAsActual) + clazz?.buildDescriptor(components, output, index, containingDeclarations, classId, isActual = markAsActual) } - commonClass?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, fqName, isExpect = true) + commonClass?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, classId, isExpect = true) // log stats components.statsCollector?.logStats(output) @@ -40,7 +40,7 @@ internal fun CirClass.buildDescriptor( output: CommonizedGroup<in ClassifierDescriptorWithTypeParameters>, index: Int, containingDeclarations: List<DeclarationDescriptor?>, - fqName: FqName, + classId: ClassId, isExpect: Boolean = false, isActual: Boolean = false ) { @@ -63,12 +63,12 @@ internal fun CirClass.buildDescriptor( isExpect = isExpect, isActual = isActual, cirDeclaredTypeParameters = typeParameters, - companionObjectName = companion?.shortName(), + companionObjectName = companion, cirSupertypes = supertypes ) // cache created class descriptor: - components.cache.cache(fqName, index, classDescriptor) + components.cache.cache(classId, index, classDescriptor) output[index] = classDescriptor } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt index f596ba470fd..e58d289fe87 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt @@ -13,12 +13,12 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirNode.Companion. import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirNode.Companion.indexOfCommon import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.stats.StatsCollector -import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup +import org.jetbrains.kotlin.descriptors.commonizer.utils.* import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap import org.jetbrains.kotlin.descriptors.commonizer.utils.createKotlinNativeForwardDeclarationsModule import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderKotlinNativeSyntheticPackages import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.StorageManager @@ -33,8 +33,8 @@ class DeclarationsBuilderCache(private val dimension: Int) { private val modules = CommonizedGroup<List<ModuleDescriptorImpl>>(dimension) private val packageFragments = CommonizedGroupMap<Pair<Name, FqName>, CommonizedPackageFragmentDescriptor>(dimension) - private val classes = CommonizedGroupMap<FqName, CommonizedClassDescriptor>(dimension) - private val typeAliases = CommonizedGroupMap<FqName, CommonizedTypeAliasDescriptor>(dimension) + private val classes = CommonizedGroupMap<ClassId, CommonizedClassDescriptor>(dimension) + private val typeAliases = CommonizedGroupMap<ClassId, CommonizedTypeAliasDescriptor>(dimension) private val forwardDeclarationsModules = CommonizedGroup<ModuleDescriptorImpl>(dimension) private val allModulesWithDependencies = CommonizedGroup<List<ModuleDescriptor>>(dimension) @@ -42,15 +42,15 @@ class DeclarationsBuilderCache(private val dimension: Int) { fun getCachedPackageFragments(moduleName: Name, packageFqName: FqName): List<CommonizedPackageFragmentDescriptor?> = packageFragments.getOrFail(moduleName to packageFqName) - fun getCachedClasses(fqName: FqName): List<CommonizedClassDescriptor?> = classes.getOrFail(fqName) + fun getCachedClasses(classId: ClassId): List<CommonizedClassDescriptor?> = classes.getOrFail(classId) - fun getCachedClassifier(fqName: FqName, index: Int): ClassifierDescriptorWithTypeParameters? { + fun getCachedClassifier(classId: ClassId, index: Int): ClassifierDescriptorWithTypeParameters? { // first, look up for class - val classes: CommonizedGroup<CommonizedClassDescriptor>? = classes.getOrNull(fqName) + val classes: CommonizedGroup<CommonizedClassDescriptor>? = classes.getOrNull(classId) classes?.get(index)?.let { return it } // then, for type alias - val typeAliases: CommonizedGroup<CommonizedTypeAliasDescriptor>? = typeAliases.getOrNull(fqName) + val typeAliases: CommonizedGroup<CommonizedTypeAliasDescriptor>? = typeAliases.getOrNull(classId) typeAliases?.get(index)?.let { return it } val indexOfCommon = dimension - 1 @@ -73,12 +73,12 @@ class DeclarationsBuilderCache(private val dimension: Int) { packageFragments[moduleName to packageFqName][index] = descriptor } - fun cache(fqName: FqName, index: Int, descriptor: CommonizedClassDescriptor) { - classes[fqName][index] = descriptor + fun cache(classId: ClassId, index: Int, descriptor: CommonizedClassDescriptor) { + classes[classId][index] = descriptor } - fun cache(fqName: FqName, index: Int, descriptor: CommonizedTypeAliasDescriptor) { - typeAliases[fqName][index] = descriptor + fun cache(classId: ClassId, index: Int, descriptor: CommonizedTypeAliasDescriptor) { + typeAliases[classId][index] = descriptor } fun getOrPutForwardDeclarationsModule(index: Int, computable: () -> ModuleDescriptorImpl): ModuleDescriptorImpl { @@ -136,31 +136,21 @@ class TargetDeclarationsBuilderComponents( private val cache: DeclarationsBuilderCache ) { // N.B. this function may create new classifiers for types from Kotlin/Native forward declarations packages - fun findAppropriateClassOrTypeAlias(fqName: FqName): ClassifierDescriptorWithTypeParameters? { + fun findAppropriateClassOrTypeAlias(classId: ClassId): ClassifierDescriptorWithTypeParameters? { - return if (fqName.isUnderKotlinNativeSyntheticPackages) { + return if (classId.packageFqName.isUnderKotlinNativeSyntheticPackages) { // that's a synthetic Kotlin/Native classifier that was exported as forward declaration in one or more modules, // but did not match any existing class or typealias - val module = cache.getOrPutForwardDeclarationsModule(index) { + cache.getOrPutForwardDeclarationsModule(index) { // N.B. forward declarations module is created only on demand createKotlinNativeForwardDeclarationsModule( storageManager = storageManager, builtIns = builtIns ) - } - - // create and return new classifier - module.packageFragmentProvider - .getPackageFragments(fqName.parent()) - .single() - .getMemberScope() - .getContributedClassifier( - name = fqName.shortName(), - location = NoLookupLocation.FOR_ALREADY_TRACKED - ) as ClassifierDescriptorWithTypeParameters + }.resolveClassOrTypeAlias(classId) } else { // look up in created descriptors cache - cache.getCachedClassifier(fqName, index) + cache.getCachedClassifier(classId, index) } } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt index f1fe9372ce6..185f06f766a 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeAlias import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirTypeAliasNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirNode.Companion.indexOfCommon import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId internal fun CirTypeAliasNode.buildDescriptors( components: GlobalDeclarationsBuilderComponents, @@ -29,14 +29,14 @@ internal fun CirTypeAliasNode.buildDescriptors( if (!isLiftedUp) { targetDeclarations.forEachIndexed { index, typeAlias -> - typeAlias?.buildDescriptor(components, output, index, containingDeclarations, fqName, isActual = markAsActual) + typeAlias?.buildDescriptor(components, output, index, containingDeclarations, classId, isActual = markAsActual) } } if (commonTypeAlias != null) { - commonTypeAlias.buildDescriptor(components, output, indexOfCommon, containingDeclarations, fqName) + commonTypeAlias.buildDescriptor(components, output, indexOfCommon, containingDeclarations, classId) } else if (commonClassifier != null && commonClassifier is CirClass) { - commonClassifier.buildDescriptor(components, output, indexOfCommon, containingDeclarations, fqName, isExpect = true) + commonClassifier.buildDescriptor(components, output, indexOfCommon, containingDeclarations, classId, isExpect = true) } // log stats @@ -48,7 +48,7 @@ private fun CirTypeAlias.buildDescriptor( output: CommonizedGroup<ClassifierDescriptorWithTypeParameters>, index: Int, containingDeclarations: List<DeclarationDescriptor?>, - fqName: FqName, + classId: ClassId, isActual: Boolean = false ) { val targetComponents = components.targetComponents[index] @@ -77,7 +77,7 @@ private fun CirTypeAlias.buildDescriptor( ) // cache created type alias descriptor: - components.cache.cache(fqName, index, typeAliasDescriptor) + components.cache.cache(classId, index, typeAliasDescriptor) output[index] = typeAliasDescriptor } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt index 69d4a6f3462..0025b1e847f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt @@ -8,7 +8,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.ConstantValue -interface CirAnnotation : CirHasFqName { +interface CirAnnotation { + val type: CirSimpleType val constantValueArguments: Map<Name, ConstantValue<*>> val annotationValueArguments: Map<Name, CirAnnotation> } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClass.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClass.kt index 7c46f0b168d..3cbf040122f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClass.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClass.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name interface CirClass : CirClassifier, CirHasModality { val kind: ClassKind - var companion: FqName? // null means no companion object + var companion: Name? // null means no companion object val isCompanion: Boolean val isData: Boolean val isInline: Boolean diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClassifierId.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClassifierId.kt new file mode 100644 index 00000000000..c9a5992c755 --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirClassifierId.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.descriptors.commonizer.cir + +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name + +sealed class CirClassifierId { + interface ClassOrTypeAlias { + val classId: ClassId + } + + data class Class(override val classId: ClassId) : ClassOrTypeAlias, CirClassifierId() + data class TypeAlias(override val classId: ClassId) : ClassOrTypeAlias, CirClassifierId() + data class TypeParameter(val name: Name) : CirClassifierId() +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt index c6af9a94e3c..4ffc1b716e1 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind.CLASS -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind.TYPE_ALIAS import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory import org.jetbrains.kotlin.types.AbbreviatedType import org.jetbrains.kotlin.types.Variance @@ -26,24 +24,11 @@ sealed class CirType { * * Note: Annotations at simple types are not preserved. After commonization all annotations assigned to types will be lost. */ -abstract class CirSimpleType : CirType(), CirHasVisibility, CirHasFqName { - abstract val kind: CirSimpleTypeKind +abstract class CirSimpleType : CirType(), CirHasVisibility { + abstract val classifierId: CirClassifierId abstract val arguments: List<CirTypeProjection> abstract val isMarkedNullable: Boolean abstract val isDefinitelyNotNullType: Boolean - - inline val isClassOrTypeAlias: Boolean get() = (kind == CLASS || kind == TYPE_ALIAS) -} - -enum class CirSimpleTypeKind { - CLASS, - TYPE_ALIAS, - TYPE_PARAMETER; - - companion object { - fun areCompatible(expect: CirSimpleTypeKind, actual: CirSimpleTypeKind): Boolean = - expect == actual || (expect == CLASS && actual == TYPE_ALIAS) - } } data class CirTypeProjection(val projectionKind: Variance, val isStarProjection: Boolean, val type: CirType) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt index acfec12f18e..226fd087fe6 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt @@ -8,11 +8,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory import gnu.trove.THashMap import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleType import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirAnnotationImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner import org.jetbrains.kotlin.descriptors.commonizer.utils.checkConstantSupportedInCommonization import org.jetbrains.kotlin.descriptors.commonizer.utils.intern -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.AnnotationValue import org.jetbrains.kotlin.resolve.constants.ConstantValue @@ -21,11 +21,11 @@ object CirAnnotationFactory { private val interner = Interner<CirAnnotation>() fun create(source: AnnotationDescriptor): CirAnnotation { - val fqName: FqName = source.fqName?.intern() ?: error("Annotation with no FQ name: ${source::class.java}, $source") + val type = CirTypeFactory.create(source.type) as CirSimpleType val allValueArguments: Map<Name, ConstantValue<*>> = source.allValueArguments if (allValueArguments.isEmpty()) - return create(fqName = fqName, constantValueArguments = emptyMap(), annotationValueArguments = emptyMap()) + return create(type = type, constantValueArguments = emptyMap(), annotationValueArguments = emptyMap()) val constantValueArguments: MutableMap<Name, ConstantValue<*>> = THashMap() val annotationValueArguments: MutableMap<Name, CirAnnotation> = THashMap() @@ -45,20 +45,20 @@ object CirAnnotationFactory { } return create( - fqName = fqName, + type = type, constantValueArguments = constantValueArguments, annotationValueArguments = annotationValueArguments ) } fun create( - fqName: FqName, + type: CirSimpleType, constantValueArguments: Map<Name, ConstantValue<*>>, annotationValueArguments: Map<Name, CirAnnotation> ): CirAnnotation { return interner.intern( CirAnnotationImpl( - fqName = fqName, + type = type, constantValueArguments = constantValueArguments, annotationValueArguments = annotationValueArguments ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt index cd0b9496cad..ac37c79ed86 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt @@ -15,9 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirType import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeParameter import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.intern -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe object CirClassFactory { fun create(source: ClassDescriptor): CirClass = create( @@ -27,7 +25,7 @@ object CirClassFactory { visibility = source.visibility, modality = source.modality, kind = source.kind, - companion = source.companionObjectDescriptor?.fqNameSafe?.intern(), + companion = source.companionObjectDescriptor?.name?.intern(), isCompanion = source.isCompanionObject, isData = source.isData, isInline = source.isInline, @@ -44,7 +42,7 @@ object CirClassFactory { visibility: Visibility, modality: Modality, kind: ClassKind, - companion: FqName?, + companion: Name?, isCompanion: Boolean, isData: Boolean, isInline: Boolean, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassifierIdFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassifierIdFactory.kt new file mode 100644 index 00000000000..112bb457f1c --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassifierIdFactory.kt @@ -0,0 +1,30 @@ +package org.jetbrains.kotlin.descriptors.commonizer.cir.factory + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifierId +import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern +import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name + +@Suppress("MemberVisibilityCanBePrivate") +object CirClassifierIdFactory { + private val interner = Interner<CirClassifierId>() + + fun create(source: ClassifierDescriptor): CirClassifierId { + return when (source) { + is ClassDescriptor -> createForClass(source.internedClassId) + is TypeAliasDescriptor -> createForTypeAlias(source.internedClassId) + is TypeParameterDescriptor -> createForTypeParameter(source.name.intern()) + else -> error("Unexpected classifier descriptor type: ${source::class.java}, $this") + } + } + + fun createForClass(classId: ClassId): CirClassifierId = interner.intern(CirClassifierId.Class(classId)) + fun createForTypeAlias(classId: ClassId): CirClassifierId = interner.intern(CirClassifierId.TypeAlias(classId)) + fun createForTypeParameter(name: Name): CirClassifierId = interner.intern(CirClassifierId.TypeParameter(name)) +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPackageFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPackageFactory.kt index daa68a42a41..b7b2d1898ef 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPackageFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPackageFactory.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPackage import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirPackageImpl -import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName object CirPackageFactory { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt index aa2e41a1566..5715a763ce7 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt @@ -5,13 +5,14 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.commonizer.cir.* -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind.* import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirSimpleTypeImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner import org.jetbrains.kotlin.descriptors.commonizer.utils.declarationDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameInterned import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters import org.jetbrains.kotlin.types.* @@ -29,10 +30,9 @@ object CirTypeFactory { val abbreviation: SimpleType = (source as? AbbreviatedType)?.abbreviation ?: source val classifierDescriptor: ClassifierDescriptor = abbreviation.declarationDescriptor - val simpleType = CirSimpleTypeImpl( - kind = classifierDescriptor.cirSimpleTypeKind, + return create( + classifierId = CirClassifierIdFactory.create(classifierDescriptor), visibility = (classifierDescriptor as? ClassifierDescriptorWithTypeParameters)?.visibility ?: Visibilities.UNKNOWN, - fqName = abbreviation.fqNameInterned, arguments = abbreviation.arguments.map { projection -> CirTypeProjection( projectionKind = projection.projectionKind, @@ -44,15 +44,25 @@ object CirTypeFactory { isDefinitelyNotNullType = abbreviation.isDefinitelyNotNullType, fqNameWithTypeParameters = source.fqNameWithTypeParameters ) - - return interner.intern(simpleType) } -} -val ClassifierDescriptor.cirSimpleTypeKind: CirSimpleTypeKind - get() = when (this) { - is ClassDescriptor -> CLASS - is TypeAliasDescriptor -> TYPE_ALIAS - is TypeParameterDescriptor -> TYPE_PARAMETER - else -> error("Unexpected classifier descriptor type: ${this::class.java}, $this") + fun create( + classifierId: CirClassifierId, + visibility: Visibility, + arguments: List<CirTypeProjection>, + isMarkedNullable: Boolean, + isDefinitelyNotNullType: Boolean, + fqNameWithTypeParameters: String + ): CirSimpleType { + return interner.intern( + CirSimpleTypeImpl( + classifierId = classifierId, + visibility = visibility, + arguments = arguments, + isMarkedNullable = isMarkedNullable, + isDefinitelyNotNullType = isDefinitelyNotNullType, + fqNameWithTypeParameters = fqNameWithTypeParameters + ) + ) } +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt index 6565164b389..db9bc13945d 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt @@ -6,21 +6,21 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.impl import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleType import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.ConstantValue data class CirAnnotationImpl( - override val fqName: FqName, + override val type: CirSimpleType, override val constantValueArguments: Map<Name, ConstantValue<*>>, override val annotationValueArguments: Map<Name, CirAnnotation> ) : CirAnnotation { // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode private var cachedHashCode = 0 - private fun computeHashCode() = hashCode(fqName) + private fun computeHashCode() = hashCode(type) .appendHashCode(constantValueArguments) .appendHashCode(annotationValueArguments) @@ -37,7 +37,7 @@ data class CirAnnotationImpl( if (other === this) return true return other is CirAnnotation - && fqName == other.fqName + && type == other.type && constantValueArguments == other.constantValueArguments && annotationValueArguments == other.annotationValueArguments } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassImpl.kt index 831f098c4ec..e49be905535 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassImpl.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassImpl.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass import org.jetbrains.kotlin.descriptors.commonizer.cir.CirType import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeParameter -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name data class CirClassImpl( @@ -22,7 +21,7 @@ data class CirClassImpl( override val visibility: Visibility, override val modality: Modality, override val kind: ClassKind, - override var companion: FqName?, + override var companion: Name?, override val isCompanion: Boolean, override val isData: Boolean, override val isInline: Boolean, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirSimpleTypeImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirSimpleTypeImpl.kt index faf4dd78da0..7da5d873218 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirSimpleTypeImpl.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirSimpleTypeImpl.kt @@ -6,17 +6,13 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.impl import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleType -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeProjection +import org.jetbrains.kotlin.descriptors.commonizer.cir.* import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode -import org.jetbrains.kotlin.name.FqName data class CirSimpleTypeImpl( - override val kind: CirSimpleTypeKind, + override val classifierId: CirClassifierId, override val visibility: Visibility, // visibility of the classifier descriptor - override val fqName: FqName, override val arguments: List<CirTypeProjection>, override val isMarkedNullable: Boolean, override val isDefinitelyNotNullType: Boolean, @@ -25,9 +21,8 @@ data class CirSimpleTypeImpl( // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode private var cachedHashCode = 0 - private fun computeHashCode() = hashCode(kind) + private fun computeHashCode() = hashCode(classifierId) .appendHashCode(visibility) - .appendHashCode(fqName) .appendHashCode(arguments) .appendHashCode(isMarkedNullable) .appendHashCode(isDefinitelyNotNullType) @@ -46,8 +41,7 @@ data class CirSimpleTypeImpl( other === this -> true other is CirSimpleType -> { isMarkedNullable == other.isMarkedNullable - && fqName == other.fqName - && kind == other.kind + && classifierId == other.classifierId && visibility == other.visibility && arguments == other.arguments && fqNameWithTypeParameters == other.fqNameWithTypeParameters diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/RecursionMarkers.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/RecursionMarkers.kt index a5c1c3395eb..11bc1035935 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/RecursionMarkers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/RecursionMarkers.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.impl import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifier import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRecursionMarker -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name object CirClassRecursionMarker : CirClass, CirRecursionMarker { override val annotations get() = unsupported() @@ -17,7 +17,7 @@ object CirClassRecursionMarker : CirClass, CirRecursionMarker { override val visibility get() = unsupported() override val modality get() = unsupported() override val kind get() = unsupported() - override var companion: FqName? + override var companion: Name? get() = unsupported() set(_) = unsupported() override val isCompanion get() = unsupported() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt index 34532a00e92..d600787cc5b 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt @@ -5,10 +5,16 @@ package org.jetbrains.kotlin.descriptors.commonizer.core +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifierId import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirAnnotationFactory +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassifierIdFactory +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory import org.jetbrains.kotlin.descriptors.commonizer.core.AnnotationsCommonizer.Companion.FALLBACK_MESSAGE -import org.jetbrains.kotlin.descriptors.commonizer.utils.DEPRECATED_ANNOTATION_FQN +import org.jetbrains.kotlin.descriptors.commonizer.utils.DEPRECATED_ANNOTATION_CID +import org.jetbrains.kotlin.descriptors.commonizer.utils.intern +import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -32,9 +38,13 @@ class AnnotationsCommonizer : AbstractStandardCommonizer<List<CirAnnotation>, Li override fun initialize(first: List<CirAnnotation>) = Unit override fun doCommonizeWith(next: List<CirAnnotation>): Boolean { - val nextDeprecatedAnnotation = next.firstOrNull { it.fqName == DEPRECATED_ANNOTATION_FQN } ?: return true + val nextDeprecatedAnnotation = next.firstOrNull { annotation -> + (annotation.type.classifierId as? CirClassifierId.ClassOrTypeAlias)?.classId == DEPRECATED_ANNOTATION_CID + } ?: return true + val deprecatedAnnotationCommonizer = deprecatedAnnotationCommonizer ?: DeprecatedAnnotationCommonizer().also { this.deprecatedAnnotationCommonizer = it } + return deprecatedAnnotationCommonizer.commonizeWith(nextDeprecatedAnnotation) } @@ -70,7 +80,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer<CirAnnotation, CirAnno mapOf(PROPERTY_NAME_REPLACE_WITH to replaceWithExpression.toReplaceWithValue(replaceWithImports)) return CirAnnotationFactory.create( - fqName = DEPRECATED_ANNOTATION_FQN, + type = DEPRECATED_ANNOTATION_TYPE, constantValueArguments = constantValueArguments, annotationValueArguments = annotationValueArguments ) @@ -126,12 +136,12 @@ private class DeprecatedAnnotationCommonizer : Commonizer<CirAnnotation, CirAnno @Suppress("NOTHING_TO_INLINE") companion object { - private val PROPERTY_NAME_MESSAGE = Name.identifier(Deprecated::message.name) - private val PROPERTY_NAME_REPLACE_WITH = Name.identifier(Deprecated::replaceWith.name) - private val PROPERTY_NAME_LEVEL = Name.identifier(Deprecated::level.name) + private val PROPERTY_NAME_MESSAGE = Name.identifier(Deprecated::message.name).intern() + private val PROPERTY_NAME_REPLACE_WITH = Name.identifier(Deprecated::replaceWith.name).intern() + private val PROPERTY_NAME_LEVEL = Name.identifier(Deprecated::level.name).intern() - private val PROPERTY_NAME_EXPRESSION = Name.identifier(ReplaceWith::expression.name) - private val PROPERTY_NAME_IMPORTS = Name.identifier(ReplaceWith::imports.name) + private val PROPERTY_NAME_EXPRESSION = Name.identifier(ReplaceWith::expression.name).intern() + private val PROPERTY_NAME_IMPORTS = Name.identifier(ReplaceWith::imports.name).intern() // Optimization: Keep most frequently used message constants. private val FREQUENTLY_USED_MESSAGE_VALUES: Map<String, StringValue> = listOf( @@ -140,15 +150,24 @@ private class DeprecatedAnnotationCommonizer : Commonizer<CirAnnotation, CirAnno ).associateWith { StringValue(it) } private val FALLBACK_MESSAGE_VALUE = StringValue(FALLBACK_MESSAGE) - private val DEPRECATION_LEVEL_FQN = FqName(DeprecationLevel::class.java.name) - private val DEPRECATION_LEVEL_CLASS_ID = ClassId.topLevel(DEPRECATION_LEVEL_FQN) + private val DEPRECATED_ANNOTATION_TYPE = buildAnnotationType(DEPRECATED_ANNOTATION_CID) + private val REPLACE_WITH_ANNOTATION_TYPE = buildAnnotationType(internedClassId(FqName(ReplaceWith::class.java.name))) + + private val DEPRECATION_LEVEL_CID = internedClassId(FqName(DeprecationLevel::class.java.name)) // Optimization: Keep DeprecationLevel enum constants. private val DEPRECATION_LEVEL_ENUM_ENTRY_VALUES: Map<String, EnumValue> = DeprecationLevel.values().associate { - it.name to EnumValue(DEPRECATION_LEVEL_CLASS_ID, Name.identifier(it.name)) + it.name to EnumValue(DEPRECATION_LEVEL_CID, Name.identifier(it.name).intern()) } - private val REPLACE_WITH_FQN = FqName(ReplaceWith::class.java.name) + private fun buildAnnotationType(classId: ClassId) = CirTypeFactory.create( + classifierId = CirClassifierIdFactory.createForClass(classId), + visibility = Visibilities.PUBLIC, + arguments = emptyList(), + isMarkedNullable = false, + isDefinitelyNotNullType = false, + fqNameWithTypeParameters = classId.asString() + ) private fun CirAnnotation.getDeprecationMessage(): String? = constantValueArguments.getString(PROPERTY_NAME_MESSAGE) @@ -204,7 +223,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer<CirAnnotation, CirAnno private inline fun createReplaceWithAnnotation(expression: String, imports: List<String>): CirAnnotation = CirAnnotationFactory.create( - fqName = REPLACE_WITH_FQN, + type = REPLACE_WITH_ANNOTATION_TYPE, constantValueArguments = mapOf( PROPERTY_NAME_EXPRESSION to StringValue(expression), PROPERTY_NAME_IMPORTS to ArrayValue( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt index 0c6778531ee..b7934bcd2a3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.cir.CirType import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.* import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap +import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId internal class CommonizationVisitor( private val root: CirRootNode @@ -77,15 +78,16 @@ internal class CommonizationVisitor( } if (commonClass != null) { - // companion object should have the same FQ name for each target class, then it could be set to common class - val companionObjectFqName = node.targetDeclarations.mapTo(HashSet()) { it!!.companion }.singleOrNull() - if (companionObjectFqName != null) { - val companionObjectNode = root.cache.classes[companionObjectFqName] - ?: error("Can't find companion object with FQ name $companionObjectFqName") + // companion object should have the same name for each target class, then it could be set to common class + val companionObjectName = node.targetDeclarations.mapTo(HashSet()) { it!!.companion }.singleOrNull() + if (companionObjectName != null) { + val companionObjectClassId = internedClassId(node.classId, companionObjectName) + val companionObjectNode = root.cache.classes[companionObjectClassId] + ?: error("Can't find companion object with class ID $companionObjectClassId") if (companionObjectNode.commonDeclaration() != null) { // companion object has been successfully commonized - commonClass.companion = companionObjectFqName + commonClass.companion = companionObjectName } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeAliasCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeAliasCommonizer.kt index 6172ddc3ff7..b5782965298 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeAliasCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeAliasCommonizer.kt @@ -95,6 +95,6 @@ private class TypeAliasExpectClassCommonizer : AbstractStandardCommonizer<CirTyp override fun doCommonizeWith(next: CirTypeAlias) = next.typeParameters.isEmpty() // TAs with declared type parameters can't be commonized && next.underlyingType.arguments.isEmpty() // TAs with functional types or types with parameters at the right-hand side can't be commonized - && next.underlyingType.kind == CirSimpleTypeKind.CLASS // right-hand side could have only class + && next.underlyingType.classifierId is CirClassifierId.Class // right-hand side could have only class && classVisibility.commonizeWith(next.underlyingType) // the visibilities of the right-hand classes should be equal } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt index f660fb17336..3f971a7116e 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.core -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFlexibleType -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleType -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleTypeKind -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirType +import org.jetbrains.kotlin.descriptors.commonizer.cir.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassifiersCache import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirNode import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderStandardKotlinPackages @@ -39,29 +36,42 @@ internal fun areTypesEqual(cache: CirClassifiersCache, a: CirType, b: CirType): } private fun areSimpleTypesEqual(cache: CirClassifiersCache, a: CirSimpleType, b: CirSimpleType): Boolean { - if (a !== b - && (a.arguments.size != b.arguments.size - || a.isMarkedNullable != b.isMarkedNullable - || a.isDefinitelyNotNullType != b.isDefinitelyNotNullType - || a.fqName != b.fqName) - ) { - return false + val aId = a.classifierId + val bId = b.classifierId + + if (a !== b) { + if (a.arguments.size != b.arguments.size + || a.isMarkedNullable != b.isMarkedNullable + || a.isDefinitelyNotNullType != b.isDefinitelyNotNullType + ) { + return false + } + + if (aId is CirClassifierId.ClassOrTypeAlias) { + if (bId !is CirClassifierId.ClassOrTypeAlias || aId.classId != bId.classId) return false + } + + if (aId is CirClassifierId.TypeParameter) { + if (bId !is CirClassifierId.TypeParameter || aId.name != bId.name) return false + } } - fun isClassOrTypeAliasUnderStandardKotlinPackages() = - // N.B. only for descriptors that represent classes or type aliases, but not type parameters! - a.isClassOrTypeAlias && b.isClassOrTypeAlias && a.fqName.isUnderStandardKotlinPackages + // N.B. only for descriptors that represent classes or type aliases, but not type parameters! + fun isClassOrTypeAliasUnderStandardKotlinPackages(): Boolean { + return (aId as? CirClassifierId.ClassOrTypeAlias)?.classId?.packageFqName?.isUnderStandardKotlinPackages == true + } - fun descriptorsCanBeCommonizedThemselves() = - a.kind == b.kind && when (a.kind) { - CirSimpleTypeKind.CLASS -> cache.classes[a.fqName].canBeCommonized() - CirSimpleTypeKind.TYPE_ALIAS -> cache.typeAliases[a.fqName].canBeCommonized() - CirSimpleTypeKind.TYPE_PARAMETER -> { + fun descriptorsCanBeCommonizedThemselves(): Boolean { + return when (aId) { + is CirClassifierId.Class -> bId is CirClassifierId.Class && cache.classes[aId.classId].canBeCommonized() + is CirClassifierId.TypeAlias -> bId is CirClassifierId.TypeAlias && cache.typeAliases[aId.classId].canBeCommonized() + is CirClassifierId.TypeParameter -> { // Real type parameter commonization is performed in TypeParameterCommonizer. // Here it is enough to check that FQ names are equal (which is already done above). true } } + } val descriptorsCanBeCommonized = /* either class or type alias from Kotlin stdlib */ isClassOrTypeAliasUnderStandardKotlinPackages() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassNode.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassNode.kt index 9d55b779bf2..afc3e958f3c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassNode.kt @@ -8,15 +8,15 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import gnu.trove.THashMap import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NullableLazyValue class CirClassNode( override val targetDeclarations: CommonizedGroup<CirClass>, override val commonDeclaration: NullableLazyValue<CirClass>, - override val fqName: FqName -) : CirNodeWithFqName<CirClass, CirClass> { + override val classId: ClassId +) : CirNodeWithClassId<CirClass, CirClass> { val constructors: MutableMap<ConstructorApproximationKey, CirClassConstructorNode> = THashMap() val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = THashMap() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassifiersCache.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassifiersCache.kt index b378b202a90..e45d454a794 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassifiersCache.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirClassifiersCache.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId interface CirClassifiersCache { - val classes: Map<FqName, CirClassNode> - val typeAliases: Map<FqName, CirTypeAliasNode> + val classes: Map<ClassId, CirClassNode> + val typeAliases: Map<ClassId, CirTypeAliasNode> } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt index b94cda94b14..183bd53f733 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt @@ -24,7 +24,10 @@ interface CirNode<T : CirDeclaration, R : CirDeclaration> { fun toString(node: CirNode<*, *>) = buildString { if (node is CirNodeWithFqName) { - append("fqName=").append(node.fqName).append(", ") + append("fqName=").append(node.fqName.asString()).append(", ") + } + if (node is CirNodeWithClassId) { + append("classId=").append(node.classId.asString()).append(", ") } append("target=") node.targetDeclarations.joinTo(this) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNodeWithClassId.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNodeWithClassId.kt new file mode 100644 index 00000000000..6a4d3ef469a --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNodeWithClassId.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.descriptors.commonizer.mergedtree + +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirDeclaration +import org.jetbrains.kotlin.name.ClassId + +interface CirNodeWithClassId<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> { + val classId: ClassId +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirRootNode.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirRootNode.kt index 64e9126e1cd..84dd78035f6 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirRootNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirRootNode.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import gnu.trove.THashMap import org.jetbrains.kotlin.descriptors.commonizer.cir.CirRoot import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NullableLazyValue @@ -17,8 +17,8 @@ class CirRootNode( override val commonDeclaration: NullableLazyValue<CirRoot> ) : CirNode<CirRoot, CirRoot> { class CirClassifiersCacheImpl : CirClassifiersCache { - override val classes = THashMap<FqName, CirClassNode>() - override val typeAliases = THashMap<FqName, CirTypeAliasNode>() + override val classes = THashMap<ClassId, CirClassNode>() + override val typeAliases = THashMap<ClassId, CirTypeAliasNode>() } val modules: MutableMap<Name, CirModuleNode> = THashMap() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTreeMerger.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTreeMerger.kt index f02fdb180c4..76362aa427c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTreeMerger.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTreeMerger.kt @@ -14,9 +14,10 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirRootNode.CirClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.intern +import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.StorageManager @@ -115,10 +116,20 @@ class CirTreeMerger( val typeAliases: MutableMap<Name, CirTypeAliasNode> = packageNode.typeAliases packageMemberScope.collectMembers( - PropertyCollector { processProperty(properties, targetIndex, it, null) }, - FunctionCollector { processFunction(functions, targetIndex, it, null) }, - ClassCollector { processClass(classes, targetIndex, it, null) }, - TypeAliasCollector { processTypeAlias(typeAliases, targetIndex, it) } + PropertyCollector { propertyDescriptor -> + processProperty(properties, targetIndex, propertyDescriptor, null) + }, + FunctionCollector { functionDescriptor -> + processFunction(functions, targetIndex, functionDescriptor, null) + }, + ClassCollector { classDescriptor -> + processClass(classes, targetIndex, classDescriptor, null) { className -> + internedClassId(packageFqName, className) + } + }, + TypeAliasCollector { typeAliasDescriptor -> + processTypeAlias(typeAliases, targetIndex, typeAliasDescriptor, packageFqName) + } ) } @@ -150,10 +161,14 @@ class CirTreeMerger( classes: MutableMap<Name, CirClassNode>, targetIndex: Int, classDescriptor: ClassDescriptor, - parentCommonDeclaration: NullableLazyValue<*>? + parentCommonDeclaration: NullableLazyValue<*>?, + classIdFunction: (Name) -> ClassId ) { - val classNode: CirClassNode = classes.getOrPut(classDescriptor.name.intern()) { - buildClassNode(storageManager, size, cacheRW, parentCommonDeclaration, classDescriptor.fqNameSafe.intern()) + val className = classDescriptor.name.intern() + val classId = classIdFunction(className) + + val classNode: CirClassNode = classes.getOrPut(className) { + buildClassNode(storageManager, size, cacheRW, parentCommonDeclaration, classId) } classNode.targetDeclarations[targetIndex] = CirClassFactory.create(classDescriptor) @@ -167,9 +182,17 @@ class CirTreeMerger( classDescriptor.constructors.forEach { processClassConstructor(constructors, targetIndex, it, parentCommonDeclarationForMembers) } classDescriptor.unsubstitutedMemberScope.collectMembers( - PropertyCollector { processProperty(properties, targetIndex, it, parentCommonDeclarationForMembers) }, - FunctionCollector { processFunction(functions, targetIndex, it, parentCommonDeclarationForMembers) }, - ClassCollector { processClass(nestedClasses, targetIndex, it, parentCommonDeclarationForMembers) } + PropertyCollector { propertyDescriptor -> + processProperty(properties, targetIndex, propertyDescriptor, parentCommonDeclarationForMembers) + }, + FunctionCollector { functionDescriptor -> + processFunction(functions, targetIndex, functionDescriptor, parentCommonDeclarationForMembers) + }, + ClassCollector { nestedClassDescriptor -> + processClass(nestedClasses, targetIndex, nestedClassDescriptor, parentCommonDeclarationForMembers) { nestedClassName -> + internedClassId(classId, nestedClassName) + } + } ) } @@ -188,10 +211,14 @@ class CirTreeMerger( private fun processTypeAlias( typeAliases: MutableMap<Name, CirTypeAliasNode>, targetIndex: Int, - typeAliasDescriptor: TypeAliasDescriptor + typeAliasDescriptor: TypeAliasDescriptor, + packageFqName: FqName ) { - val typeAliasNode: CirTypeAliasNode = typeAliases.getOrPut(typeAliasDescriptor.name.intern()) { - buildTypeAliasNode(storageManager, size, cacheRW, typeAliasDescriptor.fqNameSafe.intern()) + val typeAliasName = typeAliasDescriptor.name.intern() + val typeAliasClassId = internedClassId(packageFqName, typeAliasName) + + val typeAliasNode: CirTypeAliasNode = typeAliases.getOrPut(typeAliasName) { + buildTypeAliasNode(storageManager, size, cacheRW, typeAliasClassId) } typeAliasNode.targetDeclarations[targetIndex] = CirTypeAliasFactory.create(typeAliasDescriptor) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTypeAliasNode.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTypeAliasNode.kt index 7dfd566055c..b781674ead3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTypeAliasNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirTypeAliasNode.kt @@ -8,14 +8,14 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifier import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeAlias import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.storage.NullableLazyValue class CirTypeAliasNode( override val targetDeclarations: CommonizedGroup<CirTypeAlias>, override val commonDeclaration: NullableLazyValue<CirClassifier>, - override val fqName: FqName -) : CirNodeWithFqName<CirTypeAlias, CirClassifier> { + override val classId: ClassId +) : CirNodeWithClassId<CirTypeAlias, CirClassifier> { override fun <R, T> accept(visitor: CirNodeVisitor<R, T>, data: T): R = visitor.visitTypeAliasNode(this, data) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt index e79d08c4e27..41f60d87bea 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassifierRecursi import org.jetbrains.kotlin.descriptors.commonizer.core.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirRootNode.CirClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NullableLazyValue @@ -81,7 +82,7 @@ internal fun buildClassNode( size: Int, cacheRW: CirClassifiersCacheImpl, parentCommonDeclaration: NullableLazyValue<*>?, - fqName: FqName + classId: ClassId ): CirClassNode = buildNode( storageManager = storageManager, size = size, @@ -89,8 +90,8 @@ internal fun buildClassNode( commonizerProducer = { ClassCommonizer(cacheRW) }, recursionMarker = CirClassRecursionMarker, nodeProducer = { targetDeclarations, commonDeclaration -> - CirClassNode(targetDeclarations, commonDeclaration, fqName).also { - cacheRW.classes[fqName] = it + CirClassNode(targetDeclarations, commonDeclaration, classId).also { + cacheRW.classes[classId] = it } } ) @@ -112,15 +113,15 @@ internal fun buildTypeAliasNode( storageManager: StorageManager, size: Int, cacheRW: CirClassifiersCacheImpl, - fqName: FqName + classId: ClassId ): CirTypeAliasNode = buildNode( storageManager = storageManager, size = size, commonizerProducer = { TypeAliasCommonizer(cacheRW) }, recursionMarker = CirClassifierRecursionMarker, nodeProducer = { targetDeclarations, commonDeclaration -> - CirTypeAliasNode(targetDeclarations, commonDeclaration, fqName).also { - cacheRW.typeAliases[fqName] = it + CirTypeAliasNode(targetDeclarations, commonDeclaration, classId).also { + cacheRW.typeAliases[classId] = it } } ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt index 7e67c737bd5..27635608544 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt @@ -6,10 +6,12 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.konan.impl.ForwardDeclarationsFqNames -internal val DEPRECATED_ANNOTATION_FQN: FqName = FqName(Deprecated::class.java.name) +internal val DEPRECATED_ANNOTATION_FQN: FqName = FqName(Deprecated::class.java.name).intern() +internal val DEPRECATED_ANNOTATION_CID: ClassId = internedClassId(DEPRECATED_ANNOTATION_FQN) private val STANDARD_KOTLIN_PACKAGE_PREFIXES = listOf( KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString(), diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/interners.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/interners.kt new file mode 100644 index 00000000000..e72e708c02a --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/interners.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.descriptors.commonizer.utils + +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +internal fun FqName.intern(): FqName = fqNameInterner.intern(this) +internal fun Name.intern(): Name = nameInterner.intern(this) + +@Suppress("NOTHING_TO_INLINE") +internal inline fun internedClassId(topLevelFqName: FqName): ClassId { + val packageFqName = topLevelFqName.parent().intern() + val className = topLevelFqName.shortName().intern() + return internedClassId(packageFqName, className) +} + +internal fun internedClassId(packageFqName: FqName, classifierName: Name): ClassId { + val relativeClassName = FqName.topLevel(classifierName).intern() + return ClassId(packageFqName, relativeClassName, false).intern() +} + +internal fun internedClassId(ownerClassId: ClassId, nestedClassName: Name): ClassId { + val relativeClassName = ownerClassId.relativeClassName.child(nestedClassName).intern() + return ClassId(ownerClassId.packageFqName, relativeClassName, ownerClassId.isLocal).intern() +} + +@Suppress("NOTHING_TO_INLINE") +private inline fun ClassId.intern(): ClassId = classIdInterner.intern(this) + +private val fqNameInterner = Interner<FqName>() +private val nameInterner = Interner<Name>() +private val classIdInterner = Interner<ClassId>() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt index 068cd5722ed..5aa9c15e9bc 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt @@ -11,11 +11,13 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.konan.impl.KlibResolvedModuleDescriptorsFactoryImpl import org.jetbrains.kotlin.storage.StorageManager @@ -33,20 +35,31 @@ internal fun createKotlinNativeForwardDeclarationsModule( ) // similar to org.jetbrains.kotlin.descriptors.DescriptorUtilKt#resolveClassByFqName, but resolves also type aliases -internal fun ModuleDescriptor.resolveClassOrTypeAliasByFqName( - fqName: FqName, - lookupLocation: LookupLocation -): ClassifierDescriptorWithTypeParameters? { - if (fqName.isRoot) return null - - (getPackage(fqName.parent()).memberScope.getContributedClassifier( - fqName.shortName(), - lookupLocation - ) as? ClassifierDescriptorWithTypeParameters)?.let { return it } - - return (resolveClassOrTypeAliasByFqName(fqName.parent(), lookupLocation) as? ClassDescriptor) - ?.unsubstitutedInnerClassesScope - ?.getContributedClassifier(fqName.shortName(), lookupLocation) as? ClassifierDescriptorWithTypeParameters +internal fun ModuleDescriptor.resolveClassOrTypeAlias(classId: ClassId): ClassifierDescriptorWithTypeParameters? { + val relativeClassName: FqName = classId.relativeClassName + if (relativeClassName.isRoot) + return null + + var memberScope: MemberScope = getPackage(classId.packageFqName).memberScope + + val classifierName = if ('.' in relativeClassName.asString()) { + // resolve member scope of the nested class + relativeClassName.pathSegments().reduce { first, second -> + memberScope = (memberScope.getContributedClassifier( + first, + NoLookupLocation.FOR_ALREADY_TRACKED + ) as? ClassDescriptor)?.unsubstitutedMemberScope ?: return null + + second + } + } else { + relativeClassName.shortName() + } + + return memberScope.getContributedClassifier( + classifierName, + NoLookupLocation.FOR_ALREADY_TRACKED + ) as? ClassifierDescriptorWithTypeParameters } internal val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer, NativeTypeTransformer()) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt index 8b47496672e..4ae48838391 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt @@ -5,21 +5,27 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.types.* +import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.types.AbbreviatedType +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.typeUtil.makeNotNullable internal inline val KotlinType.declarationDescriptor: ClassifierDescriptor get() = (constructor.declarationDescriptor ?: error("No declaration descriptor found for $constructor")) -internal inline val KotlinType.fqNameInterned: FqName - get() = declarationDescriptor.fqNameSafe.intern() - -internal fun FqName.intern(): FqName = fqNameInterner.intern(this) -internal fun Name.intern(): Name = nameInterner.intern(this) +internal val ClassifierDescriptorWithTypeParameters.internedClassId: ClassId + get() = when (val owner = containingDeclaration) { + is PackageFragmentDescriptor -> internedClassId(owner.fqName.intern(), name.intern()) + is ClassDescriptor -> internedClassId(owner.internedClassId, name.intern()) + else -> error("Unexpected containing declaration type for $this: ${owner::class}, $owner") + } internal val KotlinType.fqNameWithTypeParameters: String get() { @@ -28,12 +34,10 @@ internal val KotlinType.fqNameWithTypeParameters: String } private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, exploredTypeParameters: MutableSet<KotlinType>) { - val abbreviation = (type as? AbbreviatedType)?.abbreviation ?: type - append(abbreviation.fqNameInterned) - val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type) if (typeParameterDescriptor != null) { // N.B this is type parameter type + append(typeParameterDescriptor.name.asString()) if (exploredTypeParameters.add(type.makeNotNullable())) { // print upper bounds once the first time when type parameter type is met append(":[") @@ -46,6 +50,8 @@ private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, explor } } else { // N.B. this is classifier type + val abbreviation = (type as? AbbreviatedType)?.abbreviation ?: type + append(abbreviation.declarationDescriptor.classId!!.asString()) val arguments = type.arguments if (arguments.isNotEmpty()) { @@ -73,6 +79,3 @@ private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, explor // dedicated to hold unique entries of "fqNameWithTypeParameters" private val stringInterner = Interner<String>() - -private val fqNameInterner = Interner<FqName>() -private val nameInterner = Interner<Name>() diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt index dca4bc1104d..5e3cbd67590 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation +import org.jetbrains.kotlin.descriptors.commonizer.cir.CirSimpleType import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirAnnotationFactory +import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory +import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -287,7 +290,7 @@ private fun mockAnnotation( constantValueArguments: Map<Name, ConstantValue<*>> = emptyMap(), annotationValueArguments: Map<Name, CirAnnotation> = emptyMap() ): CirAnnotation = CirAnnotationFactory.create( - fqName = FqName(fqName), + type = CirTypeFactory.create(mockClassType(fqName)) as CirSimpleType, constantValueArguments = constantValueArguments, annotationValueArguments = annotationValueArguments ) diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt index b6fb42b7abe..c0654caa241 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.buildClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.buildTypeAliasNode import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.descriptors.commonizer.utils.mockTAType -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.getAbbreviation @@ -459,27 +459,26 @@ class TypeCommonizerTest : AbstractCommonizerTest<CirType, CirType>() { val descriptor = (type.getAbbreviation() ?: type).constructor.declarationDescriptor when (descriptor) { is ClassDescriptor -> { - val fqName = descriptor.fqNameSafe - val node = cache.classes.getOrPut(fqName) { + val classId = descriptor.classId ?: error("No class ID for ${descriptor::class.java}, $descriptor") + val node = cache.classes.getOrPut(classId) { buildClassNode( storageManager = LockBasedStorageManager.NO_LOCKS, size = variants.size, cacheRW = cache, parentCommonDeclaration = null, - fqName = fqName + classId = classId ) } node.targetDeclarations[index] = CirClassFactory.create(descriptor) } is TypeAliasDescriptor -> { - val fqName = descriptor.fqNameSafe - val node = cache.typeAliases.getOrPut(fqName) { + val classId = descriptor.classId ?: error("No class ID for ${descriptor::class.java}, $descriptor") + val node = cache.typeAliases.getOrPut(classId) { buildTypeAliasNode( storageManager = LockBasedStorageManager.NO_LOCKS, size = variants.size, cacheRW = cache, - fqName = fqName - + classId = classId ) } node.targetDeclarations[index] = CirTypeAliasFactory.create(descriptor) diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt index ac8a3954a1e..bb3a8797f19 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.AnnotationValue import org.jetbrains.kotlin.resolve.constants.ConstantValue +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.KotlinType @@ -484,10 +485,10 @@ internal class ComparingDeclarationsVisitor( context.nextLevel("Unwrapped/unabbreviated type annotations") ) - val expectedFqName = expectedUnwrapped.fqNameInterned - val actualFqName = actualUnwrapped.fqNameInterned + val expectedId = expectedUnwrapped.declarationDescriptor.run { classId?.asString() ?: name.asString() } + val actualId = actualUnwrapped.declarationDescriptor.run { classId?.asString() ?: name.asString() } - context.assertEquals(expectedFqName, actualFqName, "type FQN") + context.assertEquals(expectedId, actualId, "type class ID / name") val expectedArguments = expectedUnwrapped.arguments val actualArguments = actualUnwrapped.arguments diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt index 12db715c5b7..774274d5696 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.builder.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassifiersCache import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirTypeAliasNode +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.parentOrNull import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -120,8 +121,8 @@ private fun createPackageFragmentForClassifier(classifierFqName: FqName): Packag } internal val EMPTY_CLASSIFIERS_CACHE = object : CirClassifiersCache { - override val classes: Map<FqName, CirClassNode> get() = emptyMap() - override val typeAliases: Map<FqName, CirTypeAliasNode> get() = emptyMap() + override val classes: Map<ClassId, CirClassNode> get() = emptyMap() + override val typeAliases: Map<ClassId, CirTypeAliasNode> get() = emptyMap() } internal class MockBuiltInsProvider(private val builtIns: KotlinBuiltIns) : BuiltInsProvider { |