Extract MetadataPartProvider out of PackagePartProvider
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
-3
@@ -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>()
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
-3
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-9
@@ -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
|
||||||
|
|||||||
+17
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -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()
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user