Added deprecated PackageFragmentProvider#getPackageFragments for BWC

Relates to ^KT-33394
^KT-42259 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-09-29 19:14:44 +00:00
parent a228206cf5
commit 3c380faeb5
21 changed files with 97 additions and 48 deletions
@@ -20,20 +20,27 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
interface PackageFragmentProvider {
fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>)
fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
val packageFragments = mutableListOf<PackageFragmentDescriptor>()
collectPackageFragments(fqName, packageFragments)
return packageFragments
fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
// default implementation is provided only for BWC
packageFragments.addAll(getPackageFragments(fqName))
}
fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
@Deprecated("for usages use #packageFragments(FqName) at final point, for impl use #collectPackageFragments(FqName, MutableCollection<PackageFragmentDescriptor>)")
fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor>
fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
object Empty : PackageFragmentProvider {
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {}
override fun getPackageFragments(fqName: FqName) = emptyList<PackageFragmentDescriptor>()
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) = emptySet<FqName>()
}
}
fun PackageFragmentProvider.packageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
val packageFragments = mutableListOf<PackageFragmentDescriptor>()
collectPackageFragments(fqName, packageFragments)
return packageFragments
}
@@ -26,6 +26,9 @@ class PackageFragmentProviderImpl(
this.packageFragments.filterTo(packageFragments) { it.fqName == fqName }
}
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> =
packageFragments.filter { it.fqName == fqName }
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> =
packageFragments.asSequence()
.map { it.fqName }
@@ -32,6 +32,14 @@ class CompositePackageFragmentProvider(// can be modified from outside
}
}
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
val result = ArrayList<PackageFragmentDescriptor>()
for (provider in providers) {
provider.collectPackageFragments(fqName, result)
}
return result.toList()
}
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
for (provider in providers) {
provider.collectPackageFragments(fqName, packageFragments)
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.packageFragments
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope
import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter
@@ -34,7 +35,7 @@ class LazyPackageViewDescriptorImpl(
) : DeclarationDescriptorImpl(Annotations.EMPTY, fqName.shortNameOrSpecial()), PackageViewDescriptor {
override val fragments: List<PackageFragmentDescriptor> by storageManager.createLazyValue {
module.packageFragmentProvider.getPackageFragments(fqName)
module.packageFragmentProvider.packageFragments(fqName)
}
override val memberScope: MemberScope = LazyScopeAdapter(storageManager) {
@@ -43,5 +43,7 @@ abstract class AbstractDeserializedPackageFragmentProvider(
packageFragments.addIfNotNull(fragments(fqName))
}
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> = listOfNotNull(fragments(fqName))
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> = emptySet()
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.packageFragments
import org.jetbrains.kotlin.metadata.deserialization.TypeTable
import org.jetbrains.kotlin.metadata.deserialization.VersionRequirementTable
import org.jetbrains.kotlin.name.ClassId
@@ -52,7 +53,7 @@ class ClassDeserializer(private val components: DeserializationComponents) {
outerClass.c
} else {
val fragments = components.packageFragmentProvider.getPackageFragments(classId.packageFqName)
val fragments = components.packageFragmentProvider.packageFragments(classId.packageFqName)
val fragment = fragments.firstOrNull { it !is DeserializedPackageFragment || it.hasTopLevelClass(classId.shortClassName) }
?: return null
@@ -17,11 +17,12 @@
package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.descriptors.packageFragments
import org.jetbrains.kotlin.name.ClassId
class DeserializedClassDataFinder(private val packageFragmentProvider: PackageFragmentProvider) : ClassDataFinder {
override fun findClassData(classId: ClassId): ClassData? {
val packageFragments = packageFragmentProvider.getPackageFragments(classId.packageFqName)
val packageFragments = packageFragmentProvider.packageFragments(classId.packageFqName)
for (fragment in packageFragments) {
if (fragment !is DeserializedPackageFragment) continue