From 9a4eb2a3682e678f822803f097236995d963b151 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 Dec 2015 18:09:44 +0300 Subject: [PATCH] Refactoring: ClassDescriptor.isFinal, no more Modality.isOverridable --- .../kotlin/codegen/MutableClassDescriptor.java | 2 +- .../kotlin/codegen/state/typeMappingUtil.kt | 2 +- .../calls/smartcasts/DataFlowValueFactory.java | 2 +- .../lazy/descriptors/LazyClassDescriptor.java | 2 +- .../java/lazy/descriptors/LazyJavaClassDescriptor.kt | 2 +- .../src/org/jetbrains/kotlin/descriptors/Modality.kt | 12 +++++++----- .../descriptors/DeserializedClassDescriptor.kt | 2 +- .../idea/liveTemplates/macro/AnonymousSuperMacro.kt | 3 ++- .../kotlin/js/translate/utils/ManglingUtils.java | 2 +- 9 files changed, 16 insertions(+), 13 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MutableClassDescriptor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MutableClassDescriptor.java index fc3d1d14a3c..c090824307f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MutableClassDescriptor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MutableClassDescriptor.java @@ -154,7 +154,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class this.typeConstructor = TypeConstructorImpl.createForClass( this, Annotations.Companion.getEMPTY(), - !getModality().isOverridable(), + ModalityKt.isFinal(this), getName().asString(), typeParameters, supertypes diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt index f4a6674e47e..d218fa64320 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/typeMappingUtil.kt @@ -40,7 +40,7 @@ private fun KotlinType.canHaveSubtypesIgnoringNullability(): Boolean { when (descriptor) { is TypeParameterDescriptor -> return true - is ClassDescriptor -> if (descriptor.modality.isOverridable) return true + is ClassDescriptor -> if (!descriptor.isFinal) return true } for ((parameter, argument) in constructor.parameters.zip(arguments)) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java index d7081559ac8..3dc8d922628 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java @@ -447,7 +447,7 @@ public class DataFlowValueFactory { DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); if (containingDeclaration instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; - if (classDescriptor.getModality().isOverridable() && ModalityKt.isOverridable(propertyDescriptor)) return false; + if (!ModalityKt.isFinal(classDescriptor) && ModalityKt.isOverridable(propertyDescriptor)) return false; } else { if (ModalityKt.isOverridable(propertyDescriptor)) { 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 51ca9931daa..0624cf3acee 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 @@ -676,7 +676,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @Override public boolean isFinal() { - return !getModality().isOverridable(); + return getModality() == Modality.FINAL; } @Override diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt index ae0d47cf41d..a37cb82a45b 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -206,7 +206,7 @@ class LazyJavaClassDescriptor( override fun getAnnotations() = Annotations.EMPTY - override fun isFinal() = !getModality().isOverridable + override fun isFinal(): Boolean = isFinal override fun isDenotable() = true diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Modality.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Modality.kt index ab3fad4b6b7..adc7c9a13ab 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Modality.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Modality.kt @@ -17,13 +17,13 @@ package org.jetbrains.kotlin.descriptors // For sealed classes, isOverridable is false but isOverridableByMembers is true -enum class Modality private constructor(val isOverridable: Boolean) { +enum class Modality { // THE ORDER OF ENTRIES MATTERS HERE - FINAL(false), + FINAL, // NB: class can be sealed but not function or property - SEALED(true), - OPEN(true), - ABSTRACT(true); + SEALED, + OPEN, + ABSTRACT; companion object { @@ -39,3 +39,5 @@ enum class Modality private constructor(val isOverridable: Boolean) { val CallableMemberDescriptor.isOverridable: Boolean get() = modality != Modality.FINAL +val ClassDescriptor.isFinal: Boolean + get() = modality == Modality.FINAL diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 5883d23cc65..f0364d44cbd 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -181,7 +181,7 @@ public class DeserializedClassDescriptor( override fun getSupertypes() = supertypes() - override fun isFinal() = !getModality().isOverridable + override fun isFinal(): Boolean = isFinal override fun isDenotable() = true diff --git a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousSuperMacro.kt b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousSuperMacro.kt index 8b21863a1c3..47c45455bac 100644 --- a/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousSuperMacro.kt +++ b/idea/idea-live-templates/src/org/jetbrains/kotlin/idea/liveTemplates/macro/AnonymousSuperMacro.kt @@ -27,6 +27,7 @@ import com.intellij.psi.PsiNamedElement import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.isFinal import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.util.getResolutionScope @@ -73,7 +74,7 @@ class AnonymousSuperMacro : Macro() { return resolutionScope .collectDescriptorsFiltered(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS) - .filter { it is ClassDescriptor && it.modality.isOverridable && (it.kind == ClassKind.CLASS || it.kind == ClassKind.INTERFACE) } + .filter { it is ClassDescriptor && !it.isFinal && (it.kind == ClassKind.CLASS || it.kind == ClassKind.INTERFACE) } .mapNotNull { DescriptorToSourceUtils.descriptorToDeclaration(it) as PsiNamedElement? } } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java index 4798229a8f3..b90e7515074 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/ManglingUtils.java @@ -86,7 +86,7 @@ public class ManglingUtils { ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; // Use stable mangling when it's inside an overridable declaration to avoid clashing names on inheritance. - if (classDescriptor.getModality().isOverridable()) { + if (!ModalityKt.isFinal(classDescriptor)) { return true; }