diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt index fb3fc5a9efd..4037a24fe91 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/di/injection.kt @@ -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() }.let { - it.get().initialize() - it.get().postCreate() + it.javaAnalysisInit() + it.initJvmBuiltInsForTopDownAnalysis() + ContainerForReplWithJava(it) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index 612166d6572..8ddf89cf473 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -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() }.let { it.javaAnalysisInit() + it.initJvmBuiltInsForTopDownAnalysis() ContainerForTopDownAnalyzerForJvm(it) } -private fun StorageComponentContainer.javaAnalysisInit() { +fun StorageComponentContainer.javaAnalysisInit() { get().initialize() get().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().initialize(get()) +} + class ContainerForTopDownAnalyzerForJvm(container: StorageComponentContainer) { val lazyTopDownAnalyzerForTopLevel: LazyTopDownAnalyzerForTopLevel by container val javaDescriptorResolver: JavaDescriptorResolver by container diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index 2c9c28ece8c..88b01884d92 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -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; } diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt b/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt index 45973a32cdb..390352dd9c6 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt @@ -48,7 +48,6 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment() fun testAllListedSignaturesExistInJdk() { val jvmBuiltIns = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS) val emptyModule = KotlinTestUtils.createEmptyModule("", JvmPlatform, jvmBuiltIns) - jvmBuiltIns.setOwnerModuleDescriptor(emptyModule) val moduleContext = ModuleContext(emptyModule, environment.project) val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList()) diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java index bc940ccd924..dc5c44c230c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java @@ -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 diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt index ee48cba330c..44764c6325e 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt @@ -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) } diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt index 755bf1ebc54..7f770004bdf 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt @@ -56,7 +56,6 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment() val jvmBuiltIns = JvmBuiltIns(LockBasedStorageManager.NO_LOCKS) val emptyModule = KotlinTestUtils.createEmptyModule("", JvmPlatform, jvmBuiltIns) - jvmBuiltIns.setOwnerModuleDescriptor(emptyModule) val moduleContext = ModuleContext(emptyModule, environment.project) val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList()) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt index c20e3c71929..63b22d78239 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt @@ -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 ) } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JvmBuiltIns.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JvmBuiltIns.kt index d26c637170e..cb9ec579dd4 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JvmBuiltIns.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/platform/JvmBuiltIns.kt @@ -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 { diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt index 32c5c0ed5e7..ef2664b350f 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt @@ -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) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index 7bf099d60bf..b2eb4b6fb2a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -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