Use cache everywhere where K/N KLIBs are read in IDE
This commit is contained in:
committed by
alexander-gorshenev
parent
185b10fa06
commit
781c73335d
@@ -49,9 +49,7 @@ val BaseKotlinLibrary.uniqueName: String
|
|||||||
|
|
||||||
val BaseKotlinLibrary.unresolvedDependencies: List<UnresolvedLibrary>
|
val BaseKotlinLibrary.unresolvedDependencies: List<UnresolvedLibrary>
|
||||||
get() = manifestProperties.propertyList(KLIB_PROPERTY_DEPENDS, escapeInQuotes = true)
|
get() = manifestProperties.propertyList(KLIB_PROPERTY_DEPENDS, escapeInQuotes = true)
|
||||||
.map {
|
.map { UnresolvedLibrary(it, manifestProperties.getProperty("dependency_version_$it")) }
|
||||||
UnresolvedLibrary(it, manifestProperties.getProperty("dependency_version_$it"))
|
|
||||||
}
|
|
||||||
|
|
||||||
interface KotlinLibrary : BaseKotlinLibrary, MetadataLibrary, IrLibrary
|
interface KotlinLibrary : BaseKotlinLibrary, MetadataLibrary, IrLibrary
|
||||||
|
|
||||||
@@ -60,11 +58,11 @@ val KotlinLibrary.isInterop
|
|||||||
get() = manifestProperties.getProperty(KLIB_PROPERTY_INTEROP) == "true"
|
get() = manifestProperties.getProperty(KLIB_PROPERTY_INTEROP) == "true"
|
||||||
|
|
||||||
val KotlinLibrary.packageFqName: String?
|
val KotlinLibrary.packageFqName: String?
|
||||||
get() = manifestProperties.getProperty(org.jetbrains.kotlin.library.KLIB_PROPERTY_PACKAGE)
|
get() = manifestProperties.getProperty(KLIB_PROPERTY_PACKAGE)
|
||||||
|
|
||||||
val KotlinLibrary.exportForwardDeclarations
|
val KotlinLibrary.exportForwardDeclarations
|
||||||
get() = manifestProperties.propertyList(KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS, escapeInQuotes = true)
|
get() = manifestProperties.propertyList(KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS, escapeInQuotes = true)
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.map { it.trim() }
|
.map { it.trim() }
|
||||||
.filter { it.isNotEmpty() }
|
.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.konan.file.File
|
||||||
import org.jetbrains.kotlin.library.KLIB_METADATA_FILE_EXTENSION_WITH_DOT
|
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.
|
* This scheme describes the Kotlin/Native Library (KLIB) layout.
|
||||||
*/
|
*/
|
||||||
@@ -27,7 +30,7 @@ interface KotlinLibraryLayout {
|
|||||||
val libraryName: String
|
val libraryName: String
|
||||||
get() = libDir.path
|
get() = libDir.path
|
||||||
val manifestFile
|
val manifestFile
|
||||||
get() = File(libDir, "manifest")
|
get() = File(libDir, KLIB_MANIFEST_FILE_NAME)
|
||||||
val resourcesDir
|
val resourcesDir
|
||||||
get() = File(libDir, "resources")
|
get() = File(libDir, "resources")
|
||||||
}
|
}
|
||||||
@@ -36,7 +39,7 @@ interface MetadataKotlinLibraryLayout : KotlinLibraryLayout {
|
|||||||
val metadataDir
|
val metadataDir
|
||||||
get() = File(libDir, "linkdata")
|
get() = File(libDir, "linkdata")
|
||||||
val moduleHeaderFile
|
val moduleHeaderFile
|
||||||
get() = File(metadataDir, "module")
|
get() = File(metadataDir, KLIB_MODULE_METADATA_FILE_NAME)
|
||||||
|
|
||||||
fun packageFragmentsDir(packageName: String) =
|
fun packageFragmentsDir(packageName: String) =
|
||||||
File(metadataDir, if (packageName == "") "root_package" else "package_$packageName")
|
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)
|
fun createLoggingErrorReporter(log: Logger) = LoggingErrorReporter(log)
|
||||||
|
|
||||||
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
|
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
|
||||||
override fun loadModuleHeader(
|
override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header {
|
||||||
library: KotlinLibrary
|
|
||||||
): KlibMetadataProtoBuf.Header {
|
|
||||||
val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
|
val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
|
||||||
return cache.getCachedModuleHeader(virtualFile)
|
return cache.getCachedModuleHeader(virtualFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun loadPackageFragment(
|
override fun loadPackageFragment(library: KotlinLibrary, packageFqName: String, partName: String): ProtoBuf.PackageFragment {
|
||||||
library: KotlinLibrary,
|
|
||||||
packageFqName: String,
|
|
||||||
partName: String
|
|
||||||
): ProtoBuf.PackageFragment {
|
|
||||||
val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName))
|
val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName))
|
||||||
return cache.getCachedPackageFragment(virtualFile)
|
return cache.getCachedPackageFragment(virtualFile)
|
||||||
}
|
}
|
||||||
@@ -72,15 +66,13 @@ internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
|
|||||||
private val cache
|
private val cache
|
||||||
get() = KotlinNativeLoadingMetadataCache.getInstance()
|
get() = KotlinNativeLoadingMetadataCache.getInstance()
|
||||||
|
|
||||||
|
private val KotlinLibrary.moduleHeaderFile
|
||||||
private val KotlinLibrary.moduleHeaderFile get() =
|
get() = (this as MetadataLibraryImpl).access.layout.moduleHeaderFile
|
||||||
(this as MetadataLibraryImpl).access.layout.moduleHeaderFile
|
|
||||||
|
|
||||||
private fun KotlinLibrary.packageFragmentFile(packageFqName: String, partName: String) =
|
private fun KotlinLibrary.packageFragmentFile(packageFqName: String, partName: String) =
|
||||||
(this as MetadataLibraryImpl).access.layout.packageFragmentFile(packageFqName, partName)
|
(this as MetadataLibraryImpl).access.layout.packageFragmentFile(packageFqName, partName)
|
||||||
|
|
||||||
private val KotlinLibrary.isZipped get() =
|
private val KotlinLibrary.isZipped
|
||||||
(this as BaseKotlinLibraryImpl).access.layout.isZipped
|
get() = (this as BaseKotlinLibraryImpl).access.layout.isZipped
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-20
@@ -43,29 +43,22 @@ import org.jetbrains.kotlin.platform.konan.KonanPlatforms
|
|||||||
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
|
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.serialization.deserialization.DeserializationConfiguration
|
|
||||||
import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl
|
import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
|
|
||||||
fun KotlinLibrary.createPackageFragmentProvider(
|
fun KotlinLibrary.createPackageFragmentProvider(
|
||||||
storageManager: StorageManager,
|
storageManager: StorageManager,
|
||||||
languageVersionSettings: LanguageVersionSettings,
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
moduleDescriptor: ModuleDescriptor
|
moduleDescriptor: ModuleDescriptor
|
||||||
): PackageFragmentProvider {
|
): PackageFragmentProvider {
|
||||||
|
|
||||||
val library = this
|
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(this)
|
||||||
|
|
||||||
val libraryProto = parseModuleHeader(library.moduleHeaderData)
|
|
||||||
|
|
||||||
//TODO: Is it required somehow?
|
|
||||||
//val moduleName = Name.special(libraryProto.moduleName)
|
|
||||||
//val moduleOrigin = DeserializedKonanModuleOrigin(library)
|
|
||||||
|
|
||||||
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
|
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
|
||||||
|
|
||||||
return KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
|
return KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
|
||||||
library,
|
this,
|
||||||
null,
|
CachingIdeKonanLibraryMetadataLoader,
|
||||||
libraryProto.packageFragmentNameList,
|
libraryProto.packageFragmentNameList,
|
||||||
storageManager,
|
storageManager,
|
||||||
moduleDescriptor,
|
moduleDescriptor,
|
||||||
@@ -156,7 +149,7 @@ private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: P
|
|||||||
val languageSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(stdlibInfo, project, isReleaseCoroutines = false)
|
val languageSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(stdlibInfo, project, isReleaseCoroutines = false)
|
||||||
val deserializationConfiguration = CompilerDeserializationConfiguration(languageSettings)
|
val deserializationConfiguration = CompilerDeserializationConfiguration(languageSettings)
|
||||||
|
|
||||||
val libraryProto = parseModuleHeader(konanLibrary.moduleHeaderData)
|
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(konanLibrary)
|
||||||
|
|
||||||
val stdlibFragmentProvider = KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
|
val stdlibFragmentProvider = KonanFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
|
||||||
konanLibrary,
|
konanLibrary,
|
||||||
@@ -173,10 +166,7 @@ private fun createKotlinNativeBuiltIns(moduleInfo: ModuleInfo, projectContext: P
|
|||||||
listOf(
|
listOf(
|
||||||
stdlibFragmentProvider,
|
stdlibFragmentProvider,
|
||||||
(KonanFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
|
(KonanFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
|
||||||
.createForwardDeclarationHackPackagePartProvider(
|
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
|
||||||
storageManager,
|
|
||||||
builtInsModule
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -205,7 +195,8 @@ class NativeLibraryInfo(project: Project, library: Library, root: File) : Librar
|
|||||||
get() = super.capabilities +
|
get() = super.capabilities +
|
||||||
mapOf(
|
mapOf(
|
||||||
KlibModuleOrigin.CAPABILITY to this,
|
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
|
override val platform: TargetPlatform
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ import com.intellij.openapi.components.BaseComponent
|
|||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.util.containers.ContainerUtil.createConcurrentWeakValueMap
|
import com.intellij.util.containers.ContainerUtil.createConcurrentWeakValueMap
|
||||||
import org.jetbrains.kotlin.konan.library.KLIB_METADATA_FILE_EXTENSION
|
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.KlibMetadataProtoBuf
|
||||||
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
|
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
|
||||||
import org.jetbrains.kotlin.library.metadata.parsePackageFragment
|
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 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 KONAN_STDLIB_NAME = "stdlib"
|
||||||
|
|
||||||
const val KLIB_DIR_NAME = "klib"
|
const val KLIB_DIR_NAME = "klib"
|
||||||
|
|||||||
Reference in New Issue
Block a user