IDE: Use CachingIdeKlibMetadataLoader in Native & Common KLIB analysis
This commit is contained in:
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.ide.konan
|
||||
|
||||
import com.intellij.openapi.vfs.StandardFileSystems
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.util.PathUtil
|
||||
import org.jetbrains.kotlin.idea.klib.KlibLoadingMetadataCache
|
||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||
import org.jetbrains.kotlin.library.impl.KotlinLibraryImpl
|
||||
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf
|
||||
import org.jetbrains.kotlin.library.metadata.PackageAccessHandler
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.konan.file.File as KFile
|
||||
|
||||
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler {
|
||||
override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header {
|
||||
val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
|
||||
return virtualFile?.let { cache.getCachedModuleHeader(virtualFile) } ?: KlibMetadataProtoBuf.Header.getDefaultInstance()
|
||||
}
|
||||
|
||||
override fun loadPackageFragment(library: KotlinLibrary, packageFqName: String, partName: String): ProtoBuf.PackageFragment {
|
||||
val virtualFile = getVirtualFile(library, library.packageFragmentFile(packageFqName, partName))
|
||||
return virtualFile?.let { cache.getCachedPackageFragment(virtualFile) } ?: ProtoBuf.PackageFragment.getDefaultInstance()
|
||||
}
|
||||
|
||||
private fun getVirtualFile(library: KotlinLibrary, file: KFile): VirtualFile? =
|
||||
if (library.isZipped) asJarFileSystemFile(library.libraryFile, file) else asLocalFile(file)
|
||||
|
||||
private fun asJarFileSystemFile(jarFile: KFile, localFile: KFile): VirtualFile? {
|
||||
val fullPath = jarFile.absolutePath + "!" + PathUtil.toSystemIndependentName(localFile.path)
|
||||
return StandardFileSystems.jar().findFileByPath(fullPath)
|
||||
}
|
||||
|
||||
private fun asLocalFile(localFile: KFile): VirtualFile? {
|
||||
val fullPath = localFile.absolutePath
|
||||
return StandardFileSystems.local().findFileByPath(fullPath)
|
||||
}
|
||||
|
||||
private val cache
|
||||
get() = KlibLoadingMetadataCache.getInstance()
|
||||
|
||||
private val KotlinLibrary.moduleHeaderFile
|
||||
get() = (this as KotlinLibraryImpl).metadata.access.layout.moduleHeaderFile
|
||||
|
||||
private fun KotlinLibrary.packageFragmentFile(packageFqName: String, partName: String) =
|
||||
(this as KotlinLibraryImpl).metadata.access.layout.packageFragmentFile(packageFqName, partName)
|
||||
|
||||
private val KotlinLibrary.isZipped
|
||||
get() = (this as KotlinLibraryImpl).base.access.layout.isZipped
|
||||
}
|
||||
+9
-13
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.caches.project.SdkInfo
|
||||
import org.jetbrains.kotlin.idea.caches.project.lazyClosure
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.BuiltInsCacheKey
|
||||
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
|
||||
import org.jetbrains.kotlin.idea.klib.*
|
||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
|
||||
import org.jetbrains.kotlin.library.isInterop
|
||||
@@ -44,10 +45,6 @@ import org.jetbrains.kotlin.resolve.TargetEnvironment
|
||||
import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer
|
||||
import org.jetbrains.kotlin.serialization.konan.impl.KlibMetadataModuleDescriptorFactoryImpl
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.idea.klib.getCompatibilityInfo
|
||||
import org.jetbrains.kotlin.idea.klib.readSafe
|
||||
import org.jetbrains.kotlin.idea.klib.AbstractKlibLibraryInfo
|
||||
import org.jetbrains.kotlin.idea.klib.isKlibLibraryRootForPlatform
|
||||
|
||||
class NativePlatformKindResolution : IdePlatformKindResolution {
|
||||
|
||||
@@ -102,17 +99,16 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
|
||||
val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null
|
||||
if (!library.getCompatibilityInfo().isCompatible) return null
|
||||
|
||||
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library)
|
||||
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
|
||||
val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList
|
||||
|
||||
return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
|
||||
library,
|
||||
CachingIdeKonanLibraryMetadataLoader,
|
||||
libraryProto.packageFragmentNameList,
|
||||
storageManager,
|
||||
moduleDescriptor,
|
||||
deserializationConfiguration,
|
||||
null
|
||||
library = library,
|
||||
packageAccessHandler = CachingIdeKlibMetadataLoader,
|
||||
packageFragmentNames = packageFragmentNames,
|
||||
storageManager = storageManager,
|
||||
moduleDescriptor = moduleDescriptor,
|
||||
configuration = CompilerDeserializationConfiguration(languageVersionSettings),
|
||||
compositePackageFragmentAddend = null
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user