diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index dd5e3932f98..7c3aae06db1 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.asJava.classes import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Comparing import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange import com.intellij.psi.* @@ -222,18 +221,24 @@ abstract class KtLightClassForSourceDeclaration( psiModifiers.add(PsiModifier.PUBLIC) } - - // FINAL - if (isAbstract() || isSealed()) { - psiModifiers.add(PsiModifier.ABSTRACT) - } else if (!(classOrObject.hasModifier(OPEN_KEYWORD) || (classOrObject is KtClass && classOrObject.isEnum()))) { - val descriptor = lazy { getDescriptor() } - var modifier = PsiModifier.FINAL - project.applyCompilerPlugins { - modifier = it.interceptModalityBuilding(kotlinOrigin, descriptor, modifier) + // ABSTRACT | FINAL + when { + isAbstract() || isSealed() -> { + psiModifiers.add(PsiModifier.ABSTRACT) } - if (modifier == PsiModifier.FINAL) { - psiModifiers.add(PsiModifier.FINAL) + isEnum -> { + // Enum class should not be `final`, since its enum entries extend it. + // It could be either `abstract` w/o ctor, or empty modality w/ private ctor. + } + !(classOrObject.hasModifier(OPEN_KEYWORD)) -> { + val descriptor = lazy { getDescriptor() } + var modifier = PsiModifier.FINAL + project.applyCompilerPlugins { + modifier = it.interceptModalityBuilding(kotlinOrigin, descriptor, modifier) + } + if (modifier == PsiModifier.FINAL) { + psiModifiers.add(PsiModifier.FINAL) + } } } @@ -620,4 +625,4 @@ private fun hasParseErrorsAround(psi: PsiElement): Boolean { } return false -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 029dad04663..0253fd0e196 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -53,7 +53,13 @@ internal class KtFirNamedClassOrObjectSymbol( override val modality: Modality get() = getModality( FirResolvePhase.RAW_FIR, - if (classKind == KtClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL + when (classKind) { // default modality + KtClassKind.INTERFACE -> Modality.ABSTRACT + // Enum class should not be `final`, since its entries extend it. + // It could be either `abstract` w/o ctor, or empty modality w/ private ctor. + KtClassKind.ENUM_CLASS -> Modality.OPEN + else -> Modality.FINAL + } ) /* FirRegularClass visibility are not modified by STATUS only for Unknown so it can be taken from RAW */