Revert "K2: reimplement collectEnumEntries using scopes"

This reverts commit c8326a9bfcbf638ee04397df4d96e99bd75bab63.
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumEntryInitializationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumEntryInitializationChecker.kt
index e799fdc..deeebcd 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumEntryInitializationChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirEnumEntryInitializationChecker.kt
@@ -18,7 +18,6 @@
 import org.jetbrains.kotlin.fir.declarations.FirClass
 import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
 import org.jetbrains.kotlin.fir.declarations.FirRegularClass
-import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
 import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
 import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
 import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
@@ -35,7 +34,7 @@
     override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
         if (!declaration.isEnumClass) return
         if (!context.languageVersionSettings.supportsFeature(ProperUninitializedEnumEntryAccessAnalysis)) return
-        val enumEntries = declaration.collectEnumEntries(context.session)
+        val enumEntries = declaration.declarations.filterIsInstance<FirEnumEntry>()
         if (enumEntries.isEmpty()) return
         val enumEntrySymbols = enumEntries.mapTo(mutableSetOf()) { it.symbol }
         checkClass(declaration, enumEntrySymbols, context, reporter)
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt
index 185f9e1..da6d132 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt
@@ -62,10 +62,7 @@
         if (fqName.isRoot || fqName.parent().isRoot) return
         val classId = ClassId.topLevel(fqName.parent())
         val classSymbol = classId.resolveToClass(context) ?: return
-        if (classSymbol.isEnumClass && classSymbol.collectEnumEntries(context.session).any {
-                it.callableId.callableName == fqName.shortName()
-            }
-        ) {
+        if (classSymbol.isEnumClass && classSymbol.collectEnumEntries().any { it.callableId.callableName == fqName.shortName() }) {
             reporter.reportOn(import.source, FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, classSymbol.classId.shortClassName, context)
         }
     }
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideSimpleEnumEntryChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideSimpleEnumEntryChecker.kt
index 3ac690b..fa1cd14 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideSimpleEnumEntryChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideSimpleEnumEntryChecker.kt
@@ -12,7 +12,7 @@
 import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
 import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ABSTRACT_MEMBER_NOT_IMPLEMENTED_BY_ENUM_ENTRY
 import org.jetbrains.kotlin.fir.declarations.FirClass
-import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
+import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
 import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
 import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
 import org.jetbrains.kotlin.fir.declarations.utils.isExpect
@@ -38,7 +38,7 @@
         if (!declaration.isEnumClass) return
 
         // Enum entries with an initializer are handled by FirNotImplementedOverrideChecker since they contain an AnonymousObject.
-        val enumEntries = declaration.collectEnumEntries(context.session).filter { it.initializer == null && it.source != null }
+        val enumEntries = declaration.declarations.filterIsInstance<FirEnumEntry>().filter { it.initializer == null && it.source != null }
         if (enumEntries.isEmpty()) return
 
         val enumScope = declaration.unsubstitutedScope(context)
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirUnresolvedInMiddleOfImportChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirUnresolvedInMiddleOfImportChecker.kt
index 6a58412..7deca07 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirUnresolvedInMiddleOfImportChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/syntax/FirUnresolvedInMiddleOfImportChecker.kt
@@ -8,7 +8,6 @@
 import org.jetbrains.kotlin.KtSourceElement
 import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
 import org.jetbrains.kotlin.diagnostics.reportOn
-import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
 import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
 import org.jetbrains.kotlin.fir.analysis.getSourceForImportSegment
@@ -17,6 +16,7 @@
 import org.jetbrains.kotlin.fir.declarations.collectEnumEntries
 import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass
 import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedParentInImport
+import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
 import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
 import org.jetbrains.kotlin.fir.resolve.transformers.PackageResolutionResult
 import org.jetbrains.kotlin.fir.resolve.transformers.resolveToPackageOrClass
@@ -43,9 +43,10 @@
             is ConeUnresolvedParentInImport -> {
                 val source = import.source ?: return
 
+                val symbolProvider = context.session.symbolProvider
                 val parentClassId = diagnostic.parentClassId
 
-                if (import.isAllUnder && isClassIdPointingToEnumEntry(context.session, parentClassId)) {
+                if (import.isAllUnder && isClassIdPointingToEnumEntry(parentClassId, symbolProvider)) {
                     // Enum entries cannot be resolved as class so star import of enum falls in here and we treat it as
                     // CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON
                     reporter.reportOn(
@@ -61,7 +62,7 @@
                 // from 1 to skip the last imported name.
                 var errorSegmentIndexFromLast = if (import.isAllUnder) 0 else 1
                 var currentClassId = parentClassId.parentClassId
-                while (currentClassId != null && context.session.symbolProvider.getClassLikeSymbolByClassId(currentClassId) == null) {
+                while (currentClassId != null && symbolProvider.getClassLikeSymbolByClassId(currentClassId) == null) {
                     currentClassId = currentClassId.parentClassId
                     errorSegmentIndexFromLast++
                 }
@@ -88,10 +89,10 @@
      */
     private fun ClassId.getOutermostClassName() = relativeClassName.pathSegments().first().asString()
 
-    private fun isClassIdPointingToEnumEntry(session: FirSession, classId: ClassId): Boolean {
+    private fun isClassIdPointingToEnumEntry(classId: ClassId, symbolProvider: FirSymbolProvider): Boolean {
         val enumClassId = classId.parentClassId ?: return false
         val enumClass =
-            (session.symbolProvider.getClassLikeSymbolByClassId(enumClassId) as? FirRegularClassSymbol)?.takeIf { it.isEnumClass } ?: return false
-        return enumClass.collectEnumEntries(session).any { it.callableId.callableName == classId.shortClassName }
+            (symbolProvider.getClassLikeSymbolByClassId(enumClassId) as? FirRegularClassSymbol)?.takeIf { it.isEnumClass } ?: return false
+        return enumClass.collectEnumEntries().any { it.callableId.callableName == classId.shortClassName }
     }
 }
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt
index b29f499..e6f311f 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/declarations/declarationUtils.kt
@@ -32,19 +32,14 @@
     return constructors(session).find(FirConstructorSymbol::isPrimary)
 }
 
-fun FirClass.collectEnumEntries(session: FirSession): List<FirEnumEntry> {
+// TODO: dog shit, rewrite with scopes
+fun FirClass.collectEnumEntries(): Collection<FirEnumEntry> {
     assert(classKind == ClassKind.ENUM_CLASS)
-    val result = mutableListOf<FirEnumEntry>()
-    session.declaredMemberScope(this, memberRequiredPhase = null).processAllProperties {
-        if (it is FirEnumEntrySymbol) {
-            result.add(it.fir)
-        }
-    }
-    return result
+    return declarations.filterIsInstance<FirEnumEntry>()
 }
 
-fun FirClassSymbol<*>.collectEnumEntries(session: FirSession): List<FirEnumEntrySymbol> {
-    return fir.collectEnumEntries(session).map { it.symbol }
+fun FirClassSymbol<*>.collectEnumEntries(): Collection<FirEnumEntrySymbol> {
+    return fir.collectEnumEntries().map { it.symbol }
 }
 
 /**
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt
index 091e133..2b4bda0 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirWhenExhaustivenessTransformer.kt
@@ -495,7 +495,7 @@
                 val symbol = session.symbolProvider.getClassLikeSymbolByClassId(it) as? FirRegularClassSymbol
                 symbol?.collectAllSubclassesTo(destination, session)
             }
-            fir.classKind == ClassKind.ENUM_CLASS -> fir.collectEnumEntries(session).mapTo(destination) { it.symbol }
+            fir.classKind == ClassKind.ENUM_CLASS -> fir.collectEnumEntries().mapTo(destination) { it.symbol }
             else -> destination.add(this)
         }
     }
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt
index 55f88bf..d8ac178 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt
@@ -254,11 +254,11 @@
     }
 
     override fun RegularClassSymbolMarker.collectEnumEntryNames(): List<Name> {
-        return asSymbol().fir.collectEnumEntries(actualSession).map { it.name }
+        return asSymbol().fir.collectEnumEntries().map { it.name }
     }
 
     override fun RegularClassSymbolMarker.collectEnumEntries(): List<DeclarationSymbolMarker> {
-        return asSymbol().fir.collectEnumEntries(actualSession).map { it.symbol }
+        return asSymbol().fir.collectEnumEntries().map { it.symbol }
     }
 
     override val CallableSymbolMarker.dispatchReceiverType: SimpleTypeMarker?
diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt
index a4ebfb0..1e92bc1 100644
--- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt
+++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt
@@ -70,10 +70,10 @@
     }
 }
 
-private fun FirEnumEntryDeserializedAccessExpression.toReference(session: FirSession): FirReference {
+fun FirEnumEntryDeserializedAccessExpression.toReference(session: FirSession): FirReference {
     val enumSymbol = this.resolvedType.toRegularClassSymbol(session)
         ?: return buildErrorNamedReferenceWithNoName(ConeUnresolvedSymbolError(resolvedType.classId!!))
-    val enumEntrySymbol = enumSymbol.collectEnumEntries(session).firstOrNull { it.name == enumEntryName }
+    val enumEntrySymbol = enumSymbol.collectEnumEntries().firstOrNull { it.name == enumEntryName }
         ?: return buildErrorNamedReference {
             this.diagnostic = ConeUnresolvedNameError(enumEntryName)
             this.name = enumEntryName
diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt
index 04a47b0..2a7e26f 100644
--- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt
+++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt
@@ -477,7 +477,7 @@
     private fun CheckerContext.checkEnum(classSymbol: FirClassSymbol<*>, reporter: DiagnosticReporter) {
         if (!classSymbol.isEnumClass) return
         val entryBySerialName = mutableMapOf<String, FirEnumEntrySymbol>()
-        for (enumEntrySymbol in classSymbol.collectEnumEntries(session)) {
+        for (enumEntrySymbol in classSymbol.collectEnumEntries()) {
             val serialNameAnnotation = enumEntrySymbol.getSerialNameAnnotation(session)
             val serialName = enumEntrySymbol.getSerialNameValue(session) ?: enumEntrySymbol.name.asString()
             val firstEntry = entryBySerialName[serialName]
diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt
index 540cfc3..c8e3bc8 100644
--- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt
+++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/SerializationFirCheckerUtils.kt
@@ -119,7 +119,7 @@
     if (!isEnumClass) return false
     if (hasSerializableOrMetaAnnotation(session)) return false
     if (hasAnySerialAnnotation(session)) return true
-    return collectEnumEntries(session).any { it.hasAnySerialAnnotation(session) }
+    return collectEnumEntries().any { it.hasAnySerialAnnotation(session) }
 }
 
 internal fun FirClassSymbol<*>.serializableAnnotationIsUseless(session: FirSession): Boolean = !classKind.isEnumClass &&