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.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.isInterop import org.jetbrains.kotlin.library.isInterop
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind 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.AbstractKlibLibraryInfo
import org.jetbrains.kotlin.idea.klib.isKlibLibraryRootForPlatform 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 { class NativePlatformKindResolution : IdePlatformKindResolution {
override fun createLibraryInfo(project: Project, library: Library): List<LibraryInfo> { override fun createLibraryInfo(project: Project, library: Library): List<LibraryInfo> {
@@ -89,14 +64,8 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
storageManager: StorageManager, storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? { ): PackageFragmentProvider? =
val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null createLibraryPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor)
return library.createPackageFragmentProvider(
storageManager,
languageVersionSettings,
moduleDescriptor
)
}
override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean = override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean =
virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform) virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform)
@@ -120,42 +89,63 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
createKotlinNativeBuiltIns(moduleInfo, projectContext) createKotlinNativeBuiltIns(moduleInfo, projectContext)
object NativeBuiltInsCacheKey : BuiltInsCacheKey object NativeBuiltInsCacheKey : BuiltInsCacheKey
}
private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns { companion object {
private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer)
val project = projectContext.project fun createLibraryPackageFragmentProvider(
val storageManager = projectContext.storageManager moduleInfo: ModuleInfo,
storageManager: StorageManager,
val stdlibInfo = moduleInfo.findNativeStdlib() ?: return DefaultBuiltIns.Instance languageVersionSettings: LanguageVersionSettings,
val library = stdlibInfo.resolvedKotlinLibrary moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? {
val builtInsModule = NativeFactories.DefaultDescriptorFactory.createDescriptorAndNewBuiltIns( val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null
KotlinBuiltIns.BUILTINS_MODULE_NAME, if (!library.getCompatibilityInfo().isCompatible) return null
storageManager,
DeserializedKlibModuleOrigin(library),
stdlibInfo.capabilities
)
val languageSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(stdlibInfo, project, isReleaseCoroutines = false)
val deserializationConfiguration = CompilerDeserializationConfiguration(languageSettings)
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library) val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library)
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
val stdlibFragmentProvider = NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
library, library,
CachingIdeKonanLibraryMetadataLoader, CachingIdeKonanLibraryMetadataLoader,
libraryProto.packageFragmentNameList, libraryProto.packageFragmentNameList,
storageManager, storageManager,
builtInsModule, moduleDescriptor,
deserializationConfiguration, deserializationConfiguration,
null null
) )
}
private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns {
val stdlibInfo = moduleInfo.findNativeStdlib() ?: return DefaultBuiltIns.Instance
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( builtInsModule.initialize(
CompositePackageFragmentProvider( CompositePackageFragmentProvider(
listOf( listOf(
stdlibFragmentProvider, stdlibPackageFragmentProvider,
functionInterfacePackageFragmentProvider(storageManager, builtInsModule), functionInterfacePackageFragmentProvider(storageManager, builtInsModule),
(NativeFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl) (NativeFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule) .createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
@@ -166,12 +156,14 @@ private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: P
builtInsModule.setDependencies(listOf(builtInsModule)) builtInsModule.setDependencies(listOf(builtInsModule))
return builtInsModule.builtIns return builtInsModule.builtIns
} }
private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? = private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? =
dependencies().lazyClosure { it.dependencies() } dependencies().lazyClosure { it.dependencies() }
.filterIsInstance<NativeKlibLibraryInfo>() .filterIsInstance<NativeKlibLibraryInfo>()
.firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible } .firstOrNull { it.isStdlib && it.compatibilityInfo.isCompatible }
}
}
class NativeKlibLibraryInfo(project: Project, library: Library, libraryRoot: String) : class NativeKlibLibraryInfo(project: Project, library: Library, libraryRoot: String) :
AbstractKlibLibraryInfo(project, library, libraryRoot) { 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.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve
import org.jetbrains.kotlin.ide.konan.NativeKlibLibraryInfo import org.jetbrains.kotlin.ide.konan.NativePlatformKindResolution
import org.jetbrains.kotlin.ide.konan.createPackageFragmentProvider
import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.jetbrains.kotlin.platform.konan.KonanPlatforms
import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer
@@ -57,18 +56,13 @@ class NativeResolverForModuleFactory(
val packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider val packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
val fragmentProviders = mutableListOf(packageFragmentProvider) val fragmentProviders = mutableListOf(packageFragmentProvider)
val moduleInfo = moduleContent.moduleInfo val libraryPackageFragmentProvider = NativePlatformKindResolution.createLibraryPackageFragmentProvider(
moduleContent.moduleInfo,
if (moduleInfo is NativeKlibLibraryInfo) {
val libPackageFragmentProvider =
moduleInfo.resolvedKotlinLibrary.createPackageFragmentProvider(
moduleContext.storageManager, moduleContext.storageManager,
languageVersionSettings, languageVersionSettings,
moduleDescriptor moduleDescriptor
) )
fragmentProviders.addIfNotNull(libraryPackageFragmentProvider)
fragmentProviders.addIfNotNull(libPackageFragmentProvider)
}
return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container) return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container)
} }