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.di.configureStandardResolveComponents
import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents import org.jetbrains.kotlin.frontend.java.di.configureJavaSpecificComponents
import org.jetbrains.kotlin.frontend.java.di.initializeJavaSpecificComponents 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.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories 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.ModuleClassResolver
import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
@@ -134,7 +134,7 @@ class CompositeResolverForModuleFactory(
val library = moduleInfo.resolvedKotlinLibrary val library = moduleInfo.resolvedKotlinLibrary
val languageVersionSettings = container.get<LanguageVersionSettings>() val languageVersionSettings = container.get<LanguageVersionSettings>()
val packageFragmentNames = parseModuleHeader(library.moduleHeaderData).packageFragmentNameList val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList
val metadataFactories = KlibMetadataFactories( val metadataFactories = KlibMetadataFactories(
{ DefaultBuiltIns.Instance }, { DefaultBuiltIns.Instance },
@@ -150,7 +150,7 @@ class CompositeResolverForModuleFactory(
klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider( klibMetadataProvider = klibMetadataModuleDescriptorFactory.createPackageFragmentProvider(
library, library,
packageAccessHandler = null, packageAccessHandler = CachingIdeKlibMetadataLoader,
packageFragmentNames = packageFragmentNames, packageFragmentNames = packageFragmentNames,
storageManager = moduleContext.storageManager, storageManager = moduleContext.storageManager,
moduleDescriptor = moduleDescriptor, moduleDescriptor = moduleDescriptor,
@@ -3,20 +3,19 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.klib
import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.PathUtil import com.intellij.util.PathUtil
import org.jetbrains.kotlin.idea.klib.KlibLoadingMetadataCache import org.jetbrains.kotlin.konan.file.File as KFile
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
import org.jetbrains.kotlin.library.impl.KotlinLibraryImpl import org.jetbrains.kotlin.library.impl.KotlinLibraryImpl
import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf import org.jetbrains.kotlin.library.metadata.KlibMetadataProtoBuf
import org.jetbrains.kotlin.library.metadata.PackageAccessHandler import org.jetbrains.kotlin.library.metadata.PackageAccessHandler
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.konan.file.File as KFile
internal object CachingIdeKonanLibraryMetadataLoader : PackageAccessHandler { object CachingIdeKlibMetadataLoader : PackageAccessHandler {
override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header { override fun loadModuleHeader(library: KotlinLibrary): KlibMetadataProtoBuf.Header {
val virtualFile = getVirtualFile(library, library.moduleHeaderFile) val virtualFile = getVirtualFile(library, library.moduleHeaderFile)
return virtualFile?.let { cache.getCachedModuleHeader(virtualFile) } ?: KlibMetadataProtoBuf.Header.getDefaultInstance() return virtualFile?.let { cache.getCachedModuleHeader(virtualFile) } ?: KlibMetadataProtoBuf.Header.getDefaultInstance()
@@ -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.project.lazyClosure
import org.jetbrains.kotlin.idea.caches.resolve.BuiltInsCacheKey import org.jetbrains.kotlin.idea.caches.resolve.BuiltInsCacheKey
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider 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.library.KONAN_STDLIB_NAME
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.isInterop 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.library.metadata.NullFlexibleTypeDeserializer
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
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 { class NativePlatformKindResolution : IdePlatformKindResolution {
@@ -102,17 +99,16 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null val library = (moduleInfo as? NativeKlibLibraryInfo)?.resolvedKotlinLibrary ?: return null
if (!library.getCompatibilityInfo().isCompatible) return null if (!library.getCompatibilityInfo().isCompatible) return null
val libraryProto = CachingIdeKonanLibraryMetadataLoader.loadModuleHeader(library) val packageFragmentNames = CachingIdeKlibMetadataLoader.loadModuleHeader(library).packageFragmentNameList
val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider( return NativeFactories.DefaultDeserializedDescriptorFactory.createPackageFragmentProvider(
library, library = library,
CachingIdeKonanLibraryMetadataLoader, packageAccessHandler = CachingIdeKlibMetadataLoader,
libraryProto.packageFragmentNameList, packageFragmentNames = packageFragmentNames,
storageManager, storageManager = storageManager,
moduleDescriptor, moduleDescriptor = moduleDescriptor,
deserializationConfiguration, configuration = CompilerDeserializationConfiguration(languageVersionSettings),
null compositePackageFragmentAddend = null
) )
} }