Move JvmBuiltIns initialization after container setup

It will be used in the further commits to initilize built-ins instance
with components as arguments
This commit is contained in:
Denis Zharkov
2016-09-21 16:09:18 +03:00
parent 63943c60d3
commit a7dedfab70
11 changed files with 29 additions and 21 deletions
@@ -23,13 +23,13 @@ import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.java.di.configureJavaTopDownAnalysis
import org.jetbrains.kotlin.frontend.java.di.initJvmBuiltInsForTopDownAnalysis
import org.jetbrains.kotlin.frontend.java.di.javaAnalysisInit
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.JavaClassFinderImpl
import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel
import org.jetbrains.kotlin.resolve.jvm.JavaClassFinderPostConstruct
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
@@ -52,8 +52,9 @@ fun createContainerForReplWithJava(
useImpl<SingleModuleClassResolver>()
}.let {
it.get<JavaClassFinderImpl>().initialize()
it.get<JavaClassFinderPostConstruct>().postCreate()
it.javaAnalysisInit()
it.initJvmBuiltInsForTopDownAnalysis()
ContainerForReplWithJava(it)
}
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.*
import org.jetbrains.kotlin.context.LazyResolveToken
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker
@@ -33,6 +34,7 @@ import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver
import org.jetbrains.kotlin.load.java.sam.SamConversionResolverImpl
import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava
import org.jetbrains.kotlin.load.kotlin.JvmVirtualFileFinderFactory
import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.jvm.JavaClassFinderPostConstruct
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
@@ -125,15 +127,22 @@ fun createContainerForTopDownAnalyzerForJvm(
useImpl<SingleModuleClassResolver>()
}.let {
it.javaAnalysisInit()
it.initJvmBuiltInsForTopDownAnalysis()
ContainerForTopDownAnalyzerForJvm(it)
}
private fun StorageComponentContainer.javaAnalysisInit() {
fun StorageComponentContainer.javaAnalysisInit() {
get<JavaClassFinderImpl>().initialize()
get<JavaClassFinderPostConstruct>().postCreate()
}
// 'initBuiltIns' body cannot be merged with 'javaAnalysisInit' because the latter is used in IDE,
// where built-ins instances are shared between modules and manual initialization is necessary (to avoid multiple initialization)
fun StorageComponentContainer.initJvmBuiltInsForTopDownAnalysis() {
get<JvmBuiltIns>().initialize(get<ModuleDescriptor>())
}
class ContainerForTopDownAnalyzerForJvm(container: StorageComponentContainer) {
val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container
val javaDescriptorResolver: JavaDescriptorResolver by container
@@ -154,7 +154,6 @@ public enum TopDownAnalyzerFacadeForJVM {
projectContext, Name.special("<" + configuration.getNotNull(CommonConfigurationKeys.MODULE_NAME) + ">"),
JvmPlatform.INSTANCE, builtIns
);
builtIns.setOwnerModuleDescriptor(context.getModule());
context.setDependencies(context.getModule(), context.getBuiltIns().getBuiltInsModule());
return context;
}
@@ -48,7 +48,6 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment()
fun testAllListedSignaturesExistInJdk() {
val jvmBuiltIns = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS)
val emptyModule = KotlinTestUtils.createEmptyModule("<empty>", JvmPlatform, jvmBuiltIns)
jvmBuiltIns.setOwnerModuleDescriptor(emptyModule)
val moduleContext = ModuleContext(emptyModule, environment.project)
val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList())
@@ -396,10 +396,8 @@ public abstract class AbstractDiagnosticsTest extends BaseDiagnosticsTest {
@NotNull
protected ModuleDescriptorImpl createModule(@NotNull String moduleName, @NotNull StorageManager storageManager) {
JvmBuiltIns builtIns = new JvmBuiltIns(storageManager);
ModuleDescriptorImpl module = TargetPlatformKt.createModule(
return TargetPlatformKt.createModule(
JvmPlatform.INSTANCE, Name.special(moduleName), storageManager, builtIns);
builtIns.setOwnerModuleDescriptor(module);
return module;
}
@NotNull
@@ -77,7 +77,7 @@ class MultiModuleJavaAnalysisCustomTest : KtUsefulTestCase() {
packagePartProviderFactory = { a, b -> JvmPackagePartProvider(environment) }
)
builtIns.setOwnerModuleDescriptor(resolverForProject.descriptorForModule(resolverForProject.allModules.first()))
builtIns.initialize(resolverForProject.descriptorForModule(resolverForProject.allModules.first()))
performChecks(resolverForProject, modules)
}
@@ -56,7 +56,6 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment()
val jvmBuiltIns = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS)
val emptyModule = KotlinTestUtils.createEmptyModule("<empty>", JvmPlatform, jvmBuiltIns)
jvmBuiltIns.setOwnerModuleDescriptor(emptyModule)
val moduleContext = ModuleContext(emptyModule, environment.project)
val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList())
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.load.kotlin
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.storage.StorageManager
@@ -37,14 +38,16 @@ class DeserializationComponentsForJava(
val components: DeserializationComponents
init {
val settings = JvmBuiltInsSettings(moduleDescriptor, storageManager, { moduleDescriptor })
// currently built-ins may be not an instance of JvmBuiltIns only in case of built-ins serialization
val jvmBuiltIns = moduleDescriptor.builtIns as? JvmBuiltIns
components = DeserializationComponents(
storageManager, moduleDescriptor, classDataFinder, annotationAndConstantLoader, packageFragmentProvider,
LocalClassifierTypeSettings.Default,
errorReporter, lookupTracker, JavaFlexibleTypeDeserializer, ClassDescriptorFactory.EMPTY,
notFoundClasses,
additionalClassPartsProvider = settings,
platformDependentDeclarationFilter = settings
additionalClassPartsProvider = jvmBuiltIns?.settings ?: AdditionalClassPartsProvider.None,
platformDependentDeclarationFilter =
jvmBuiltIns?.settings ?: PlatformDependentDeclarationFilter.NoPlatformDependent
)
}
}
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.platform
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.load.kotlin.JvmBuiltInsSettings
import org.jetbrains.kotlin.serialization.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.sure
@@ -28,12 +27,13 @@ class JvmBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManage
// Module containing JDK classes or having them among dependencies
private var ownerModuleDescriptor: ModuleDescriptor? = null
fun setOwnerModuleDescriptor(moduleDescriptor: ModuleDescriptor) {
fun initialize(moduleDescriptor: ModuleDescriptor) {
assert(ownerModuleDescriptor == null) { "JvmBuiltins repeated initialization" }
this.ownerModuleDescriptor = moduleDescriptor
}
private lateinit var settings: JvmBuiltInsSettings
lateinit var settings: JvmBuiltInsSettings
private set
// Here we know order in which KotlinBuiltIns constructor calls these methods
override fun getPlatformDependentDeclarationFilter(): PlatformDependentDeclarationFilter {
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.platform.JvmBuiltIns
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
import org.jetbrains.kotlin.serialization.deserialization.LocalClassifierTypeSettings
import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses
import org.jetbrains.kotlin.storage.LockBasedStorageManager
@@ -64,7 +63,7 @@ class RuntimeModuleData private constructor(val deserialization: Deserialization
val lazyJavaPackageFragmentProvider = LazyJavaPackageFragmentProvider(globalJavaResolverContext)
builtIns.setOwnerModuleDescriptor(module)
builtIns.initialize(module)
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, javaResolverCache)
val javaClassDataFinder = JavaClassDataFinder(reflectKotlinClassFinder, deserializedDescriptorResolver)
@@ -76,6 +75,7 @@ class RuntimeModuleData private constructor(val deserialization: Deserialization
storageManager, module, javaClassDataFinder, binaryClassAnnotationAndConstantLoader,
lazyJavaPackageFragmentProvider, notFoundClasses, RuntimeErrorReporter, LookupTracker.DO_NOTHING
)
singleModuleClassResolver.resolver = javaDescriptorResolver
deserializedDescriptorResolver.setComponents(deserializationComponentsForJava)
@@ -381,7 +381,7 @@ private fun globalResolveSessionProvider(
if (newBuiltIns is JvmBuiltIns) {
val sdkInfo = SdkInfo(project, sdk!!)
newBuiltIns.setOwnerModuleDescriptor(moduleResolverProvider.resolverForProject.descriptorForModule(sdkInfo))
newBuiltIns.initialize(moduleResolverProvider.resolverForProject.descriptorForModule(sdkInfo))
}
moduleResolverProvider