diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProvider.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProvider.kt index 378d38bfe93..76cd7f3ea9d 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProvider.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/JvmPackagePartProvider.kt @@ -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) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt index 7dd88e858cc..2af93a25564 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt @@ -42,9 +42,6 @@ class IncrementalPackagePartProvider( parent.findPackageParts(packageFqName)).distinct() } - // TODO - override fun findMetadataPackageParts(packageFqName: String): List = TODO() - override fun getAnnotationsOnBinaryModule(moduleName: String): List { return parent.getAnnotationsOnBinaryModule(moduleName) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonAnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonAnalyzerFacade.kt index 1f13f094552..00c1e464c29 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonAnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonAnalyzerFacade.kt @@ -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, moduleName: Name, dependOnBuiltIns: Boolean, languageVersionSettings: LanguageVersionSettings, capabilities: Map, Any?> = mapOf(MultiTargetPlatform.CAPABILITY to MultiTargetPlatform.Common), - packagePartProviderFactory: (ModuleContent) -> PackagePartProvider + metadataPartProviderFactory: (ModuleContent) -> 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() useImpl() - useInstance(packagePartProvider) + useInstance(metadataPartProvider) useInstance(declarationProviderFactory) useImpl() diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt index 125bb0085cb..b3d170d91b3 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt @@ -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 diff --git a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/RuntimePackagePartProvider.kt b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/RuntimePackagePartProvider.kt index 6ec2a7af174..4fef7c09ef2 100644 --- a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/RuntimePackagePartProvider.kt +++ b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/RuntimePackagePartProvider.kt @@ -60,9 +60,6 @@ class RuntimePackagePartProvider(private val classLoader: ClassLoader) : Package override fun findPackageParts(packageFqName: String): List = packageParts[packageFqName]?.toList().orEmpty() - // TODO - override fun findMetadataPackageParts(packageFqName: String): List = TODO() - override fun getAnnotationsOnBinaryModule(moduleName: String): List { // TODO: load annotations from resource files return emptyList() diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackagePartProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackagePartProvider.kt index 54a1ccb9cd9..29185dcfbed 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackagePartProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PackagePartProvider.kt @@ -28,18 +28,11 @@ interface PackagePartProvider { */ fun findPackageParts(packageFqName: String): List - /** - * @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 - fun getAnnotationsOnBinaryModule(moduleName: String): List object Empty : PackagePartProvider { override fun findPackageParts(packageFqName: String): List = emptyList() - override fun findMetadataPackageParts(packageFqName: String): List = emptyList() - override fun getAnnotationsOnBinaryModule(moduleName: String): List = emptyList() } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt index 1a0f26068d1..0c64b1de98c 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt @@ -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() for (partName in packageParts) { val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPartProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPartProvider.kt new file mode 100644 index 00000000000..cb06fb3e299 --- /dev/null +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPartProvider.kt @@ -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 + + object Empty : MetadataPartProvider { + override fun findMetadataPackageParts(packageFqName: String): List = emptyList() + } +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEPackagePartProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEPackagePartProvider.kt index 0a2c5bbd59d..e2c5acc2f8c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEPackagePartProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IDEPackagePartProvider.kt @@ -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 = getPackageParts(packageFqName).flatMap(PackageParts::parts).distinct() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt index 6c4479dc828..ba442d5ac08 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt @@ -128,7 +128,7 @@ internal class ProjectResolutionFacade( ) val commonPlatformParameters = CommonAnalysisParameters( - packagePartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) } + metadataPartProviderFactory = { IDEPackagePartProvider(it.moduleContentScope) } ) val resolverForProject = ResolverForProjectImpl(