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.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)
|
||||
|
||||
-3
@@ -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>()
|
||||
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
-3
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
+8
-9
@@ -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
|
||||
|
||||
+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.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()
|
||||
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ internal class ProjectResolutionFacade(
|
||||
)
|
||||
|
||||
val commonPlatformParameters = CommonAnalysisParameters(
|
||||
packagePartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }
|
||||
metadataPartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) }
|
||||
)
|
||||
|
||||
val resolverForProject = ResolverForProjectImpl(
|
||||
|
||||
Reference in New Issue
Block a user