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.name.ClassId
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
import java.io.EOFException
class JvmPackagePartProvider(
languageVersionSettings: LanguageVersionSettings,
private val scope: GlobalSearchScope
) : PackagePartProvider {
) : PackagePartProvider, MetadataPartProvider {
private data class ModuleMappingInfo(val root: VirtualFile, val mapping: ModuleMapping, val name: String)
private val deserializationConfiguration = CompilerDeserializationConfiguration(languageVersionSettings)
@@ -42,9 +42,6 @@ class IncrementalPackagePartProvider(
parent.findPackageParts(packageFqName)).distinct()
}
// TODO
override fun findMetadataPackageParts(packageFqName: String): List<String> = TODO()
override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> {
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.ProjectContext
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.ModuleDescriptorImpl
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.DeclarationProviderFactoryService
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmentProvider
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
class CommonAnalysisParameters(
val packagePartProviderFactory: (ModuleContent<*>) -> PackagePartProvider
val metadataPartProviderFactory: (ModuleContent<*>) -> MetadataPartProvider
) : PlatformAnalysisParameters
/**
@@ -68,7 +68,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
fun analyzeFiles(
files: Collection<KtFile>, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings,
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = mapOf(MultiTargetPlatform.CAPABILITY to MultiTargetPlatform.Common),
packagePartProviderFactory: (ModuleContent<ModuleInfo>) -> PackagePartProvider
metadataPartProviderFactory: (ModuleContent<ModuleInfo>) -> MetadataPartProvider
): AnalysisResult {
val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns)
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
},
resolverForModuleFactoryByPlatform = { CommonAnalyzerFacade },
platformParameters = { _ -> CommonAnalysisParameters(packagePartProviderFactory) }
platformParameters = { _ -> CommonAnalysisParameters(metadataPartProviderFactory) }
)
val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
@@ -120,10 +120,10 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
moduleInfo
)
val packagePartProvider = (platformParameters as CommonAnalysisParameters).packagePartProviderFactory(moduleContent)
val metadataPartProvider = (platformParameters as CommonAnalysisParameters).metadataPartProviderFactory(moduleContent)
val trace = CodeAnalyzerInitializer.getInstance(project).createTrace()
val container = createContainerToResolveCommonCode(
moduleContext, trace, declarationProviderFactory, moduleContentScope, targetEnvironment, packagePartProvider,
moduleContext, trace, declarationProviderFactory, moduleContentScope, targetEnvironment, metadataPartProvider,
languageVersionSettings
)
@@ -141,7 +141,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
declarationProviderFactory: DeclarationProviderFactory,
moduleContentScope: GlobalSearchScope,
targetEnvironment: TargetEnvironment,
packagePartProvider: PackagePartProvider,
metadataPartProvider: MetadataPartProvider,
languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("ResolveCommonCode", targetPlatform) {
configureModule(moduleContext, targetPlatform, TargetPlatformVersion.NoVersion, bindingTrace)
@@ -154,7 +154,7 @@ object CommonAnalyzerFacade : ResolverForModuleFactory() {
useInstance(languageVersionSettings)
useImpl<AnnotationResolverImpl>()
useImpl<CompilerDeserializationConfiguration>()
useInstance(packagePartProvider)
useInstance(metadataPartProvider)
useInstance(declarationProviderFactory)
useImpl<MetadataPackageFragmentProvider>()
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.context.withModule
import org.jetbrains.kotlin.context.withProject
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
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.lazy.KotlinCodeAnalyzer
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.LockBasedStorageManager
import org.jetbrains.kotlin.storage.StorageManager
@@ -339,7 +339,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
)
) { _ ->
// TODO
PackagePartProvider.Empty
MetadataPartProvider.Empty
}
} else if (platform != null) {
// 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> =
packageParts[packageFqName]?.toList().orEmpty()
// TODO
override fun findMetadataPackageParts(packageFqName: String): List<String> = TODO()
override fun getAnnotationsOnBinaryModule(moduleName: String): List<ClassId> {
// TODO: load annotations from resource files
return emptyList()
@@ -28,18 +28,11 @@ interface PackagePartProvider {
*/
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>
object Empty : PackagePartProvider {
override fun findPackageParts(packageFqName: String): List<String> = emptyList()
override fun findMetadataPackageParts(packageFqName: String): List<String> = 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.NotFoundClasses
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.descriptors.deserialization.PlatformDependentDeclarationFilter
@@ -41,7 +40,7 @@ class MetadataPackageFragmentProvider(
finder: KotlinMetadataFinder,
moduleDescriptor: ModuleDescriptor,
notFoundClasses: NotFoundClasses,
private val packagePartProvider: PackagePartProvider
private val metadataPartProvider: MetadataPartProvider
) : AbstractDeserializedPackageFragmentProvider(storageManager, finder, moduleDescriptor) {
init {
components = DeserializationComponents(
@@ -65,16 +64,16 @@ class MetadataPackageFragmentProvider(
override fun findPackage(fqName: FqName): DeserializedPackageFragment? =
if (finder.hasMetadataPackage(fqName))
MetadataPackageFragment(fqName, storageManager, moduleDescriptor, packagePartProvider, finder)
MetadataPackageFragment(fqName, storageManager, moduleDescriptor, metadataPartProvider, finder)
else null
}
class MetadataPackageFragment(
fqName: FqName,
storageManager: StorageManager,
module: ModuleDescriptor,
private val packagePartProvider: PackagePartProvider,
private val finder: KotlinMetadataFinder
fqName: FqName,
storageManager: StorageManager,
module: ModuleDescriptor,
private val metadataPartProvider: MetadataPartProvider,
private val finder: KotlinMetadataFinder
) : DeserializedPackageFragment(fqName, storageManager, module) {
override val classDataFinder = ClassDataFinder { classId ->
val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last()
@@ -98,7 +97,7 @@ class MetadataPackageFragment(
private fun computeMemberScope(): MemberScope {
// 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
val packageParts = packagePartProvider.findMetadataPackageParts(fqName.asString())
val packageParts = metadataPartProvider.findMetadataPackageParts(fqName.asString())
val scopes = arrayListOf<DeserializedPackageMemberScope>()
for (partName in packageParts) {
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.metadata.jvm.deserialization.PackageParts
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> =
getPackageParts(packageFqName).flatMap(PackageParts::parts).distinct()
@@ -128,7 +128,7 @@ internal class ProjectResolutionFacade(
)
val commonPlatformParameters = CommonAnalysisParameters(
packagePartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }
metadataPartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }
)
val resolverForProject = ResolverForProjectImpl(