From 7ce0284e81a0db9998214cd0304c152c9215f60e Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Fri, 6 Oct 2023 20:37:44 +0200 Subject: [PATCH] [FIR] Introduce `isRealOwnerOf` utility function --- .../kotlin/fir/backend/ConversionUtils.kt | 20 +++++++++---------- .../generators/FakeOverrideGenerator.kt | 5 +++-- .../kotlin/fir/scopes/jvm/JvmMappedScope.kt | 3 ++- .../kotlin/fir/resolve/ResolveUtils.kt | 6 +++++- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 4 ++-- .../FirSerializationPluginClassChecker.kt | 5 +++-- 6 files changed, 25 insertions(+), 18 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index df5b2b54b71..e346781dffa 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -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( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 8991b6b4d37..884fb270d07 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -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 diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index 6d03e5654b1..2fb46062f97 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -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 { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index b7c7875c29e..7f8c72438ed 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -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) \ No newline at end of file + get() = ConeTypeParameterTypeImpl(toLookupTag(), isNullable = false) + +fun ConeClassLikeLookupTag.isRealOwnerOf(declarationSymbol: FirCallableSymbol<*>): Boolean = + this == declarationSymbol.dispatchReceiverClassLookupTagOrNull() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 835aa436e45..af389137a93 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -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) } } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt index 9df2c40129d..97e97f54c0e 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt @@ -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, 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