From eb94167ff2da0f4205612d0eb98cba9f1bde71bd Mon Sep 17 00:00:00 2001 From: Hung Nguyen Date: Thu, 29 Jul 2021 12:32:53 +0100 Subject: [PATCH] Move RuntimeModuleData from :core:descriptors.runtime to :core:descriptors.jvm We are working on a feature in the Kotlin Gradle plugin called `kotlin.incremental.useClasspathSnapshot` to improve incremental Kotlin compilation. To allow reuse when writing this feature, this commit moves most of the code in RuntimeModuleData (in the ':core:descriptors.runtime' project) to DeserializationComponentsForJava (in the ':core:descriptors.jvm' project), so that the API can be accessed from the ':kotlin-gradle-plugin' and ':kotlin-build-common' projects where the feature is written. Bug: KT-45777 Test: Existing tests should pass (this is a refactoring-only change) --- .../DeserializationComponentsForJava.kt | 138 ++++++++++++++++- .../runtime/components/RuntimeModuleData.kt | 145 +----------------- 2 files changed, 138 insertions(+), 145 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt index 46c75c46533..2c5b555134e 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt @@ -16,16 +16,36 @@ package org.jetbrains.kotlin.load.kotlin +import org.jetbrains.kotlin.builtins.ReflectionTypes import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns +import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsPackageFragmentProvider import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.NotFoundClasses +import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter +import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider +import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider +import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver +import org.jetbrains.kotlin.load.java.JavaClassFinder +import org.jetbrains.kotlin.load.java.JavaClassesTracker +import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState +import org.jetbrains.kotlin.load.java.components.JavaPropertyInitializerEvaluator +import org.jetbrains.kotlin.load.java.components.JavaResolverCache +import org.jetbrains.kotlin.load.java.components.SignaturePropagator +import org.jetbrains.kotlin.load.java.lazy.* +import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory +import org.jetbrains.kotlin.load.java.structure.JavaAnnotation +import org.jetbrains.kotlin.load.java.typeEnhancement.JavaTypeEnhancement +import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver import org.jetbrains.kotlin.resolve.sam.SamConversionResolverImpl import org.jetbrains.kotlin.serialization.deserialization.* +import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker @@ -59,4 +79,120 @@ class DeserializationComponentsForJava( kotlinTypeChecker = kotlinTypeChecker, samConversionResolver = SamConversionResolverImpl(storageManager, emptyList()) ) } + + companion object { + + /** Contains [DeserializationComponentsForJava] and some related information. */ + class ModuleData( + val deserializationComponentsForJava: DeserializationComponentsForJava, + val deserializedDescriptorResolver: DeserializedDescriptorResolver + ) + + fun createModuleData( + kotlinClassFinder: KotlinClassFinder, + jvmBuiltInsKotlinClassFinder: KotlinClassFinder, + javaClassFinder: JavaClassFinder, + moduleName: String, + errorReporter: ErrorReporter, + javaSourceElementFactory: JavaSourceElementFactory + ): ModuleData { + val storageManager = LockBasedStorageManager("RuntimeModuleData") + val builtIns = JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES) + val module = ModuleDescriptorImpl(Name.special("<$moduleName>"), storageManager, builtIns) + builtIns.builtInsModule = module + + builtIns.initialize(module, isAdditionalBuiltInsFeatureSupported = true) + + val deserializedDescriptorResolver = DeserializedDescriptorResolver() + val singleModuleClassResolver = SingleModuleClassResolver() + val notFoundClasses = NotFoundClasses(storageManager, module) + + val lazyJavaPackageFragmentProvider = + makeLazyJavaPackageFragmentProvider( + javaClassFinder, module, storageManager, notFoundClasses, + kotlinClassFinder, deserializedDescriptorResolver, + errorReporter, javaSourceElementFactory, singleModuleClassResolver + ) + + val deserializationComponentsForJava = + makeDeserializationComponentsForJava( + module, storageManager, notFoundClasses, lazyJavaPackageFragmentProvider, + kotlinClassFinder, deserializedDescriptorResolver, errorReporter + ) + + deserializedDescriptorResolver.setComponents(deserializationComponentsForJava) + + val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, JavaResolverCache.EMPTY) + singleModuleClassResolver.resolver = javaDescriptorResolver + + val builtinsProvider = JvmBuiltInsPackageFragmentProvider( + storageManager, jvmBuiltInsKotlinClassFinder, module, notFoundClasses, builtIns.customizer, builtIns.customizer, + DeserializationConfiguration.Default, NewKotlinTypeChecker.Default, SamConversionResolverImpl(storageManager, emptyList()) + ) + + module.setDependencies(module) + module.initialize( + CompositePackageFragmentProvider( + listOf(javaDescriptorResolver.packageFragmentProvider, builtinsProvider), + "CompositeProvider@RuntimeModuleData for $module" + ) + ) + + return ModuleData(deserializationComponentsForJava, deserializedDescriptorResolver) + } + } +} + +fun makeLazyJavaPackageFragmentProvider( + javaClassFinder: JavaClassFinder, + module: ModuleDescriptor, + storageManager: StorageManager, + notFoundClasses: NotFoundClasses, + reflectKotlinClassFinder: KotlinClassFinder, + deserializedDescriptorResolver: DeserializedDescriptorResolver, + errorReporter: ErrorReporter, + javaSourceElementFactory: JavaSourceElementFactory, + singleModuleClassResolver: ModuleClassResolver, + packagePartProvider: PackagePartProvider = PackagePartProvider.Empty +): LazyJavaPackageFragmentProvider { + val annotationTypeQualifierResolver = AnnotationTypeQualifierResolver(storageManager, JavaTypeEnhancementState.DEFAULT) + val javaTypeEnhancementState = JavaTypeEnhancementState.DEFAULT + val javaResolverComponents = JavaResolverComponents( + storageManager, javaClassFinder, reflectKotlinClassFinder, deserializedDescriptorResolver, + SignaturePropagator.DO_NOTHING, errorReporter, JavaResolverCache.EMPTY, + JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolverImpl(storageManager, emptyList()), javaSourceElementFactory, + singleModuleClassResolver, packagePartProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module, + ReflectionTypes(module, notFoundClasses), annotationTypeQualifierResolver, + SignatureEnhancement( + annotationTypeQualifierResolver, + JavaTypeEnhancementState.DEFAULT, + JavaTypeEnhancement(JavaResolverSettings.Default) + ), + JavaClassesTracker.Default, JavaResolverSettings.Default, NewKotlinTypeChecker.Default, javaTypeEnhancementState, + object : JavaModuleAnnotationsProvider { + override fun getAnnotationsForModuleOwnerOfClass(classId: ClassId): List? = null + } + ) + + return LazyJavaPackageFragmentProvider(javaResolverComponents) +} + +fun makeDeserializationComponentsForJava( + module: ModuleDescriptor, + storageManager: StorageManager, + notFoundClasses: NotFoundClasses, + lazyJavaPackageFragmentProvider: LazyJavaPackageFragmentProvider, + reflectKotlinClassFinder: KotlinClassFinder, + deserializedDescriptorResolver: DeserializedDescriptorResolver, + errorReporter: ErrorReporter +): DeserializationComponentsForJava { + val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver) + val binaryClassAnnotationAndConstantLoader = BinaryClassAnnotationAndConstantLoaderImpl( + module, notFoundClasses, storageManager, reflectKotlinClassFinder + ) + return DeserializationComponentsForJava( + storageManager, module, DeserializationConfiguration.Default, javaClassDataFinder, + binaryClassAnnotationAndConstantLoader, lazyJavaPackageFragmentProvider, notFoundClasses, + errorReporter, LookupTracker.DO_NOTHING, ContractDeserializer.DEFAULT, NewKotlinTypeChecker.Default + ) } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/RuntimeModuleData.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/RuntimeModuleData.kt index 672076617e2..058da030176 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/RuntimeModuleData.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/descriptors/runtime/components/RuntimeModuleData.kt @@ -16,39 +16,9 @@ package org.jetbrains.kotlin.descriptors.runtime.components -import org.jetbrains.kotlin.builtins.ReflectionTypes -import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns -import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsPackageFragmentProvider import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.NotFoundClasses -import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker -import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver -import org.jetbrains.kotlin.load.java.JavaClassFinder -import org.jetbrains.kotlin.load.java.JavaClassesTracker -import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState -import org.jetbrains.kotlin.load.java.components.JavaPropertyInitializerEvaluator -import org.jetbrains.kotlin.load.java.components.JavaResolverCache -import org.jetbrains.kotlin.load.java.components.SignaturePropagator -import org.jetbrains.kotlin.load.java.lazy.* -import org.jetbrains.kotlin.load.java.sources.JavaSourceElementFactory -import org.jetbrains.kotlin.load.java.structure.JavaAnnotation -import org.jetbrains.kotlin.load.java.typeEnhancement.JavaTypeEnhancement -import org.jetbrains.kotlin.load.java.typeEnhancement.SignatureEnhancement -import org.jetbrains.kotlin.load.kotlin.* -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver -import org.jetbrains.kotlin.resolve.sam.SamConversionResolverImpl -import org.jetbrains.kotlin.serialization.deserialization.ContractDeserializer +import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava.Companion.createModuleData import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents -import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration -import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter -import org.jetbrains.kotlin.storage.LockBasedStorageManager -import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker class RuntimeModuleData private constructor( val deserialization: DeserializationComponents, @@ -73,118 +43,5 @@ class RuntimeModuleData private constructor( PackagePartScopeCache(moduleData.deserializedDescriptorResolver, kotlinClassFinder) ) } - - /** Contains [DeserializationComponentsForJava] and some related information. */ - class ModuleData( - val deserializationComponentsForJava: DeserializationComponentsForJava, - val deserializedDescriptorResolver: DeserializedDescriptorResolver - ) - - fun createModuleData( - kotlinClassFinder: KotlinClassFinder, - jvmBuiltInsKotlinClassFinder: KotlinClassFinder, - javaClassFinder: JavaClassFinder, - moduleName: String, - errorReporter: ErrorReporter, - javaSourceElementFactory: JavaSourceElementFactory - ): ModuleData { - val storageManager = LockBasedStorageManager("RuntimeModuleData") - val builtIns = JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES) - val module = ModuleDescriptorImpl(Name.special("<$moduleName>"), storageManager, builtIns) - builtIns.builtInsModule = module - - builtIns.initialize(module, isAdditionalBuiltInsFeatureSupported = true) - - val deserializedDescriptorResolver = DeserializedDescriptorResolver() - val singleModuleClassResolver = SingleModuleClassResolver() - val notFoundClasses = NotFoundClasses(storageManager, module) - - val lazyJavaPackageFragmentProvider = - makeLazyJavaPackageFragmentProvider( - javaClassFinder, module, storageManager, notFoundClasses, - kotlinClassFinder, deserializedDescriptorResolver, - errorReporter, javaSourceElementFactory, singleModuleClassResolver - ) - - val deserializationComponentsForJava = - makeDeserializationComponentsForJava( - module, storageManager, notFoundClasses, lazyJavaPackageFragmentProvider, - kotlinClassFinder, deserializedDescriptorResolver, errorReporter - ) - - deserializedDescriptorResolver.setComponents(deserializationComponentsForJava) - - val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, JavaResolverCache.EMPTY) - singleModuleClassResolver.resolver = javaDescriptorResolver - - val builtinsProvider = JvmBuiltInsPackageFragmentProvider( - storageManager, jvmBuiltInsKotlinClassFinder, module, notFoundClasses, builtIns.customizer, builtIns.customizer, - DeserializationConfiguration.Default, NewKotlinTypeChecker.Default, SamConversionResolverImpl(storageManager, emptyList()) - ) - - module.setDependencies(module) - module.initialize( - CompositePackageFragmentProvider( - listOf(javaDescriptorResolver.packageFragmentProvider, builtinsProvider), - "CompositeProvider@RuntimeModuleData for $module" - ) - ) - - return ModuleData(deserializationComponentsForJava, deserializedDescriptorResolver) - } } } - -fun makeLazyJavaPackageFragmentProvider( - javaClassFinder: JavaClassFinder, - module: ModuleDescriptor, - storageManager: StorageManager, - notFoundClasses: NotFoundClasses, - reflectKotlinClassFinder: KotlinClassFinder, - deserializedDescriptorResolver: DeserializedDescriptorResolver, - errorReporter: ErrorReporter, - javaSourceElementFactory: JavaSourceElementFactory, - singleModuleClassResolver: ModuleClassResolver, - packagePartProvider: PackagePartProvider = PackagePartProvider.Empty -): LazyJavaPackageFragmentProvider { - val annotationTypeQualifierResolver = AnnotationTypeQualifierResolver(storageManager, JavaTypeEnhancementState.DEFAULT) - val javaTypeEnhancementState = JavaTypeEnhancementState.DEFAULT - val javaResolverComponents = JavaResolverComponents( - storageManager, javaClassFinder, reflectKotlinClassFinder, deserializedDescriptorResolver, - SignaturePropagator.DO_NOTHING, errorReporter, JavaResolverCache.EMPTY, - JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolverImpl(storageManager, emptyList()), javaSourceElementFactory, - singleModuleClassResolver, packagePartProvider, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module, - ReflectionTypes(module, notFoundClasses), annotationTypeQualifierResolver, - SignatureEnhancement( - annotationTypeQualifierResolver, - JavaTypeEnhancementState.DEFAULT, - JavaTypeEnhancement(JavaResolverSettings.Default) - ), - JavaClassesTracker.Default, JavaResolverSettings.Default, NewKotlinTypeChecker.Default, javaTypeEnhancementState, - object : JavaModuleAnnotationsProvider { - override fun getAnnotationsForModuleOwnerOfClass(classId: ClassId): List? = null - } - ) - - return LazyJavaPackageFragmentProvider(javaResolverComponents) -} - -fun makeDeserializationComponentsForJava( - module: ModuleDescriptor, - storageManager: StorageManager, - notFoundClasses: NotFoundClasses, - lazyJavaPackageFragmentProvider: LazyJavaPackageFragmentProvider, - reflectKotlinClassFinder: KotlinClassFinder, - deserializedDescriptorResolver: DeserializedDescriptorResolver, - errorReporter: ErrorReporter -): DeserializationComponentsForJava { - val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver) - val binaryClassAnnotationAndConstantLoader = BinaryClassAnnotationAndConstantLoaderImpl( - module, notFoundClasses, storageManager, reflectKotlinClassFinder - ) - return DeserializationComponentsForJava( - storageManager, module, DeserializationConfiguration.Default, javaClassDataFinder, - binaryClassAnnotationAndConstantLoader, lazyJavaPackageFragmentProvider, notFoundClasses, - errorReporter, LookupTracker.DO_NOTHING, ContractDeserializer.DEFAULT, NewKotlinTypeChecker.Default - ) -}