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
@@ -49,9 +49,7 @@ val BaseKotlinLibrary.uniqueName: String
val BaseKotlinLibrary.unresolvedDependencies: List<UnresolvedLibrary>
get() = manifestProperties.propertyList(KLIB_PROPERTY_DEPENDS, escapeInQuotes = true)
.map {
UnresolvedLibrary(it, manifestProperties.getProperty("dependency_version_$it"))
}
.map { UnresolvedLibrary(it, manifestProperties.getProperty("dependency_version_$it")) }
interface KotlinLibrary : BaseKotlinLibrary, MetadataLibrary, IrLibrary
@@ -60,11 +58,11 @@ val KotlinLibrary.isInterop
get() = manifestProperties.getProperty(KLIB_PROPERTY_INTEROP) == "true"
val KotlinLibrary.packageFqName: String?
get() = manifestProperties.getProperty(org.jetbrains.kotlin.library.KLIB_PROPERTY_PACKAGE)
get() = manifestProperties.getProperty(KLIB_PROPERTY_PACKAGE)
val KotlinLibrary.exportForwardDeclarations
get() = manifestProperties.propertyList(KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS, escapeInQuotes = true)
.asSequence()
.map { it.trim() }
.filter { it.isNotEmpty() }
.toList()
.toList()
@@ -19,6 +19,9 @@ package org.jetbrains.kotlin.library
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT
const val KLIB_MANIFEST_FILE_NAME = "manifest"
const val KLIB_MODULE_METADATA_FILE_NAME = "module"
/**
* This scheme describes the Kotlin/Native Library (KLIB) layout.
*/
@@ -27,7 +30,7 @@ interface KotlinLibraryLayout {
val libraryName: String
get() = libDir.path
val manifestFile
get() = File(libDir, "manifest")
get() = File(libDir, KLIB_MANIFEST_FILE_NAME)
val resourcesDir
get() = File(libDir, "resources")
}
@@ -36,7 +39,7 @@ interface MetadataKotlinLibraryLayout : KotlinLibraryLayout {
val metadataDir
get() = File(libDir, "linkdata")
val moduleHeaderFile
get() = File(metadataDir, "module")
get() = File(metadataDir, KLIB_MODULE_METADATA_FILE_NAME)
fun packageFragmentsDir(packageName: String) =
File(metadataDir, if (packageName == "") "root_package" else "package_$packageName")
@@ -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
@@ -15,10 +15,6 @@ const val KLIB_METADATA_FILE_EXTENSION_WITH_DOT = ".$KLIB_METADATA_FILE_EXTENSIO
const val KDEFINITIONS_FILE_EXTENSION = "def"
const val KLIB_MODULE_METADATA_FILE_NAME = "module"
const val KLIB_MANIFEST_FILE_NAME = "manifest"
const val KONAN_STDLIB_NAME = "stdlib"
const val KLIB_DIR_NAME = "klib"