From 6342e6ecadf9a5d6e5ff2a8f8d3672bd0e3848e8 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Mon, 6 Sep 2021 22:06:39 -0700 Subject: [PATCH] FIR/LC: fix modality of enum class enum class, which is extended by enum entries, should not be final. (Those enum entries should be, instead.) enum class itself wouldn't be instantiated, and thus it's technically abstract, but having a private ctor() would be an option. For the latter case, we can simply put no modality modifier. --- .../KtLightClassForSourceDeclaration.kt | 31 +++++++++++-------- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 8 ++++- 2 files changed, 25 insertions(+), 14 deletions(-) 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 */