[FIR] Add UNINITIALIZED_ENUM_ENTRY on access qualifier of local enum

^KT-59967 fixed
This commit is contained in:
Ilya Goncharov
2023-10-25 15:36:11 +00:00
committed by Space Team
parent 1ccb085e68
commit 065733e87c
3 changed files with 9 additions and 20 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol
import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol
@@ -79,6 +81,12 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() {
// We're looking for members/entries/companion object in an enum class or members in companion object of an enum class.
if (!enumClassSymbol.isEnumClass) return
// Local enum class are prohibited
// So report error on access of local enum entry
if (enumClassSymbol.visibility == Visibilities.Local) {
reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_ENTRY, calleeSymbol as FirEnumEntrySymbol, context)
}
// An accessed context within the enum class of interest. We should look up until either enum members or enum entries are found,
// not just last containing declaration. For example,
// enum class Fruit(...) {
@@ -1,20 +0,0 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun foo() {
<!WRONG_MODIFIER_TARGET!>enum<!> class A {
FOO,
BAR
}
val foo = A.FOO
val b = object {
<!WRONG_MODIFIER_TARGET!>enum<!> class B {}
}
class C {
<!WRONG_MODIFIER_TARGET!>enum<!> class D {}
}
val f = {
<!WRONG_MODIFIER_TARGET!>enum<!> class E {}
}
<!WRONG_MODIFIER_TARGET!>enum<!> class<!SYNTAX!><!> {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun foo() {