IDE: Use CachingIdeKlibMetadataLoader in Native & Common KLIB analysis

This commit is contained in:
Dmitriy Dolovov
2020-03-20 19:03:42 +07:00
parent c8a9b88504
commit bf4a153c0c
3 changed files with 15 additions and 20 deletions
@@ -23,10 +23,10 @@ import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents
import org.jetbrains.kotlin.frontend.java.di.initializeJavaSpecificComponents
import org.jetbrains.kotlin.idea.klib.CachingIdeKlibMetadataLoader
import org.jetbrains.kotlin.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.metadata.parseModuleHeader
import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver
import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
@@ -134,7 +134,7 @@ class CompositeResolverForModuleFactory(
val library = moduleInfo.resolvedKotlinLibrary
val languageVersionSettings = container.get<LanguageVersionSettings>()
val packageFragmentNames = parseModuleHeader(library.moduleHeaderData).packageFragmentNameList
val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList
val metadataFactories = KlibMetadataFactories(
{ DefaultBuiltIns.Instance },
@@ -150,7 +150,7 @@ class CompositeResolverForModuleFactory(
klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider(
library,
packageAccessHandler = null,
packageAccessHandler = CachingIdeKlibMetadataLoader,
packageFragmentNames = packageFragmentNames,
storageManager = moduleContext.storageManager,
moduleDescriptor = moduleDescriptor,
@@ -0,0 +1,53 @@
/*
* 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.idea.klib
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.PathUtil
import org.jetbrains.kotlin.konan.file.File as KFile
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
object CachingIdeKlibMetadataLoader : 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
}