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 &&