IDE: Don't use direct refs on IdePlatformKindResolution EP instances

This commit is contained in:
Dmitriy Dolovov
2020-03-31 19:36:40 +07:00
parent a2e2213d31
commit 5e1e9876fd
7 changed files with 109 additions and 120 deletions
@@ -55,13 +55,21 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
}
}
override fun createPlatformSpecificPackageFragmentProvider(
override fun createKlibPackageFragmentProvider(
moduleInfo: ModuleInfo,
storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? =
createNativeKlibPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor)
): PackageFragmentProvider? {
return (moduleInfo as? NativeKlibLibraryInfo)
?.resolvedKotlinLibrary
?.createKlibPackageFragmentProvider(
storageManager = storageManager,
metadataModuleDescriptorFactory = metadataFactories.DefaultDeserializedDescriptorFactory,
languageVersionSettings = languageVersionSettings,
moduleDescriptor = moduleDescriptor
)
}
override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean =
virtualFile.isKlibLibraryRootForPlatform(NativePlatforms.defaultNativePlatform)
@@ -84,69 +92,53 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
override fun createBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext, sdkDependency: SdkInfo?) =
createKotlinNativeBuiltIns(moduleInfo, projectContext)
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 = metadataFactories.DefaultDescriptorFactory.createDescriptorAndNewBuiltIns(
KotlinBuiltIns.BUILTINS_MODULE_NAME,
storageManager,
DeserializedKlibModuleOrigin(stdlibInfo.resolvedKotlinLibrary),
stdlibInfo.capabilities
)
val languageVersionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(
stdlibInfo,
project,
isReleaseCoroutines = false
)
val stdlibPackageFragmentProvider = createKlibPackageFragmentProvider(
stdlibInfo,
storageManager,
languageVersionSettings,
builtInsModule
) ?: return DefaultBuiltIns.Instance
builtInsModule.initialize(
CompositePackageFragmentProvider(
listOf(
stdlibPackageFragmentProvider,
functionInterfacePackageFragmentProvider(storageManager, builtInsModule),
(metadataFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
)
)
)
builtInsModule.setDependencies(listOf(builtInsModule))
return builtInsModule.builtIns
}
object NativeBuiltInsCacheKey : BuiltInsCacheKey
companion object {
private val metadataFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer)
fun createNativeKlibPackageFragmentProvider(
moduleInfo: ModuleInfo,
storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? {
return (moduleInfo as? NativeKlibLibraryInfo)
?.resolvedKotlinLibrary
?.createKlibPackageFragmentProvider(
storageManager = storageManager,
metadataModuleDescriptorFactory = metadataFactories.DefaultDeserializedDescriptorFactory,
languageVersionSettings = languageVersionSettings,
moduleDescriptor = moduleDescriptor
)
}
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 = metadataFactories.DefaultDescriptorFactory.createDescriptorAndNewBuiltIns(
KotlinBuiltIns.BUILTINS_MODULE_NAME,
storageManager,
DeserializedKlibModuleOrigin(stdlibInfo.resolvedKotlinLibrary),
stdlibInfo.capabilities
)
val languageVersionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(
stdlibInfo,
project,
isReleaseCoroutines = false
)
val stdlibPackageFragmentProvider = createNativeKlibPackageFragmentProvider(
stdlibInfo,
storageManager,
languageVersionSettings,
builtInsModule
) ?: return DefaultBuiltIns.Instance
builtInsModule.initialize(
CompositePackageFragmentProvider(
listOf(
stdlibPackageFragmentProvider,
functionInterfacePackageFragmentProvider(storageManager, builtInsModule),
(metadataFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
)
)
)
builtInsModule.setDependencies(listOf(builtInsModule))
return builtInsModule.builtIns
}
private fun ModuleInfo.findNativeStdlib(): NativeKlibLibraryInfo? =
dependencies().lazyClosure { it.dependencies() }
.filterIsInstance<NativeKlibLibraryInfo>()
@@ -6,14 +6,15 @@
package org.jetbrains.kotlin.ide.konan.analyzer
import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.caches.resolve.resolution
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.get
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.Companion.createNativeKlibPackageFragmentProvider
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.platform.idePlatformKind
import org.jetbrains.kotlin.platform.konan.NativePlatforms
import org.jetbrains.kotlin.resolve.CodeAnalyzerInitializer
import org.jetbrains.kotlin.resolve.TargetEnvironment
@@ -54,12 +55,13 @@ class NativeResolverForModuleFactory(
var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
val klibPackageFragmentProvider = createNativeKlibPackageFragmentProvider(
moduleContent.moduleInfo,
moduleContext.storageManager,
languageVersionSettings,
moduleDescriptor
)
val klibPackageFragmentProvider =
NativePlatforms.defaultNativePlatform.idePlatformKind.resolution.createKlibPackageFragmentProvider(
moduleContent.moduleInfo,
moduleContext.storageManager,
languageVersionSettings,
moduleDescriptor
)
if (klibPackageFragmentProvider != null) {
packageFragmentProvider = CompositePackageFragmentProvider(listOf(packageFragmentProvider, klibPackageFragmentProvider))