Use cache everywhere where K/N KLIBs are read in IDE

This commit is contained in:
Dmitriy Dolovov
2019-10-01 16:09:02 +07:00
committed by alexander-gorshenev
parent 185b10fa06
commit 781c73335d
6 changed files with 26 additions and 46 deletions
@@ -40,18 +40,12 @@ fun createFileStub(project: Project, text: String): PsiFileStub<*> {
fun createLoggingErrorReporter(log: Logger) = LoggingErrorReporter(log)
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
override fun loadModuleHeader(
library: KotlinLibrary
): KlibMetadataProtoBuf.Header {
override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header {
val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
return cache.getCachedModuleHeader(virtualFile)
}
override fun loadPackageFragment(
library: KotlinLibrary,
packageFqName: String,
partName: String
): ProtoBuf.PackageFragment {
override fun loadPackageFragment(library: KotlinLibrary, packageFqName: String, partName: String): ProtoBuf.PackageFragment {
val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName))
return cache.getCachedPackageFragment(virtualFile)
}
@@ -72,15 +66,13 @@ internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
private val cache
get() = KotlinNativeLoadingMetadataCache.getInstance()
private val KotlinLibrary.moduleHeaderFile get() =
(this as MetadataLibraryImpl).access.layout.moduleHeaderFile
private val KotlinLibrary.moduleHeaderFile
get() = (this as MetadataLibraryImpl).access.layout.moduleHeaderFile
private fun KotlinLibrary.packageFragmentFile(packageFqName: String, partName: String) =
(this as MetadataLibraryImpl).access.layout.packageFragmentFile(packageFqName, partName)
private val KotlinLibrary.isZipped get() =
(this as BaseKotlinLibraryImpl).access.layout.isZipped
private val KotlinLibrary.isZipped
get() = (this as BaseKotlinLibraryImpl).access.layout.isZipped
}
@@ -43,29 +43,22 @@ import org.jetbrains.kotlin.platform.konan.KonanPlatforms
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion
import org.jetbrains.kotlin.resolve.TargetEnvironment
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl
import org.jetbrains.kotlin.storage.StorageManager
fun KotlinLibrary.createPackageFragmentProvider(
storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider {
storageManager: StorageManager,
languageVersionSettings: LanguageVersionSettings,
moduleDescriptor: ModuleDescriptor
): PackageFragmentProvider {
val library = this
val libraryProto = parseModuleHeader(library.moduleHeaderData)
//TODO: Is it required somehow?
//val moduleName = Name.special(libraryProto.moduleName)
//val moduleOrigin = DeserializedKonanModuleOrigin(library)
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(this)
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
return KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
library,
null,
this,
CachingIdeKonanLibraryMetadataLoader,
libraryProto.packageFragmentNameList,
storageManager,
moduleDescriptor,
@@ -156,7 +149,7 @@ private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: P
val languageSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(stdlibInfo, project, isReleaseCoroutines = false)
val deserializationConfiguration = CompilerDeserializationConfiguration(languageSettings)
val libraryProto = parseModuleHeader(konanLibrary.moduleHeaderData)
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(konanLibrary)
val stdlibFragmentProvider = KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
konanLibrary,
@@ -173,10 +166,7 @@ private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: P
listOf(
stdlibFragmentProvider,
(KonanFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
.createForwardDeclarationHackPackagePartProvider(
storageManager,
builtInsModule
)
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
)
)
)
@@ -205,7 +195,8 @@ class NativeLibraryInfo(project: Project, library: Library, root: File) : Librar
get() = super.capabilities +
mapOf(
KlibModuleOrigin.CAPABILITY to this,
ImplicitIntegerCoercion.MODULE_CAPABILITY to nativeLibrary.isInterop
ImplicitIntegerCoercion.MODULE_CAPABILITY to nativeLibrary.isInterop,
NATIVE_LIBRARY_CAPABILITY to nativeLibrary
)
override val platform: TargetPlatform
@@ -10,7 +10,7 @@ import com.intellij.openapi.components.BaseComponent
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.containers.ContainerUtil.createConcurrentWeakValueMap
import org.jetbrains.kotlin.konan.library.KLIB_METADATA_FILE_EXTENSION
import org.jetbrains.kotlin.konan.library.KLIB_MODULE_METADATA_FILE_NAME
import org.jetbrains.kotlin.library.KLIB_MODULE_METADATA_FILE_NAME
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
import org.jetbrains.kotlin.library.metadata.parsePackageFragment