K2 checkers: extract retrieveDirectOverriddenOf to FirTypeScope.kt

This commit is contained in:
Mikhail Glukhikh
2022-09-19 16:45:35 +02:00
committed by Space
parent 9f7c465eb0
commit 8281c166b1
3 changed files with 20 additions and 40 deletions
@@ -19,8 +19,6 @@ import org.jetbrains.kotlin.fir.isIntersectionOverride
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
object FirNativeObjCNameOverridesChecker : FirClassChecker() {
@@ -44,7 +42,7 @@ object FirNativeObjCNameOverridesChecker : FirClassChecker() {
context: CheckerContext,
reporter: DiagnosticReporter
) {
val overriddenSymbols = firTypeScope.getDirectOverriddenSymbols(memberSymbol)
val overriddenSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
if (overriddenSymbols.isEmpty()) return
val objCNames = overriddenSymbols.map { it.getFirstBaseSymbol(firTypeScope).getObjCNames() }
if (!objCNames.allNamesEquals()) {
@@ -59,24 +57,8 @@ object FirNativeObjCNameOverridesChecker : FirClassChecker() {
}
}
private fun FirTypeScope.getDirectOverriddenSymbols(memberSymbol: FirCallableSymbol<*>): List<FirCallableSymbol<*>> {
return when (memberSymbol) {
is FirNamedFunctionSymbol -> {
processFunctionsByName(memberSymbol.name) {}
getDirectOverriddenFunctions(memberSymbol)
}
is FirPropertySymbol -> {
processPropertiesByName(memberSymbol.name) {}
getDirectOverriddenProperties(memberSymbol)
}
else -> error("unexpected member kind $memberSymbol")
}
}
private fun FirCallableSymbol<*>.getFirstBaseSymbol(firTypeScope: FirTypeScope): FirCallableSymbol<*> {
val overriddenMemberSymbols = firTypeScope.getDirectOverriddenSymbols(this)
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(this)
return if (overriddenMemberSymbols.isEmpty()) this else overriddenMemberSymbols.first().getFirstBaseSymbol(firTypeScope)
}
@@ -25,8 +25,6 @@ import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
@@ -52,7 +50,7 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
objCAnnotations: List<FirAnnotation>,
swiftAnnotations: List<FirAnnotation>
) {
val overriddenMemberSymbols = firTypeScope.getDirectOverriddenSymbols(memberSymbol)
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
if (overriddenMemberSymbols.isEmpty()) return
var isHiddenFromObjC = objCAnnotations.isNotEmpty()
var isRefinedInSwift = swiftAnnotations.isNotEmpty()
@@ -71,27 +69,11 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
}
}
private fun FirTypeScope.getDirectOverriddenSymbols(memberSymbol: FirCallableSymbol<*>): List<FirCallableSymbol<*>> {
return when (memberSymbol) {
is FirNamedFunctionSymbol -> {
processFunctionsByName(memberSymbol.name) {}
getDirectOverriddenFunctions(memberSymbol)
}
is FirPropertySymbol -> {
processPropertiesByName(memberSymbol.name) {}
getDirectOverriddenProperties(memberSymbol)
}
else -> error("unexpected member kind $memberSymbol")
}
}
private fun FirCallableSymbol<*>.inheritsRefinedAnnotations(session: FirSession, firTypeScope: FirTypeScope): Pair<Boolean, Boolean> {
val (hasObjC, hasSwift) = hasRefinedAnnotations(session)
if (hasObjC && hasSwift) return true to true
// Note: `checkMember` requires all overridden symbols to be either refined or not refined.
val overriddenMemberSymbol = firTypeScope.getDirectOverriddenSymbols(this).firstOrNull()
val overriddenMemberSymbol = firTypeScope.retrieveDirectOverriddenOf(this).firstOrNull()
?: return hasObjC to hasSwift
val (inheritsObjC, inheritsSwift) = overriddenMemberSymbol.inheritsRefinedAnnotations(session, firTypeScope)
return (hasObjC || inheritsObjC) to (hasSwift || inheritsSwift)
@@ -254,6 +254,22 @@ fun FirTypeScope.getDirectOverriddenProperties(
return overriddenProperties.toList()
}
fun FirTypeScope.retrieveDirectOverriddenOf(memberSymbol: FirCallableSymbol<*>): List<FirCallableSymbol<*>> {
return when (memberSymbol) {
is FirNamedFunctionSymbol -> {
processFunctionsByName(memberSymbol.name) {}
getDirectOverriddenFunctions(memberSymbol)
}
is FirPropertySymbol -> {
processPropertiesByName(memberSymbol.name) {}
getDirectOverriddenProperties(memberSymbol)
}
else -> throw IllegalArgumentException("unexpected member kind $memberSymbol")
}
}
private inline fun <reified D : FirCallableSymbol<*>> MutableCollection<D>.addOverridden(
symbol: D,
unwrapIntersectionAndSubstitutionOverride: Boolean