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.
This commit is contained in:
Jinseong Jeon
2021-09-06 22:06:39 -07:00
committed by Ilya Kirillov
parent 204c5952bf
commit 6342e6ecad
2 changed files with 25 additions and 14 deletions
@@ -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
}
}