[FIR] Fix work with scopes in FirNativeObjCRefinementOverridesChecker

This fixes the following test, which started to fail after previous commits:
- `FirPsiOldFrontendNativeDiagnosticsTestGenerated#testObjCRefinement`
This commit is contained in:
Dmitriy Novozhilov
2023-11-27 17:24:43 +02:00
committed by Space Team
parent 4a2f9a5123
commit 3a5e45eb55
@@ -20,10 +20,8 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassLikeSymbol
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.unexpandedConeClassLikeType
import org.jetbrains.kotlin.fir.isIntersectionOverride
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
@@ -31,19 +29,19 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) {
// We just need to check intersection overrides, all other declarations are checked by FirNativeObjCRefinementChecker
val firTypeScope = declaration.unsubstitutedScope(context)
firTypeScope.processAllFunctions { symbol ->
val baseScope = declaration.unsubstitutedScope(context)
baseScope.processAllFunctions { symbol ->
if (!symbol.isIntersectionOverride) return@processAllFunctions
check(firTypeScope, symbol, declaration, context, reporter, emptyList(), emptyList())
check(baseScope, symbol, declaration, context, reporter, emptyList(), emptyList())
}
firTypeScope.processAllProperties { symbol ->
baseScope.processAllProperties { symbol ->
if (!symbol.isIntersectionOverride) return@processAllProperties
check(firTypeScope, symbol, declaration, context, reporter, emptyList(), emptyList())
check(baseScope, symbol, declaration, context, reporter, emptyList(), emptyList())
}
}
fun check(
firTypeScope: FirTypeScope,
baseScope: FirTypeScope,
memberSymbol: FirCallableSymbol<*>,
declarationToReport: FirDeclaration,
context: CheckerContext,
@@ -51,14 +49,14 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
objCAnnotations: List<FirAnnotation>,
swiftAnnotations: List<FirAnnotation>
) {
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(memberSymbol)
val overriddenMemberSymbols = baseScope.getDirectOverriddenMembersWithBaseScope(memberSymbol)
if (overriddenMemberSymbols.isEmpty()) return
var isHiddenFromObjC = objCAnnotations.isNotEmpty()
var isRefinedInSwift = swiftAnnotations.isNotEmpty()
val supersNotHiddenFromObjC = mutableListOf<FirCallableSymbol<*>>()
val supersNotRefinedInSwift = mutableListOf<FirCallableSymbol<*>>()
for (symbol in overriddenMemberSymbols) {
val (superIsHiddenFromObjC, superIsRefinedInSwift) = symbol.inheritsRefinedAnnotations(context.session, firTypeScope)
for ((symbol, scope) in overriddenMemberSymbols) {
val (superIsHiddenFromObjC, superIsRefinedInSwift) = symbol.inheritsRefinedAnnotations(context.session, scope)
if (superIsHiddenFromObjC) isHiddenFromObjC = true else supersNotHiddenFromObjC.add(symbol)
if (superIsRefinedInSwift) isRefinedInSwift = true else supersNotRefinedInSwift.add(symbol)
}
@@ -70,13 +68,13 @@ object FirNativeObjCRefinementOverridesChecker : FirClassChecker() {
}
}
private fun FirCallableSymbol<*>.inheritsRefinedAnnotations(session: FirSession, firTypeScope: FirTypeScope): Pair<Boolean, Boolean> {
private fun FirCallableSymbol<*>.inheritsRefinedAnnotations(session: FirSession, baseScope: 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.retrieveDirectOverriddenOf(this).firstOrNull()
val (overriddenMemberSymbol, scope) = baseScope.getDirectOverriddenMembersWithBaseScope(this).firstOrNull()
?: return hasObjC to hasSwift
val (inheritsObjC, inheritsSwift) = overriddenMemberSymbol.inheritsRefinedAnnotations(session, firTypeScope)
val (inheritsObjC, inheritsSwift) = overriddenMemberSymbol.inheritsRefinedAnnotations(session, scope)
return (hasObjC || inheritsObjC) to (hasSwift || inheritsSwift)
}