diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt index 90f9276e890..22827bfdcf7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/CommonPlatformKindResolution.kt @@ -72,6 +72,22 @@ class CommonPlatformKindResolution : IdePlatformKindResolution { } } + override fun createKlibPackageFragmentProvider( + moduleInfo: ModuleInfo, + storageManager: StorageManager, + languageVersionSettings: LanguageVersionSettings, + moduleDescriptor: ModuleDescriptor + ): PackageFragmentProvider? { + return (moduleInfo as? CommonKlibLibraryInfo) + ?.resolvedKotlinLibrary + ?.createKlibPackageFragmentProvider( + storageManager = storageManager, + metadataModuleDescriptorFactory = metadataModuleDescriptorFactory, + languageVersionSettings = languageVersionSettings, + moduleDescriptor = moduleDescriptor + ) + } + override fun createResolverForModuleFactory( settings: PlatformAnalysisParameters, environment: TargetEnvironment, @@ -94,22 +110,6 @@ class CommonPlatformKindResolution : IdePlatformKindResolution { metadataFactories.flexibleTypeDeserializer, metadataFactories.platformDependentTypeTransformer ) - - fun createCommonKlibPackageFragmentProvider( - moduleInfo: ModuleInfo, - storageManager: StorageManager, - languageVersionSettings: LanguageVersionSettings, - moduleDescriptor: ModuleDescriptor - ): PackageFragmentProvider? { - return (moduleInfo as? CommonKlibLibraryInfo) - ?.resolvedKotlinLibrary - ?.createKlibPackageFragmentProvider( - storageManager = storageManager, - metadataModuleDescriptorFactory = metadataModuleDescriptorFactory, - languageVersionSettings = languageVersionSettings, - moduleDescriptor = moduleDescriptor - ) - } } } 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 b3e71ca9611..ecc934399ba 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 @@ -11,7 +11,6 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.analyzer.common.CommonAnalysisParameters import org.jetbrains.kotlin.analyzer.common.configureCommonSpecificComponents -import org.jetbrains.kotlin.caches.resolve.CommonPlatformKindResolution.Companion.createCommonKlibPackageFragmentProvider import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.context.ModuleContext @@ -29,10 +28,8 @@ import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.platform.* import org.jetbrains.kotlin.platform.TargetPlatform -import org.jetbrains.kotlin.platform.has -import org.jetbrains.kotlin.platform.idePlatformKind -import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.platform.js.isJs import org.jetbrains.kotlin.platform.jvm.JvmPlatform import org.jetbrains.kotlin.platform.konan.NativePlatform @@ -122,7 +119,7 @@ class CompositeResolverForModuleFactory( val metadataProvider = container.get() - val klibMetadataProvider = createCommonKlibPackageFragmentProvider( + val klibMetadataProvider = CommonPlatforms.defaultCommonPlatform.idePlatformKind.resolution.createKlibPackageFragmentProvider( moduleInfo, moduleContext.storageManager, container.get(), @@ -137,16 +134,15 @@ class CompositeResolverForModuleFactory( private fun getKonanProvidersIfAny(moduleInfo: ModuleInfo, container: StorageComponentContainer): List { if (!targetPlatform.has()) return emptyList() - val resolution = NativePlatforms.defaultNativePlatform.idePlatformKind.resolution - val konanProvider = resolution.createPlatformSpecificPackageFragmentProvider( - moduleInfo, - container.get(), - container.get(), - container.get() - ) ?: return emptyList() - - return listOf(konanProvider) + return listOfNotNull( + NativePlatforms.defaultNativePlatform.idePlatformKind.resolution.createKlibPackageFragmentProvider( + moduleInfo, + container.get(), + container.get(), + container.get() + ) + ) } private fun getJsProvidersIfAny( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt index b5cefcb18b8..2b7a89c3bf8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/IdePlatformKindResolution.kt @@ -51,7 +51,7 @@ interface IdePlatformKindResolution { fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean - fun createPlatformSpecificPackageFragmentProvider( + fun createKlibPackageFragmentProvider( moduleInfo: ModuleInfo, storageManager: StorageManager, languageVersionSettings: LanguageVersionSettings, @@ -60,9 +60,7 @@ interface IdePlatformKindResolution { val libraryKind: PersistentLibraryKind<*>? - fun createLibraryInfo(project: Project, library: Library): List { - return listOf(LibraryInfo(project, library)) - } + fun createLibraryInfo(project: Project, library: Library): List = listOf(LibraryInfo(project, library)) companion object : ApplicationExtensionDescriptor( "org.jetbrains.kotlin.idePlatformKindResolution", IdePlatformKindResolution::class.java diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt index 2d0781f1a52..06c497a9053 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsPlatformKindResolution.kt @@ -78,6 +78,22 @@ class JsPlatformKindResolution : IdePlatformKindResolution { } } + override fun createKlibPackageFragmentProvider( + moduleInfo: ModuleInfo, + storageManager: StorageManager, + languageVersionSettings: LanguageVersionSettings, + moduleDescriptor: ModuleDescriptor + ): PackageFragmentProvider? { + return (moduleInfo as? JsKlibLibraryInfo) + ?.resolvedKotlinLibrary + ?.createKlibPackageFragmentProvider( + storageManager = storageManager, + metadataModuleDescriptorFactory = metadataModuleDescriptorFactory, + languageVersionSettings = languageVersionSettings, + moduleDescriptor = moduleDescriptor + ) + } + companion object { private val metadataFactories = KlibMetadataFactories({ DefaultBuiltIns.Instance }, DynamicTypeDeserializer) @@ -87,22 +103,6 @@ class JsPlatformKindResolution : IdePlatformKindResolution { metadataFactories.flexibleTypeDeserializer, metadataFactories.platformDependentTypeTransformer ) - - fun createJsKlibPackageFragmentProvider( - moduleInfo: ModuleInfo, - storageManager: StorageManager, - languageVersionSettings: LanguageVersionSettings, - moduleDescriptor: ModuleDescriptor - ): PackageFragmentProvider? { - return (moduleInfo as? JsKlibLibraryInfo) - ?.resolvedKotlinLibrary - ?.createKlibPackageFragmentProvider( - storageManager = storageManager, - metadataModuleDescriptorFactory = metadataModuleDescriptorFactory, - languageVersionSettings = languageVersionSettings, - moduleDescriptor = moduleDescriptor - ) - } } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt index d07a3629b7d..4d036e712e2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/caches/resolve/JsResolverForModuleFactory.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.caches.resolve import org.jetbrains.kotlin.analyzer.* -import org.jetbrains.kotlin.caches.resolve.JsPlatformKindResolution.Companion.createJsKlibPackageFragmentProvider import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.get @@ -17,6 +16,8 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.frontend.di.createContainerForLazyResolve import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices +import org.jetbrains.kotlin.platform.idePlatformKind +import org.jetbrains.kotlin.platform.js.JsPlatforms import org.jetbrains.kotlin.resolve.BindingTraceContext import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.lazy.ResolveSession @@ -74,7 +75,7 @@ internal fun createPackageFragmentProvider( ): List = when (moduleInfo) { is JsKlibLibraryInfo -> { listOfNotNull( - createJsKlibPackageFragmentProvider( + JsPlatforms.defaultJsPlatform.idePlatformKind.resolution.createKlibPackageFragmentProvider( moduleInfo, moduleContext.storageManager, container.get(), 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 736097cde4f..f3bb6f6424b 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 @@ -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() 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 767bc0e822e..52a46728a60 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 @@ -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().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))