From c8a9b885044763eba3fb9e7f4ba07a81ab2cd829 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 20 Mar 2020 18:40:36 +0700 Subject: [PATCH] IDE: Refactor NativePlatformKindResolution & NativeResolverForModuleFactory --- .../ide/konan/NativePlatformKindResolution.kt | 146 +++++++++--------- .../NativeResolverForModuleFactory.kt | 22 +-- 2 files changed, 77 insertions(+), 91 deletions(-) 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 ea1cbce0dd1..e7b3c7044c6 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 @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.BuiltInsCacheKey import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME import org.jetbrains.kotlin.konan.util.KlibMetadataFactories -import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.isInterop import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind @@ -50,30 +49,6 @@ import org.jetbrains.kotlin.idea.klib.readSafe import org.jetbrains.kotlin.idea.klib.AbstractKlibLibraryInfo import org.jetbrains.kotlin.idea.klib.isKlibLibraryRootForPlatform -private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) - -fun KotlinLibrary.createPackageFragmentProvider( - storageManager: StorageManager, - languageVersionSettings: LanguageVersionSettings, - moduleDescriptor: ModuleDescriptor -): PackageFragmentProvider? { - if (!getCompatibilityInfo().isCompatible) return null - - val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(this) - - val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings) - - return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( - this, - CachingIdeKonanLibraryMetadataLoader, - libraryProto.packageFragmentNameList, - storageManager, - moduleDescriptor, - deserializationConfiguration, - null - ) -} - class NativePlatformKindResolution : IdePlatformKindResolution { override fun createLibraryInfo(project: Project, library: Library): List { @@ -89,14 +64,8 @@ class NativePlatformKindResolution : IdePlatformKindResolution { storageManager: StorageManager, languageVersionSettings: LanguageVersionSettings, moduleDescriptor: ModuleDescriptor - ): PackageFragmentProvider? { - val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null - return library.createPackageFragmentProvider( - storageManager, - languageVersionSettings, - moduleDescriptor - ) - } + ): PackageFragmentProvider? = + createLibraryPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor) override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean = virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform) @@ -120,59 +89,82 @@ class NativePlatformKindResolution : IdePlatformKindResolution { createKotlinNativeBuiltIns(moduleInfo, projectContext) object NativeBuiltInsCacheKey : BuiltInsCacheKey -} -private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns { + companion object { + private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) - val project = projectContext.project - val storageManager = projectContext.storageManager + fun createLibraryPackageFragmentProvider( + moduleInfo: ModuleInfo, + storageManager: StorageManager, + languageVersionSettings: LanguageVersionSettings, + moduleDescriptor: ModuleDescriptor + ): PackageFragmentProvider? { + val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null + if (!library.getCompatibilityInfo().isCompatible) return null - val stdlibInfo = moduleInfo.findNativeStdlib() ?: return DefaultBuiltIns.Instance - val library = stdlibInfo.resolvedKotlinLibrary + val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library) + val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings) - val builtInsModule = NativeFactories.DefaultDescriptorFactory.createDescriptorAndNewBuiltIns( - KotlinBuiltIns.BUILTINS_MODULE_NAME, - storageManager, - DeserializedKlibModuleOrigin(library), - stdlibInfo.capabilities - ) - - val languageSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(stdlibInfo, project, isReleaseCoroutines = false) - val deserializationConfiguration = CompilerDeserializationConfiguration(languageSettings) - - val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library) - - val stdlibFragmentProvider = NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( - library, - CachingIdeKonanLibraryMetadataLoader, - libraryProto.packageFragmentNameList, - storageManager, - builtInsModule, - deserializationConfiguration, - null - ) - - builtInsModule.initialize( - CompositePackageFragmentProvider( - listOf( - stdlibFragmentProvider, - functionInterfacePackageFragmentProvider(storageManager, builtInsModule), - (NativeFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl) - .createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule) + return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( + library, + CachingIdeKonanLibraryMetadataLoader, + libraryProto.packageFragmentNameList, + storageManager, + moduleDescriptor, + deserializationConfiguration, + null ) - ) - ) + } - builtInsModule.setDependencies(listOf(builtInsModule)) + private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns { + val stdlibInfo = moduleInfo.findNativeStdlib() ?: return DefaultBuiltIns.Instance - return builtInsModule.builtIns + val project = projectContext.project + val storageManager = projectContext.storageManager + + val builtInsModule = NativeFactories.DefaultDescriptorFactory.createDescriptorAndNewBuiltIns( + KotlinBuiltIns.BUILTINS_MODULE_NAME, + storageManager, + DeserializedKlibModuleOrigin(stdlibInfo.resolvedKotlinLibrary), + stdlibInfo.capabilities + ) + + val languageVersionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings( + stdlibInfo, + project, + isReleaseCoroutines = false + ) + + val stdlibPackageFragmentProvider = createLibraryPackageFragmentProvider( + stdlibInfo, + storageManager, + languageVersionSettings, + builtInsModule + ) ?: return DefaultBuiltIns.Instance + + builtInsModule.initialize( + CompositePackageFragmentProvider( + listOf( + stdlibPackageFragmentProvider, + functionInterfacePackageFragmentProvider(storageManager, builtInsModule), + (NativeFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl) + .createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule) + ) + ) + ) + + builtInsModule.setDependencies(listOf(builtInsModule)) + + return builtInsModule.builtIns + } + + private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? = + dependencies().lazyClosure { it.dependencies() } + .filterIsInstance() + .firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible } + } } -private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? = - dependencies().lazyClosure { it.dependencies() } - .filterIsInstance() - .firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible } - class NativeKlibLibraryInfo(project: Project, library: Library, libraryRoot: String) : AbstractKlibLibraryInfo(project, library, libraryRoot) { 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 cd2e9b38030..aced3e69d4a 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,8 +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.NativeKlibLibraryInfo -import org.jetbrains.kotlin.ide.konan.createPackageFragmentProvider +import org.jetbrains.kotlin.ide.konan.NativePlatformKindResolution import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer @@ -57,18 +56,13 @@ class NativeResolverForModuleFactory( val packageFragmentProvider = container.get().packageFragmentProvider val fragmentProviders = mutableListOf(packageFragmentProvider) - val moduleInfo = moduleContent.moduleInfo - - if (moduleInfo is NativeKlibLibraryInfo) { - val libPackageFragmentProvider = - moduleInfo.resolvedKotlinLibrary.createPackageFragmentProvider( - moduleContext.storageManager, - languageVersionSettings, - moduleDescriptor - ) - - fragmentProviders.addIfNotNull(libPackageFragmentProvider) - } + val libraryPackageFragmentProvider = NativePlatformKindResolution.createLibraryPackageFragmentProvider( + moduleContent.moduleInfo, + moduleContext.storageManager, + languageVersionSettings, + moduleDescriptor + ) + fragmentProviders.addIfNotNull(libraryPackageFragmentProvider) return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container) }