Extract MetadataPartProvider out of PackagePartProvider

This commit is contained in:
Alexander Udalov
2018-01-18 18:29:01 +01:00
parent e25bc2865f
commit 2cb4b7c6d4
10 changed files with 40 additions and 35 deletions
@@ -27,12 +27,13 @@ import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping
import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
import java.io.EOFException import java.io.EOFException
class JvmPackagePartProvider( class JvmPackagePartProvider(
languageVersionSettings: LanguageVersionSettings, languageVersionSettings: LanguageVersionSettings,
private val scope: GlobalSearchScope private val scope: GlobalSearchScope
) : PackagePartProvider { ) : PackagePartProvider, MetadataPartProvider {
private data class ModuleMappingInfo(val root: VirtualFile, val mapping: ModuleMapping, val name: String) private data class ModuleMappingInfo(val root: VirtualFile, val mapping: ModuleMapping, val name: String)
private val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings) private val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
@@ -42,9 +42,6 @@ class IncrementalPackagePartProvider(
parent.findPackageParts(packageFqName)).distinct() parent.findPackageParts(packageFqName)).distinct()
} }
// TODO
override fun findMetadataPackageParts(packageFqName: String): List<String> = TODO()
override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> { override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> {
return parent.getAnnotationsOnBinaryModule(moduleName) return parent.getAnnotationsOnBinaryModule(moduleName)
} }
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
@@ -44,9 +43,10 @@ import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmentProvider import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmentProvider
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
class CommonAnalysisParameters( class CommonAnalysisParameters(
val packagePartProviderFactory: (ModuleContent<*>) -> PackagePartProvider val metadataPartProviderFactory: (ModuleContent<*>) -> MetadataPartProvider
) : PlatformAnalysisParameters ) : PlatformAnalysisParameters
/** /**
@@ -68,7 +68,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
fun analyzeFiles( fun analyzeFiles(
files: Collection<KtFile>, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings, files: Collection<KtFile>, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings,
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = mapOf(MultiTargetPlatform.CAPABILITY to MultiTargetPlatform.Common), capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = mapOf(MultiTargetPlatform.CAPABILITY to MultiTargetPlatform.Common),
packagePartProviderFactory: (ModuleContent<ModuleInfo>) -> PackagePartProvider metadataPartProviderFactory: (ModuleContent<ModuleInfo>) -> MetadataPartProvider
): AnalysisResult { ): AnalysisResult {
val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns) val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns)
val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze") val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze")
@@ -91,7 +91,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
override fun getTargetPlatform(moduleInfo: ModuleInfo) = TargetPlatformVersion.NoVersion override fun getTargetPlatform(moduleInfo: ModuleInfo) = TargetPlatformVersion.NoVersion
}, },
resolverForModuleFactoryByPlatform = { CommonAnalyzerFacade }, resolverForModuleFactoryByPlatform = { CommonAnalyzerFacade },
platformParameters = { _ -> CommonAnalysisParameters(packagePartProviderFactory) } platformParameters = { _ -> CommonAnalysisParameters(metadataPartProviderFactory) }
) )
val moduleDescriptor = resolver.descriptorForModule(moduleInfo) val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
@@ -120,10 +120,10 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
moduleInfo moduleInfo
) )
val packagePartProvider = (platformParameters as CommonAnalysisParameters).packagePartProviderFactory(moduleContent) val metadataPartProvider = (platformParameters as CommonAnalysisParameters).metadataPartProviderFactory(moduleContent)
val trace = CodeAnalyzerInitializer.getInstance(project).createTrace() val trace = CodeAnalyzerInitializer.getInstance(project).createTrace()
val container = createContainerToResolveCommonCode( val container = createContainerToResolveCommonCode(
moduleContext, trace, declarationProviderFactory, moduleContentScope, targetEnvironment, packagePartProvider, moduleContext, trace, declarationProviderFactory, moduleContentScope, targetEnvironment, metadataPartProvider,
languageVersionSettings languageVersionSettings
) )
@@ -141,7 +141,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
declarationProviderFactory: DeclarationProviderFactory, declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope, moduleContentScope: GlobalSearchScope,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
packagePartProvider: PackagePartProvider, metadataPartProvider: MetadataPartProvider,
languageVersionSettings: LanguageVersionSettings languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("ResolveCommonCode", targetPlatform) { ): StorageComponentContainer = createContainer("ResolveCommonCode", targetPlatform) {
configureModule(moduleContext, targetPlatform, TargetPlatformVersion.NoVersion, bindingTrace) configureModule(moduleContext, targetPlatform, TargetPlatformVersion.NoVersion, bindingTrace)
@@ -154,7 +154,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
useInstance(languageVersionSettings) useInstance(languageVersionSettings)
useImpl<AnnotationResolverImpl>() useImpl<AnnotationResolverImpl>()
useImpl<CompilerDeserializationConfiguration>() useImpl<CompilerDeserializationConfiguration>()
useInstance(packagePartProvider) useInstance(metadataPartProvider)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
useImpl<MetadataPackageFragmentProvider>() useImpl<MetadataPackageFragmentProvider>()
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.context.withModule
import org.jetbrains.kotlin.context.withProject import org.jetbrains.kotlin.context.withProject
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
@@ -46,6 +45,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
import org.jetbrains.kotlin.storage.ExceptionTracker import org.jetbrains.kotlin.storage.ExceptionTracker
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
@@ -339,7 +339,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
) )
) { _ -> ) { _ ->
// TODO // TODO
PackagePartProvider.Empty MetadataPartProvider.Empty
} }
} else if (platform != null) { } else if (platform != null) {
// TODO: analyze with the correct platform, not always JVM // TODO: analyze with the correct platform, not always JVM
@@ -60,9 +60,6 @@ class RuntimePackagePartProvider(private val classLoader: ClassLoader) : Package
override fun findPackageParts(packageFqName: String): List<String> = override fun findPackageParts(packageFqName: String): List<String> =
packageParts[packageFqName]?.toList().orEmpty() packageParts[packageFqName]?.toList().orEmpty()
// TODO
override fun findMetadataPackageParts(packageFqName: String): List<String> = TODO()
override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> { override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> {
// TODO: load annotations from resource files // TODO: load annotations from resource files
return emptyList() return emptyList()
@@ -28,18 +28,11 @@ interface PackagePartProvider {
*/ */
fun findPackageParts(packageFqName: String): List<String> fun findPackageParts(packageFqName: String): List<String>
/**
* @return simple names of .kotlin_metadata files that store data for top level declarations in the package with the given FQ name
*/
fun findMetadataPackageParts(packageFqName: String): List<String>
fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId>
object Empty : PackagePartProvider { object Empty : PackagePartProvider {
override fun findPackageParts(packageFqName: String): List<String> = emptyList() override fun findPackageParts(packageFqName: String): List<String> = emptyList()
override fun findMetadataPackageParts(packageFqName: String): List<String> = emptyList()
override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> = emptyList() override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> = emptyList()
} }
} }
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.NotFoundClasses import org.jetbrains.kotlin.descriptors.NotFoundClasses
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter
@@ -41,7 +40,7 @@ class MetadataPackageFragmentProvider(
finder: KotlinMetadataFinder, finder: KotlinMetadataFinder,
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
notFoundClasses: NotFoundClasses, notFoundClasses: NotFoundClasses,
private val packagePartProvider: PackagePartProvider private val metadataPartProvider: MetadataPartProvider
) : AbstractDeserializedPackageFragmentProvider(storageManager, finder, moduleDescriptor) { ) : AbstractDeserializedPackageFragmentProvider(storageManager, finder, moduleDescriptor) {
init { init {
components = DeserializationComponents( components = DeserializationComponents(
@@ -65,16 +64,16 @@ class MetadataPackageFragmentProvider(
override fun findPackage(fqName: FqName): DeserializedPackageFragment? = override fun findPackage(fqName: FqName): DeserializedPackageFragment? =
if (finder.hasMetadataPackage(fqName)) if (finder.hasMetadataPackage(fqName))
MetadataPackageFragment(fqName, storageManager, moduleDescriptor, packagePartProvider, finder) MetadataPackageFragment(fqName, storageManager, moduleDescriptor, metadataPartProvider, finder)
else null else null
} }
class MetadataPackageFragment( class MetadataPackageFragment(
fqName: FqName, fqName: FqName,
storageManager: StorageManager, storageManager: StorageManager,
module: ModuleDescriptor, module: ModuleDescriptor,
private val packagePartProvider: PackagePartProvider, private val metadataPartProvider: MetadataPartProvider,
private val finder: KotlinMetadataFinder private val finder: KotlinMetadataFinder
) : DeserializedPackageFragment(fqName, storageManager, module) { ) : DeserializedPackageFragment(fqName, storageManager, module) {
override val classDataFinder = ClassDataFinder { classId -> override val classDataFinder = ClassDataFinder { classId ->
val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last() val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last()
@@ -98,7 +97,7 @@ class MetadataPackageFragment(
private fun computeMemberScope(): MemberScope { private fun computeMemberScope(): MemberScope {
// For each .kotlin_metadata file which represents a package part, add a separate deserialized scope // For each .kotlin_metadata file which represents a package part, add a separate deserialized scope
// with top level callables and type aliases (but no classes) only from that part // with top level callables and type aliases (but no classes) only from that part
val packageParts = packagePartProvider.findMetadataPackageParts(fqName.asString()) val packageParts = metadataPartProvider.findMetadataPackageParts(fqName.asString())
val scopes = arrayListOf<DeserializedPackageMemberScope>() val scopes = arrayListOf<DeserializedPackageMemberScope>()
for (partName in packageParts) { for (partName in packageParts) {
val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue
@@ -0,0 +1,17 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. 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.serialization.deserialization
interface MetadataPartProvider {
/**
* @return simple names of .kotlin_metadata files that store data for top level declarations in the package with the given FQ name
*/
fun findMetadataPackageParts(packageFqName: String): List<String>
object Empty : MetadataPartProvider {
override fun findMetadataPackageParts(packageFqName: String): List<String> = emptyList()
}
}
@@ -23,8 +23,9 @@ import org.jetbrains.kotlin.idea.vfilefinder.KotlinJvmModuleAnnotationsIndex
import org.jetbrains.kotlin.idea.vfilefinder.KotlinModuleMappingIndex import org.jetbrains.kotlin.idea.vfilefinder.KotlinModuleMappingIndex
import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
class IDEPackagePartProvider(val scope: GlobalSearchScope) : PackagePartProvider { class IDEPackagePartProvider(val scope: GlobalSearchScope) : PackagePartProvider, MetadataPartProvider {
override fun findPackageParts(packageFqName: String): List<String> = override fun findPackageParts(packageFqName: String): List<String> =
getPackageParts(packageFqName).flatMap(PackageParts::parts).distinct() getPackageParts(packageFqName).flatMap(PackageParts::parts).distinct()
@@ -128,7 +128,7 @@ internal class ProjectResolutionFacade(
) )
val commonPlatformParameters = CommonAnalysisParameters( val commonPlatformParameters = CommonAnalysisParameters(
packagePartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) } metadataPartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }
) )
val resolverForProject = ResolverForProjectImpl( val resolverForProject = ResolverForProjectImpl(