From f4aa0fad44c65b88b1d3d1f5bbf00810feb5f6c3 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 20 Mar 2020 19:36:00 +0700 Subject: [PATCH] IDE: Unify creation of KLIB package fragment providers (common, native) --- .../CompositeResolverForModuleFactory.kt | 19 +++++------- .../org/jetbrains/kotlin/idea/klib/utils.kt | 29 ++++++++++++++++++- .../ide/konan/NativePlatformKindResolution.kt | 29 +++++++------------ .../NativeResolverForModuleFactory.kt | 6 ++-- 4 files changed, 49 insertions(+), 34 deletions(-) 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 dbf4a46b0f0..daded33ad10 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 @@ -23,7 +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.CachingIdeKlibMetadataLoader +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 @@ -130,12 +130,10 @@ class CompositeResolverForModuleFactory( val metadataProvder = container.get() var klibMetadataProvider: PackageFragmentProvider? = null - if (moduleInfo is CommonKlibLibraryInfo && moduleInfo.compatibilityInfo.isCompatible) { + if (moduleInfo is CommonKlibLibraryInfo) { val library = moduleInfo.resolvedKotlinLibrary val languageVersionSettings = container.get() - val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList - val metadataFactories = KlibMetadataFactories( { DefaultBuiltIns.Instance }, NullFlexibleTypeDeserializer @@ -148,14 +146,11 @@ class CompositeResolverForModuleFactory( metadataFactories.platformDependentTypeTransformer ) - klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider( - library, - packageAccessHandler = CachingIdeKlibMetadataLoader, - packageFragmentNames = packageFragmentNames, - storageManager = moduleContext.storageManager, - moduleDescriptor = moduleDescriptor, - configuration = CompilerDeserializationConfiguration(languageVersionSettings), - compositePackageFragmentAddend = null + klibMetadataProvider = library.createKlibPackageFragmentProvider( + moduleContext.storageManager, + klibMetadataModuleDescriptorFactory, + languageVersionSettings, + moduleDescriptor ) } return listOfNotNull(metadataProvder, klibMetadataProvider) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/klib/utils.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/klib/utils.kt index 85acbf177fa..cba85095980 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/klib/utils.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/klib/utils.kt @@ -12,6 +12,10 @@ import com.intellij.psi.SingleRootFileViewProvider import com.intellij.psi.impl.PsiFileFactoryImpl import com.intellij.psi.stubs.PsiFileStub import com.intellij.testFramework.LightVirtualFile +import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataModuleDescriptorFactory +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.library.* @@ -22,6 +26,8 @@ import org.jetbrains.kotlin.platform.js.isJs import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.konan.isNative import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes +import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration +import org.jetbrains.kotlin.storage.StorageManager import java.io.IOException import java.util.* @@ -89,4 +95,25 @@ fun createFileStub(project: Project, text: String): PsiFileStub<*> { val psiFileFactory = PsiFileFactory.getInstance(project) as PsiFileFactoryImpl val file = psiFileFactory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, false, false)!! return KtStubElementTypes.FILE.builder.buildStubTree(file) as PsiFileStub<*> -} \ No newline at end of file +} + +fun KotlinLibrary.createKlibPackageFragmentProvider( + storageManager: StorageManager, + metadataModuleDescriptorFactory: KlibMetadataModuleDescriptorFactory, + languageVersionSettings: LanguageVersionSettings, + moduleDescriptor: ModuleDescriptor +): PackageFragmentProvider? { + if (!getCompatibilityInfo().isCompatible) return null + + val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(this).packageFragmentNameList + + return metadataModuleDescriptorFactory.createPackageFragmentProvider( + library = this, + packageAccessHandler = CachingIdeKlibMetadataLoader, + packageFragmentNames = packageFragmentNames, + storageManager = storageManager, + moduleDescriptor = moduleDescriptor, + configuration = CompilerDeserializationConfiguration(languageVersionSettings), + compositePackageFragmentAddend = null + ) +} diff --git a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/NativePlatformKindResolution.kt b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/NativePlatformKindResolution.kt index d2f16c84ccf..96b5bc67bfb 100644 --- a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/NativePlatformKindResolution.kt +++ b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/NativePlatformKindResolution.kt @@ -39,7 +39,6 @@ import org.jetbrains.kotlin.library.isInterop import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind import org.jetbrains.kotlin.platform.konan.KonanPlatforms -import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer @@ -62,7 +61,7 @@ class NativePlatformKindResolution : IdePlatformKindResolution { languageVersionSettings: LanguageVersionSettings, moduleDescriptor: ModuleDescriptor ): PackageFragmentProvider? = - createLibraryPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor) + createNativeKlibPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor) override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean = virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform) @@ -90,26 +89,20 @@ class NativePlatformKindResolution : IdePlatformKindResolution { companion object { private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) - fun createLibraryPackageFragmentProvider( + fun createNativeKlibPackageFragmentProvider( moduleInfo: ModuleInfo, storageManager: StorageManager, languageVersionSettings: LanguageVersionSettings, moduleDescriptor: ModuleDescriptor ): PackageFragmentProvider? { - val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null - if (!library.getCompatibilityInfo().isCompatible) return null - - val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList - - return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( - library = library, - packageAccessHandler = CachingIdeKlibMetadataLoader, - packageFragmentNames = packageFragmentNames, - storageManager = storageManager, - moduleDescriptor = moduleDescriptor, - configuration = CompilerDeserializationConfiguration(languageVersionSettings), - compositePackageFragmentAddend = null - ) + return (moduleInfo as? NativeKlibLibraryInfo) + ?.resolvedKotlinLibrary + ?.createKlibPackageFragmentProvider( + storageManager = storageManager, + metadataModuleDescriptorFactory = NativeFactories.DefaultDeserializedDescriptorFactory, + languageVersionSettings = languageVersionSettings, + moduleDescriptor = moduleDescriptor + ) } private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns { @@ -131,7 +124,7 @@ class NativePlatformKindResolution : IdePlatformKindResolution { isReleaseCoroutines = false ) - val stdlibPackageFragmentProvider = createLibraryPackageFragmentProvider( + val stdlibPackageFragmentProvider = createNativeKlibPackageFragmentProvider( stdlibInfo, storageManager, languageVersionSettings, diff --git a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/analyzer/NativeResolverForModuleFactory.kt b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/analyzer/NativeResolverForModuleFactory.kt index aced3e69d4a..cf94e392ba8 100644 --- a/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/analyzer/NativeResolverForModuleFactory.kt +++ b/idea/idea-native/src/org/jetbrains/kotlin/ide/konan/analyzer/NativeResolverForModuleFactory.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve -import org.jetbrains.kotlin.ide.konan.NativePlatformKindResolution +import org.jetbrains.kotlin.ide.konan.NativePlatformKindResolution.Companion.createNativeKlibPackageFragmentProvider import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer @@ -56,13 +56,13 @@ class NativeResolverForModuleFactory( val packageFragmentProvider = container.get().packageFragmentProvider val fragmentProviders = mutableListOf(packageFragmentProvider) - val libraryPackageFragmentProvider = NativePlatformKindResolution.createLibraryPackageFragmentProvider( + val klibPackageFragmentProvider = createNativeKlibPackageFragmentProvider( moduleContent.moduleInfo, moduleContext.storageManager, languageVersionSettings, moduleDescriptor ) - fragmentProviders.addIfNotNull(libraryPackageFragmentProvider) + fragmentProviders.addIfNotNull(klibPackageFragmentProvider) return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container) }