KTIJ-664 [SealedClassInheritorsProvider]: IDE-specific implementation

This commit is contained in:
Andrei Klunnyi
2020-12-10 15:09:16 +01:00
parent f02b73103b
commit 3af0257b38
17 changed files with 181 additions and 24 deletions
@@ -18,17 +18,17 @@ abstract class SealedClassInheritorsProvider {
*/
abstract fun computeSealedSubclasses(
sealedClass: ClassDescriptor,
freedomForSealedInterfacesSupported: Boolean
allowSealedInheritorsInDifferentFilesOfSamePackage: Boolean
): Collection<ClassDescriptor>
}
object SealedClassInheritorsProviderImpl : SealedClassInheritorsProvider() {
object CliSealedClassInheritorsProvider : SealedClassInheritorsProvider() {
// Note this is a generic and slow implementation which would work almost for any subclass of ClassDescriptor.
// Please avoid using it in new code.
// TODO: do something more clever instead at call sites of this function
override fun computeSealedSubclasses(
sealedClass: ClassDescriptor,
freedomForSealedInterfacesSupported: Boolean
allowSealedInheritorsInDifferentFilesOfSamePackage: Boolean
): Collection<ClassDescriptor> {
if (sealedClass.modality != Modality.SEALED) return emptyList()
@@ -48,7 +48,7 @@ object SealedClassInheritorsProviderImpl : SealedClassInheritorsProvider() {
}
}
val container = if (!freedomForSealedInterfacesSupported) {
val container = if (!allowSealedInheritorsInDifferentFilesOfSamePackage) {
sealedClass.containingDeclaration
} else {
sealedClass.parents.firstOrNull { it is PackageFragmentDescriptor }
@@ -56,7 +56,7 @@ object SealedClassInheritorsProviderImpl : SealedClassInheritorsProvider() {
if (container is PackageFragmentDescriptor) {
collectSubclasses(
container.getMemberScope(),
collectNested = freedomForSealedInterfacesSupported
collectNested = allowSealedInheritorsInDifferentFilesOfSamePackage
)
}
collectSubclasses(sealedClass.unsubstitutedInnerClassesScope, collectNested = true)
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.NonReportingOverrideStrategy
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.SealedClassInheritorsProviderImpl
import org.jetbrains.kotlin.resolve.CliSealedClassInheritorsProvider
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
@@ -165,7 +165,7 @@ class DeserializedClassDescriptor(
}
// This is needed because classes compiled with Kotlin 1.0 did not contain the sealed_subclass_fq_name field
return SealedClassInheritorsProviderImpl.computeSealedSubclasses(this, freedomForSealedInterfacesSupported = false)
return CliSealedClassInheritorsProvider.computeSealedSubclasses(this, allowSealedInheritorsInDifferentFilesOfSamePackage = false)
}
override fun getSealedSubclasses() = sealedSubclasses()