[FE, IR] Check annotations on expect and actual enum entries
^KT-60668 ^KT-60936
This commit is contained in:
committed by
Space Team
parent
b57940a59b
commit
def4388c19
+28
@@ -5,8 +5,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.calls.mpp
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.mpp.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.resolve.checkers.OptInNames
|
||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
|
||||
@@ -80,6 +82,9 @@ object AbstractExpectActualAnnotationMatchChecker {
|
||||
if (checkClassScopesForAnnotationCompatibility) {
|
||||
checkAnnotationsInClassMemberScope(expectSymbol, actualSymbol)?.let { return it }
|
||||
}
|
||||
if (expectSymbol.classKind == ClassKind.ENUM_CLASS && actualSymbol.classKind == ClassKind.ENUM_CLASS) {
|
||||
checkAnnotationsOnEnumEntries(expectSymbol, actualSymbol)?.let { return it }
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
@@ -170,4 +175,27 @@ object AbstractExpectActualAnnotationMatchChecker {
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
context (ExpectActualMatchingContext<*>)
|
||||
private fun checkAnnotationsOnEnumEntries(
|
||||
expectClassSymbol: RegularClassSymbolMarker,
|
||||
actualClassSymbol: RegularClassSymbolMarker,
|
||||
): Incompatibility? {
|
||||
fun DeclarationSymbolMarker.getEnumEntryName(): Name =
|
||||
when (this) {
|
||||
is CallableSymbolMarker -> callableId.callableName
|
||||
is RegularClassSymbolMarker -> classId.shortClassName
|
||||
else -> error("Unexpected type $this")
|
||||
}
|
||||
|
||||
val expectEnumEntries = expectClassSymbol.collectEnumEntries()
|
||||
val actualEnumEntriesByName = actualClassSymbol.collectEnumEntries().associateBy { it.getEnumEntryName() }
|
||||
|
||||
for (expectEnumEntry in expectEnumEntries) {
|
||||
val actualEnumEntry = actualEnumEntriesByName[expectEnumEntry.getEnumEntryName()] ?: continue
|
||||
areAnnotationsSetOnDeclarationsCompatible(expectEnumEntry, actualEnumEntry)
|
||||
?.let { return it }
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
+1
@@ -111,6 +111,7 @@ interface ExpectActualMatchingContext<T : DeclarationSymbolMarker> : TypeSystemC
|
||||
fun RegularClassSymbolMarker.getMembersForExpectClass(name: Name): List<DeclarationSymbolMarker>
|
||||
|
||||
fun RegularClassSymbolMarker.collectEnumEntryNames(): List<Name>
|
||||
fun RegularClassSymbolMarker.collectEnumEntries(): List<DeclarationSymbolMarker>
|
||||
|
||||
val CallableSymbolMarker.dispatchReceiverType: KotlinTypeMarker?
|
||||
val CallableSymbolMarker.extensionReceiverType: KotlinTypeMarker?
|
||||
|
||||
Reference in New Issue
Block a user