diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt index 8d2e3849810..90f9276e890 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt @@ -18,18 +18,26 @@ import org.jetbrains.kotlin.analyzer.common.CommonAnalysisParameters import org.jetbrains.kotlin.analyzer.common.CommonResolverForModuleFactory import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.context.ProjectContext +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.idea.caches.project.LibraryInfo import org.jetbrains.kotlin.idea.caches.project.SdkInfo import org.jetbrains.kotlin.idea.caches.resolve.BuiltInsCacheKey import org.jetbrains.kotlin.idea.framework.CommonLibraryKind import org.jetbrains.kotlin.idea.klib.AbstractKlibLibraryInfo +import org.jetbrains.kotlin.idea.klib.createKlibPackageFragmentProvider import org.jetbrains.kotlin.idea.klib.isKlibLibraryRootForPlatform +import org.jetbrains.kotlin.konan.util.KlibMetadataFactories +import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.platform.CommonPlatforms import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.impl.CommonIdePlatformKind import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragment +import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl +import org.jetbrains.kotlin.storage.StorageManager class CommonPlatformKindResolution : IdePlatformKindResolution { override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean { @@ -76,6 +84,33 @@ class CommonPlatformKindResolution : IdePlatformKindResolution { shouldCheckExpectActual = true ) } + + companion object { + private val metadataFactories = KlibMetadataFactories({ DefaultBuiltIns.Instance }, NullFlexibleTypeDeserializer) + + private val metadataModuleDescriptorFactory = KlibMetadataModuleDescriptorFactoryImpl( + metadataFactories.DefaultDescriptorFactory, + metadataFactories.DefaultPackageFragmentsFactory, + metadataFactories.flexibleTypeDeserializer, + metadataFactories.platformDependentTypeTransformer + ) + + fun createCommonKlibPackageFragmentProvider( + moduleInfo: ModuleInfo, + storageManager: StorageManager, + languageVersionSettings: LanguageVersionSettings, + moduleDescriptor: ModuleDescriptor + ): PackageFragmentProvider? { + return (moduleInfo as? CommonKlibLibraryInfo) + ?.resolvedKotlinLibrary + ?.createKlibPackageFragmentProvider( + storageManager = storageManager, + metadataModuleDescriptorFactory = metadataModuleDescriptorFactory, + languageVersionSettings = languageVersionSettings, + moduleDescriptor = moduleDescriptor + ) + } + } } class CommonKlibLibraryInfo(project: Project, library: Library, libraryRoot: String) : diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt index daded33ad10..41a9428d46b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CompositeResolverForModuleFactory.kt @@ -11,7 +11,7 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.analyzer.common.CommonAnalysisParameters import org.jetbrains.kotlin.analyzer.common.configureCommonSpecificComponents -import org.jetbrains.kotlin.builtins.DefaultBuiltIns +import org.jetbrains.kotlin.caches.resolve.CommonPlatformKindResolution.Companion.createCommonKlibPackageFragmentProvider import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.context.ModuleContext @@ -23,10 +23,7 @@ import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents import org.jetbrains.kotlin.frontend.java.di.initializeJavaSpecificComponents -import org.jetbrains.kotlin.idea.klib.createKlibPackageFragmentProvider import org.jetbrains.kotlin.idea.project.IdeaEnvironment -import org.jetbrains.kotlin.incremental.components.LookupTracker -import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl import org.jetbrains.kotlin.load.kotlin.PackagePartProvider @@ -49,12 +46,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmentProvider import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider -import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil -import org.jetbrains.kotlin.serialization.js.createKotlinJavascriptPackageFragmentProvider -import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer -import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.utils.KotlinJavascriptMetadataUtils class CompositeResolverForModuleFactory( private val commonAnalysisParameters: CommonAnalysisParameters, @@ -127,33 +119,17 @@ class CompositeResolverForModuleFactory( container: StorageComponentContainer ): List { if (!targetPlatform.isCommon()) return emptyList() - val metadataProvder = container.get() - var klibMetadataProvider: PackageFragmentProvider? = null - if (moduleInfo is CommonKlibLibraryInfo) { - val library = moduleInfo.resolvedKotlinLibrary - val languageVersionSettings = container.get() + val metadataProvider = container.get() - val metadataFactories = KlibMetadataFactories( - { DefaultBuiltIns.Instance }, - NullFlexibleTypeDeserializer - ) + val klibMetadataProvider = createCommonKlibPackageFragmentProvider( + moduleInfo, + moduleContext.storageManager, + container.get(), + moduleDescriptor + ) - val klibMetadataModuleDescriptorFactory = KlibMetadataModuleDescriptorFactoryImpl( - metadataFactories.DefaultDescriptorFactory, - metadataFactories.DefaultPackageFragmentsFactory, - metadataFactories.flexibleTypeDeserializer, - metadataFactories.platformDependentTypeTransformer - ) - - klibMetadataProvider = library.createKlibPackageFragmentProvider( - moduleContext.storageManager, - klibMetadataModuleDescriptorFactory, - languageVersionSettings, - moduleDescriptor - ) - } - return listOfNotNull(metadataProvder, klibMetadataProvider) + return listOfNotNull(metadataProvider, klibMetadataProvider) } private fun getJvmProvidersIfAny(container: StorageComponentContainer): List =