[FIR] Introduce isRealOwnerOf utility function

This commit is contained in:
Ivan Kochurkin
2023-10-06 20:37:44 +02:00
committed by Space Team
parent bfc0126105
commit 7ce0284e81
6 changed files with 25 additions and 18 deletions
@@ -446,33 +446,33 @@ fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
functionSymbol: FirNamedFunctionSymbol,
containingClass: FirClass,
processor: (FirNamedFunctionSymbol) -> ProcessorAction
): ProcessorAction =
processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
)
): ProcessorAction {
val ownerTag = containingClass.symbol.toLookupTag()
return processDirectOverriddenFunctionsWithBaseScope(functionSymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride && ownerTag.isRealOwnerOf(overridden))
overridden.originalForSubstitutionOverride!!
else
overridden
processor(unwrapped)
}
}
fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
propertySymbol: FirPropertySymbol,
containingClass: FirClass,
processor: (FirPropertySymbol) -> ProcessorAction
): ProcessorAction =
processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride &&
overridden.dispatchReceiverClassLookupTagOrNull() == containingClass.symbol.toLookupTag()
)
): ProcessorAction {
val ownerTag = containingClass.symbol.toLookupTag()
return processDirectOverriddenPropertiesWithBaseScope(propertySymbol) { overridden, _ ->
val unwrapped = if (overridden.fir.isSubstitutionOverride && ownerTag.isRealOwnerOf(overridden))
overridden.originalForSubstitutionOverride!!
else
overridden
processor(unwrapped)
}
}
context(Fir2IrComponents)
internal fun FirProperty.processOverriddenPropertySymbols(
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.isRealOwnerOf
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.FirFakeOverrideGenerator
@@ -212,7 +213,7 @@ class FakeOverrideGenerator(
}
private fun FirCallableSymbol<*>.shouldHaveComputedBaseSymbolsForClass(classLookupTag: ConeClassLikeLookupTag): Boolean =
fir.origin.fromSupertypes && dispatchReceiverClassLookupTagOrNull() == classLookupTag
fir.origin.fromSupertypes && classLookupTag.isRealOwnerOf(this)
@Suppress("IncorrectFormatting")
private inline fun <
@@ -383,7 +384,7 @@ class FakeOverrideGenerator(
return scope.directOverridden(symbol).map {
// Unwrapping should happen only for fake overrides members from the same class, not from supertypes
if (it.fir.isSubstitutionOverride && it.dispatchReceiverClassLookupTagOrNull() == containingClass)
if (it.fir.isSubstitutionOverride && containingClass.isRealOwnerOf(it))
it.originalForSubstitutionOverride!!
else
it
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.utils.isFinal
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.isRealOwnerOf
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -186,7 +187,7 @@ class JvmMappedScope(
it.origin == FirDeclarationOrigin.Library
private fun FirNamedFunctionSymbol.isDeclaredInMappedJavaClass(): Boolean {
return !fir.isSubstitutionOrIntersectionOverride && fir.dispatchReceiverClassLookupTagOrNull() == firJavaClass.symbol.toLookupTag()
return !fir.isSubstitutionOrIntersectionOverride && firJavaClass.symbol.toLookupTag().isRealOwnerOf(fir.symbol)
}
private fun getJdkMethodStatus(jvmDescriptor: String): JDKMemberStatus {
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectOrStaticData
import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
@@ -628,4 +629,7 @@ fun FirNamedReferenceWithCandidate.toErrorReference(diagnostic: ConeDiagnostic):
}
val FirTypeParameterSymbol.defaultType: ConeTypeParameterType
get() = ConeTypeParameterTypeImpl(toLookupTag(), isNullable = false)
get() = ConeTypeParameterTypeImpl(toLookupTag(), isNullable = false)
fun ConeClassLikeLookupTag.isRealOwnerOf(declarationSymbol: FirCallableSymbol<*>): Boolean =
this == declarationSymbol.dispatchReceiverClassLookupTagOrNull()
@@ -567,11 +567,11 @@ abstract class FirDataFlowAnalyzer(
// return true
// }
val ownerTag = this.toLookupTag()
return this.unsubstitutedScope(
session, components.scopeSession, withForcedTypeCalculator = false, memberRequiredPhase = FirResolvePhase.STATUS
).getFunctions(OperatorNameConventions.EQUALS).any {
!it.isSubstitutionOrIntersectionOverride && it.fir.isEquals(session) &&
it.dispatchReceiverClassLookupTagOrNull() == this.toLookupTag()
!it.isSubstitutionOrIntersectionOverride && it.fir.isEquals(session) && ownerTag.isRealOwnerOf(it)
}
}
@@ -18,11 +18,11 @@ import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.annotationPlatformSupport
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.isRealOwnerOf
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.name.ClassId
@@ -453,9 +453,10 @@ object FirSerializationPluginClassChecker : FirClassChecker() {
properties: List<FirSerializableProperty>,
reporter: DiagnosticReporter
) {
val classLookupTag = classSymbol.toLookupTag()
for (property in properties) {
// Don't report anything on properties from supertypes
if (property.propertySymbol.dispatchReceiverClassLookupTagOrNull() != classSymbol.toLookupTag()) continue
if (!classLookupTag.isRealOwnerOf(property.propertySymbol)) continue
val customSerializerType = property.serializableWith
val serializerSymbol = customSerializerType?.toRegularClassSymbol(session)
val propertySymbol = property.propertySymbol