From 55b0775565ffa38eb7c392ccb63ac60b1b0cfb62 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 14 Dec 2020 10:42:24 +0300 Subject: [PATCH] [FE] Call SealedClassInheritorsProvider only for sealed classes --- .../resolve/lazy/descriptors/LazyClassDescriptor.java | 10 +++++++++- .../kotlin/resolve/SealedClassInheritorsProvider.kt | 3 +++ .../commonizer/builder/CommonizedClassDescriptor.kt | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index d6d9790b64a..737e48b10e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -54,6 +54,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import static kotlin.collections.CollectionsKt.emptyList; import static kotlin.collections.CollectionsKt.firstOrNull; import static org.jetbrains.kotlin.descriptors.DescriptorVisibilities.PRIVATE; import static org.jetbrains.kotlin.descriptors.DescriptorVisibilities.PUBLIC; @@ -270,7 +271,14 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes ); boolean freedomForSealedInterfacesSupported = c.getLanguageVersionSettings().supportsFeature(LanguageFeature.AllowSealedInheritorsInDifferentFilesOfSamePackage); - this.sealedSubclasses = storageManager.createLazyValue(() -> c.getSealedClassInheritorsProvider().computeSealedSubclasses(this, freedomForSealedInterfacesSupported)); + this.sealedSubclasses = + storageManager.createLazyValue(() -> { + if (getModality() == Modality.SEALED) { + return c.getSealedClassInheritorsProvider().computeSealedSubclasses(this, freedomForSealedInterfacesSupported); + } else { + return Collections.emptyList(); + } + }); } private static boolean isIllegalInner(@NotNull DeclarationDescriptor descriptor) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/SealedClassInheritorsProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/SealedClassInheritorsProvider.kt index 7f663f6f0d2..0927584612e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/SealedClassInheritorsProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/SealedClassInheritorsProvider.kt @@ -13,6 +13,9 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope abstract class SealedClassInheritorsProvider { + /** + * This method may be called by compiler only for classes/interfaces with sealed modality + */ abstract fun computeSealedSubclasses( sealedClass: ClassDescriptor, freedomForSealedInterfacesSupported: Boolean diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt index 9cc4543f360..3404c4cd519 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/CommonizedClassDescriptor.kt @@ -54,7 +54,11 @@ class CommonizedClassDescriptor( private val typeConstructor = CommonizedClassTypeConstructor(targetComponents, cirSupertypes) private val sealedSubclasses = targetComponents.storageManager.createLazyValue { // TODO: pass proper language version settings - SealedClassInheritorsProviderImpl.computeSealedSubclasses(this, freedomForSealedInterfacesSupported = false) + if (modality == Modality.SEALED) { + SealedClassInheritorsProviderImpl.computeSealedSubclasses(this, freedomForSealedInterfacesSupported = false) + } else { + emptyList() + } } private val declaredTypeParametersAndTypeParameterResolver = targetComponents.storageManager.createLazyValue {