K2 checkers: extract retrieveDirectOverriddenOf to FirTypeScope.kt
This commit is contained in:
+2
-20
@@ -19,8 +19,6 @@ import org.jetbrains.kotlin.fir.isIntersectionOverride
|
|||||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
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() {
|
object FirNativeObjCNameOverridesChecker : FirClassChecker() {
|
||||||
|
|
||||||
@@ -44,7 +42,7 @@ object FirNativeObjCNameOverridesChecker : FirClassChecker() {
|
|||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
reporter: DiagnosticReporter
|
reporter: DiagnosticReporter
|
||||||
) {
|
) {
|
||||||
val overriddenSymbols = firTypeScope.getDirectOverriddenSymbols(memberSymbol)
|
val overriddenSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
|
||||||
if (overriddenSymbols.isEmpty()) return
|
if (overriddenSymbols.isEmpty()) return
|
||||||
val objCNames = overriddenSymbols.map { it.getFirstBaseSymbol(firTypeScope).getObjCNames() }
|
val objCNames = overriddenSymbols.map { it.getFirstBaseSymbol(firTypeScope).getObjCNames() }
|
||||||
if (!objCNames.allNamesEquals()) {
|
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<*> {
|
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)
|
return if (overriddenMemberSymbols.isEmpty()) this else overriddenMemberSymbols.first().getFirstBaseSymbol(firTypeScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-20
@@ -25,8 +25,6 @@ import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
|||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
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() {
|
object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
|
||||||
|
|
||||||
@@ -52,7 +50,7 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
|
|||||||
objCAnnotations: List<FirAnnotation>,
|
objCAnnotations: List<FirAnnotation>,
|
||||||
swiftAnnotations: List<FirAnnotation>
|
swiftAnnotations: List<FirAnnotation>
|
||||||
) {
|
) {
|
||||||
val overriddenMemberSymbols = firTypeScope.getDirectOverriddenSymbols(memberSymbol)
|
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
|
||||||
if (overriddenMemberSymbols.isEmpty()) return
|
if (overriddenMemberSymbols.isEmpty()) return
|
||||||
var isHiddenFromObjC = objCAnnotations.isNotEmpty()
|
var isHiddenFromObjC = objCAnnotations.isNotEmpty()
|
||||||
var isRefinedInSwift = swiftAnnotations.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> {
|
private fun FirCallableSymbol<*>.inheritsRefinedAnnotations(session: FirSession, firTypeScope: FirTypeScope): Pair<Boolean, Boolean> {
|
||||||
val (hasObjC, hasSwift) = hasRefinedAnnotations(session)
|
val (hasObjC, hasSwift) = hasRefinedAnnotations(session)
|
||||||
if (hasObjC && hasSwift) return true to true
|
if (hasObjC && hasSwift) return true to true
|
||||||
// Note: `checkMember` requires all overridden symbols to be either refined or not refined.
|
// 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
|
?: return hasObjC to hasSwift
|
||||||
val (inheritsObjC, inheritsSwift) = overriddenMemberSymbol.inheritsRefinedAnnotations(session, firTypeScope)
|
val (inheritsObjC, inheritsSwift) = overriddenMemberSymbol.inheritsRefinedAnnotations(session, firTypeScope)
|
||||||
return (hasObjC || inheritsObjC) to (hasSwift || inheritsSwift)
|
return (hasObjC || inheritsObjC) to (hasSwift || inheritsSwift)
|
||||||
|
|||||||
@@ -254,6 +254,22 @@ fun FirTypeScope.getDirectOverriddenProperties(
|
|||||||
return overriddenProperties.toList()
|
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(
|
private inline fun <reified D : FirCallableSymbol<*>> MutableCollection<D>.addOverridden(
|
||||||
symbol: D,
|
symbol: D,
|
||||||
unwrapIntersectionAndSubstitutionOverride: Boolean
|
unwrapIntersectionAndSubstitutionOverride: Boolean
|
||||||
|
|||||||
Reference in New Issue
Block a user