IDE: Refactor NativePlatformKindResolution & NativeResolverForModuleFactory

This commit is contained in:
Dmitriy Dolovov
2020-03-20 18:40:36 +07:00
parent 98877eb87e
commit c8a9b88504
2 changed files with 77 additions and 91 deletions
@@ -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<LibraryInfo> {
@@ -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<NativeKlibLibraryInfo>()
.firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible }
}
}
private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? =
dependencies().lazyClosure { it.dependencies() }
.filterIsInstance<NativeKlibLibraryInfo>()
.firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible }
class NativeKlibLibraryInfo(project: Project, library: Library, libraryRoot: String) :
AbstractKlibLibraryInfo(project, library, libraryRoot) {
@@ -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<ResolveSession>().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)
}