IDE: Unify creation of KLIB package fragment providers (common, native)

This commit is contained in:
Dmitriy Dolovov
2020-03-20 19:36:00 +07:00
parent bf4a153c0c
commit f4aa0fad44
4 changed files with 49 additions and 34 deletions
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents
import org.jetbrains.kotlin.frontend.java.di.initializeJavaSpecificComponents import org.jetbrains.kotlin.frontend.java.di.initializeJavaSpecificComponents
import org.jetbrains.kotlin.idea.klib.CachingIdeKlibMetadataLoader import org.jetbrains.kotlin.idea.klib.createKlibPackageFragmentProvider
import org.jetbrains.kotlin.idea.project.IdeaEnvironment import org.jetbrains.kotlin.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
@@ -130,12 +130,10 @@ class CompositeResolverForModuleFactory(
val metadataProvder = container.get<MetadataPackageFragmentProvider>() val metadataProvder = container.get<MetadataPackageFragmentProvider>()
var klibMetadataProvider: PackageFragmentProvider? = null var klibMetadataProvider: PackageFragmentProvider? = null
if (moduleInfo is CommonKlibLibraryInfo && moduleInfo.compatibilityInfo.isCompatible) { if (moduleInfo is CommonKlibLibraryInfo) {
val library = moduleInfo.resolvedKotlinLibrary val library = moduleInfo.resolvedKotlinLibrary
val languageVersionSettings = container.get<LanguageVersionSettings>() val languageVersionSettings = container.get<LanguageVersionSettings>()
val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList
val metadataFactories = KlibMetadataFactories( val metadataFactories = KlibMetadataFactories(
{ DefaultBuiltIns.Instance }, { DefaultBuiltIns.Instance },
NullFlexibleTypeDeserializer NullFlexibleTypeDeserializer
@@ -148,14 +146,11 @@ class CompositeResolverForModuleFactory(
metadataFactories.platformDependentTypeTransformer metadataFactories.platformDependentTypeTransformer
) )
klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider( klibMetadataProvider = library.createKlibPackageFragmentProvider(
library, moduleContext.storageManager,
packageAccessHandler = CachingIdeKlibMetadataLoader, klibMetadataModuleDescriptorFactory,
packageFragmentNames = packageFragmentNames, languageVersionSettings,
storageManager = moduleContext.storageManager, moduleDescriptor
moduleDescriptor = moduleDescriptor,
configuration = CompilerDeserializationConfiguration(languageVersionSettings),
compositePackageFragmentAddend = null
) )
} }
return listOfNotNull(metadataProvder, klibMetadataProvider) return listOfNotNull(metadataProvder, klibMetadataProvider)
@@ -12,6 +12,10 @@ import com.intellij.psi.SingleRootFileViewProvider
import com.intellij.psi.impl.PsiFileFactoryImpl import com.intellij.psi.impl.PsiFileFactoryImpl
import com.intellij.psi.stubs.PsiFileStub import com.intellij.psi.stubs.PsiFileStub
import com.intellij.testFramework.LightVirtualFile import com.intellij.testFramework.LightVirtualFile
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataModuleDescriptorFactory
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.*
@@ -22,6 +26,8 @@ import org.jetbrains.kotlin.platform.js.isJs
import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.jvm.isJvm
import org.jetbrains.kotlin.platform.konan.isNative import org.jetbrains.kotlin.platform.konan.isNative
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.storage.StorageManager
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
@@ -89,4 +95,25 @@ fun createFileStub(project: Project, text: String): PsiFileStub<*> {
val psiFileFactory = PsiFileFactory.getInstance(project) as PsiFileFactoryImpl val psiFileFactory = PsiFileFactory.getInstance(project) as PsiFileFactoryImpl
val file = psiFileFactory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, false, false)!! val file = psiFileFactory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, false, false)!!
return KtStubElementTypes.FILE.builder.buildStubTree(file) as PsiFileStub<*> return KtStubElementTypes.FILE.builder.buildStubTree(file) as PsiFileStub<*>
} }
fun KotlinLibrary.createKlibPackageFragmentProvider(
storageManager: StorageManager,
metadataModuleDescriptorFactory: KlibMetadataModuleDescriptorFactory,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? {
if (!getCompatibilityInfo().isCompatible) return null
val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(this).packageFragmentNameList
return metadataModuleDescriptorFactory.createPackageFragmentProvider(
library = this,
packageAccessHandler = CachingIdeKlibMetadataLoader,
packageFragmentNames = packageFragmentNames,
storageManager = storageManager,
moduleDescriptor = moduleDescriptor,
configuration = CompilerDeserializationConfiguration(languageVersionSettings),
compositePackageFragmentAddend = null
)
}
@@ -39,7 +39,6 @@ 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
import org.jetbrains.kotlin.platform.konan.KonanPlatforms import org.jetbrains.kotlin.platform.konan.KonanPlatforms
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion
import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer
@@ -62,7 +61,7 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? = ): PackageFragmentProvider? =
createLibraryPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor) createNativeKlibPackageFragmentProvider(moduleInfo, storageManager, languageVersionSettings, moduleDescriptor)
override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean = override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean =
virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform) virtualFile.isKlibLibraryRootForPlatform(KonanPlatforms.defaultKonanPlatform)
@@ -90,26 +89,20 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
companion object { companion object {
private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer) private val NativeFactories = KlibMetadataFactories(::KonanBuiltIns, NullFlexibleTypeDeserializer)
fun createLibraryPackageFragmentProvider( fun createNativeKlibPackageFragmentProvider(
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
storageManager: StorageManager, storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider? { ): PackageFragmentProvider? {
val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null return (moduleInfo as? NativeKlibLibraryInfo)
if (!library.getCompatibilityInfo().isCompatible) return null ?.resolvedKotlinLibrary
?.createKlibPackageFragmentProvider(
val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList storageManager = storageManager,
metadataModuleDescriptorFactory = NativeFactories.DefaultDeserializedDescriptorFactory,
return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( languageVersionSettings = languageVersionSettings,
library = library, moduleDescriptor = moduleDescriptor
packageAccessHandler = CachingIdeKlibMetadataLoader, )
packageFragmentNames = packageFragmentNames,
storageManager = storageManager,
moduleDescriptor = moduleDescriptor,
configuration = CompilerDeserializationConfiguration(languageVersionSettings),
compositePackageFragmentAddend = null
)
} }
private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns { private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: ProjectContext): KotlinBuiltIns {
@@ -131,7 +124,7 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
isReleaseCoroutines = false isReleaseCoroutines = false
) )
val stdlibPackageFragmentProvider = createLibraryPackageFragmentProvider( val stdlibPackageFragmentProvider = createNativeKlibPackageFragmentProvider(
stdlibInfo, stdlibInfo,
storageManager, storageManager,
languageVersionSettings, languageVersionSettings,
@@ -12,7 +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.NativePlatformKindResolution import org.jetbrains.kotlin.ide.konan.NativePlatformKindResolution.Companion.createNativeKlibPackageFragmentProvider
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
@@ -56,13 +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 libraryPackageFragmentProvider = NativePlatformKindResolution.createLibraryPackageFragmentProvider( val klibPackageFragmentProvider = createNativeKlibPackageFragmentProvider(
moduleContent.moduleInfo, moduleContent.moduleInfo,
moduleContext.storageManager, moduleContext.storageManager,
languageVersionSettings, languageVersionSettings,
moduleDescriptor moduleDescriptor
) )
fragmentProviders.addIfNotNull(libraryPackageFragmentProvider) fragmentProviders.addIfNotNull(klibPackageFragmentProvider)
return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container) return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container)
} }