Use cache for custom ClassDescriptors

Otherwise new ones are being created for each request, and their member scope is recomputed
This commit is contained in:
Denis Zharkov
2016-05-04 10:18:04 +03:00
parent 594fa02a9c
commit c30c695a18
8 changed files with 118 additions and 7 deletions
@@ -39,7 +39,7 @@ class DeserializationComponentsForJava(
init {
val localClassResolver = LocalClassResolverImpl()
val settings = JvmBuiltInsSettings(moduleDescriptor, { moduleDescriptor })
val settings = JvmBuiltInsSettings(moduleDescriptor, storageManager, { moduleDescriptor })
components = DeserializationComponents(
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, localClassResolver,
errorReporter, lookupTracker, FlexibleJavaClassifierTypeFactory, ClassDescriptorFactory.EMPTY,
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.serialization.deserialization.PLATFORM_DEPENDENT_ANN
import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.DelegatingType
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.utils.DFS
@@ -49,6 +50,7 @@ import java.util.*
open class JvmBuiltInsSettings(
private val moduleDescriptor: ModuleDescriptor,
storageManager: StorageManager,
deferredOwnerModuleDescriptor: () -> ModuleDescriptor
) : AdditionalClassPartsProvider, PlatformDependentDeclarationFilter {
private val j2kClassMap = JavaToKotlinClassMap.INSTANCE
@@ -57,6 +59,8 @@ open class JvmBuiltInsSettings(
private val mockSerializableType = createMockJavaIoSerializableType()
private val javaAnalogueClassesWithCustomSupertypeCache = storageManager.createCacheWithNotNullValues<FqName, ClassDescriptor>()
private fun createMockJavaIoSerializableType(): KotlinType {
val mockJavaIoPackageFragment = object : PackageFragmentDescriptorImpl(moduleDescriptor, FqName("java.io")) {
override fun getMemberScope() = MemberScope.Empty
@@ -116,10 +120,11 @@ open class JvmBuiltInsSettings(
val isMutable = j2kClassMap.isMutable(classDescriptor)
val fakeJavaClassDescriptor =
javaAnalogueDescriptor.copy(
javaResolverCache = JavaResolverCache.EMPTY,
additionalSupertypeClassDescriptor = kotlinMutableClassIfContainer)
val fakeJavaClassDescriptor = javaAnalogueClassesWithCustomSupertypeCache.computeIfAbsent(javaAnalogueDescriptor.fqNameSafe) {
javaAnalogueDescriptor.copy(
javaResolverCache = JavaResolverCache.EMPTY,
additionalSupertypeClassDescriptor = kotlinMutableClassIfContainer)
}
val scope = fakeJavaClassDescriptor.unsubstitutedMemberScope
@@ -38,7 +38,7 @@ class JvmBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManage
// Here we know order in which KotlinBuiltIns constructor calls these methods
override fun getPlatformDependentDeclarationFilter(): PlatformDependentDeclarationFilter {
settings = JvmBuiltInsSettings(
builtInsModule,
builtInsModule, storageManager,
{ ownerModuleDescriptor.sure { "JvmBuiltins has not been initialized properly" } }
)