From 07938205bc0ee01031ae14ba23ecba310102cc0d Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Fri, 12 Jan 2024 16:18:13 +0100 Subject: [PATCH] [FIR][K/N] Get rid of SymbolInternals in FirObjCInterop --- .../FirJvmFieldApplicabilityChecker.kt | 4 ++-- ...otectedInSuperClassCompanionCallChecker.kt | 4 ++-- .../FirNativeObjCOverrideInitChecker.kt | 3 +-- .../fir/analysis/checkers/FirHelpers.kt | 18 +--------------- .../backend/native/FirNativeKotlinMangler.kt | 2 +- .../backend/native/interop/FirObjCInterop.kt | 21 +++++++------------ .../kotlin/fir/resolve/DeclarationUtils.kt | 14 +++++++++++++ .../org/jetbrains/kotlin/fir/ClassMembers.kt | 3 +++ .../fir/SerializationFirResolveExtension.kt | 4 ++-- .../SerializationFirSupertypesExtension.kt | 4 ++-- 10 files changed, 35 insertions(+), 42 deletions(-) diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt index ee27bdac435..749765a4f23 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmFieldApplicabilityChecker.kt @@ -18,13 +18,13 @@ import org.jetbrains.kotlin.fir.analysis.checkers.classKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirPropertyChecker import org.jetbrains.kotlin.fir.analysis.checkers.declaration.needsMultiFieldValueClassFlattening -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingDeclarationSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol @@ -105,7 +105,7 @@ object FirJvmFieldApplicabilityChecker : FirPropertyChecker() { return false } - val outerClassKind = getContainingDeclarationSymbol(session)?.classKind + val outerClassKind = getContainingDeclaration(session)?.classKind return outerClassKind == ClassKind.INTERFACE || outerClassKind == ClassKind.ANNOTATION_CLASS } diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmProtectedInSuperClassCompanionCallChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmProtectedInSuperClassCompanionCallChecker.kt index 512106d4eaa..3fbcba0b281 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmProtectedInSuperClassCompanionCallChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJvmProtectedInSuperClassCompanionCallChecker.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirBasicExpressionChecker -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingDeclarationSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId @@ -20,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.resolve.defaultType +import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.resolvedType @@ -52,7 +52,7 @@ object FirJvmProtectedInSuperClassCompanionCallChecker : FirBasicExpressionCheck if (resolvedSymbol.getAnnotationByClassId(JVM_STATIC_ANNOTATION_CLASS_ID, context.session) != null) return if (!dispatchClassSymbol.isCompanion) return val companionContainingClassSymbol = - dispatchClassSymbol.getContainingDeclarationSymbol(context.session) as? FirRegularClassSymbol ?: return + dispatchClassSymbol.getContainingDeclaration(context.session) as? FirRegularClassSymbol ?: return // Called from within a derived class val companionContainingType = companionContainingClassSymbol.defaultType() diff --git a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCOverrideInitChecker.kt b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCOverrideInitChecker.kt index e879762181b..79bd66ce2ee 100644 --- a/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCOverrideInitChecker.kt +++ b/compiler/fir/checkers/checkers.native/src/org/jetbrains/kotlin/fir/analysis/native/checkers/FirNativeObjCOverrideInitChecker.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.fir.backend.native.interop.getObjCInitMethod import org.jetbrains.kotlin.fir.backend.native.interop.isKotlinObjCClass import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect -import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.getSuperClassSymbolOrAny import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol @@ -67,7 +66,7 @@ object FirNativeObjCOverrideInitChecker : FirClassChecker() { return } - val initMethod = superConstructor.getObjCInitMethod(session, ScopeSession())!! + val initMethod = superConstructor.getObjCInitMethod(session)!! // Remove fake overrides of this init method, also check for explicit overriding: firClass.declarations.forEach { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index f2c5661a6f4..2cbf7a59aa3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.providers.firProvider -import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.multipleDelegatesWithTheSameSignature @@ -173,22 +172,7 @@ fun FirDeclaration.getContainingClassSymbol(session: FirSession) = symbol.getCon fun FirClassLikeSymbol<*>.outerClassSymbol(context: CheckerContext): FirClassLikeSymbol<*>? { if (this !is FirClassSymbol<*>) return null - return getContainingDeclarationSymbol(context.session) -} - -@OptIn(SymbolInternals::class) -fun FirClassSymbol<*>.getContainingDeclarationSymbol(session: FirSession): FirClassLikeSymbol<*>? { - if (isLocal) { - return (this as FirRegularClassSymbol).fir.containingClassForLocalAttr?.toFirRegularClassSymbol(session) - } else { - val parentId = classId.relativeClassName.parent() - if (!parentId.isRoot) { - val containingDeclarationId = ClassId(classId.packageFqName, parentId, isLocal = false) - return session.symbolProvider.getClassLikeSymbolByClassId(containingDeclarationId) - } - } - - return null + return getContainingDeclaration(context.session) } /** diff --git a/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeKotlinMangler.kt b/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeKotlinMangler.kt index 5061a1c2cbf..e0a8beaa556 100644 --- a/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeKotlinMangler.kt +++ b/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/FirNativeKotlinMangler.kt @@ -53,7 +53,7 @@ private class FirObjCFunctionNameMangleComputer( override fun getObjCMethodInfo(): ObjCMethodInfo? { val scopeSession = ScopeSession() - return function.symbol.getInitMethodIfObjCConstructor(session, scopeSession) + return function.symbol.getInitMethodIfObjCConstructor(session) ?.getObjCMethodInfoFromOverriddenFunctions(session, scopeSession) } diff --git a/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/interop/FirObjCInterop.kt b/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/interop/FirObjCInterop.kt index 71671b05325..b1b6326e528 100644 --- a/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/interop/FirObjCInterop.kt +++ b/compiler/fir/native/src/org/jetbrains/kotlin/fir/backend/native/interop/FirObjCInterop.kt @@ -11,18 +11,12 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.resolve.* -import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.scopes.processAllFunctions -import org.jetbrains.kotlin.fir.scopes.scopeForClass import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag -import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NativeStandardInteropNames @@ -54,7 +48,7 @@ internal fun FirFunctionSymbol<*>.getObjCMethodInfoFromOverriddenFunctions(sessi /** * mimics ConstructorDescriptor.getObjCInitMethod() */ -fun FirConstructorSymbol.getObjCInitMethod(session: FirSession, scopeSession: ScopeSession): FirFunctionSymbol<*>? { +fun FirConstructorSymbol.getObjCInitMethod(session: FirSession): FirFunctionSymbol<*>? { this.annotations.getAnnotationByClassId(NativeStandardInteropNames.objCConstructorClassId, session)?.let { annotation -> val initSelector: String = annotation.constStringArgument("initSelector") val classSymbol = containingClassLookupTag()?.toSymbol(session) as FirClassSymbol<*> @@ -128,9 +122,9 @@ private fun FirClassSymbol<*>.selfOrAnySuperClass(session: FirSession, predicate lookupSuperTypes(listOf(this), lookupInterfaces = true, deep = true, session, substituteTypes = false) .any { predicate(it.lookupTag) } -internal fun FirFunctionSymbol<*>.getInitMethodIfObjCConstructor(session: FirSession, scopeSession: ScopeSession): FirFunctionSymbol<*>? = +internal fun FirFunctionSymbol<*>.getInitMethodIfObjCConstructor(session: FirSession): FirFunctionSymbol<*>? = if (this is FirConstructorSymbol && isObjCConstructor(session)) - getObjCInitMethod(session, scopeSession) + getObjCInitMethod(session) else this @@ -139,13 +133,12 @@ fun FirProperty.isExternalObjCClassProperty(session: FirSession): Boolean = internal fun FirClassSymbol<*>.isExternalObjCClass(session: FirSession): Boolean = isObjCClass(session) && - parentsWithSelf(session).filterIsInstance().any { + parentsWithSelf(session).filterIsInstance>().any { it.hasAnnotation(NativeStandardInteropNames.externalObjCClassClassId, session) } -@OptIn(SymbolInternals::class) -fun FirClassSymbol<*>.parentsWithSelf(session: FirSession): Sequence { - return generateSequence(fir) { it.getContainingDeclaration(session) } +fun FirClassSymbol<*>.parentsWithSelf(session: FirSession): Sequence> { + return generateSequence>(this) { it.getContainingDeclaration(session) } } fun FirClassSymbol<*>.isKotlinObjCClass(session: FirSession): Boolean = isObjCClass(session) && !isExternalObjCClass(session) diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt index c4170ba717e..5571512feee 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/DeclarationUtils.kt @@ -34,6 +34,20 @@ fun FirClassLikeDeclaration.getContainingDeclaration(session: FirSession): FirCl return null } +fun FirClassLikeSymbol.getContainingDeclaration(session: FirSession): FirClassLikeSymbol? { + if (isLocal) { + return (this as? FirRegularClassSymbol)?.containingClassForLocalAttr?.toFirRegularClassSymbol(session) + } else { + val parentId = classId.relativeClassName.parent() + if (!parentId.isRoot) { + val containingDeclarationId = ClassId(classId.packageFqName, parentId, isLocal = false) + return session.symbolProvider.getClassLikeSymbolByClassId(containingDeclarationId) + } + } + + return null +} + fun isValidTypeParameterFromOuterDeclaration( typeParameterSymbol: FirTypeParameterSymbol, declaration: FirDeclaration?, diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 88e602b382b..5dee002f783 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.ConeIntersectionType import org.jetbrains.kotlin.fir.types.ConeKotlinType @@ -56,6 +57,8 @@ private object ContainingClassKey : FirDeclarationDataKey() var FirCallableDeclaration.containingClassForStaticMemberAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey) var FirRegularClass.containingClassForLocalAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey) var FirDanglingModifierList.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey) +val FirRegularClassSymbol.containingClassForLocalAttr: ConeClassLikeLookupTag? + get() = fir.containingClassForLocalAttr private object HasNoEnumEntriesKey : FirDeclarationDataKey() var FirClass.hasNoEnumEntriesAttr: Boolean? by FirDeclarationDataRegistry.data(HasNoEnumEntriesKey) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt index bc809809f83..9974a68d8ab 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirResolveExtension.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingDeclarationSymbol import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.copy import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin @@ -20,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.extensions.* import org.jetbrains.kotlin.fir.plugin.* import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.FirTypeScope @@ -155,7 +155,7 @@ class SerializationFirResolveExtension(session: FirSession) : FirDeclarationGene val owner = context?.owner ?: return emptyList() if (callableId.callableName == SerialEntityNames.SERIALIZER_PROVIDER_NAME) { val serializableClass = if (owner.isCompanion) { - val containingSymbol = owner.getContainingDeclarationSymbol(session) as? FirClassSymbol<*> ?: return emptyList() + val containingSymbol = owner.getContainingDeclaration(session) as? FirClassSymbol<*> ?: return emptyList() if (with(session) { containingSymbol.shouldHaveGeneratedMethodsInCompanion }) containingSymbol else null } else { if (with(session) { owner.isSerializableObject }) owner else null diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirSupertypesExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirSupertypesExtension.kt index 7343c8fb3ba..8a8c76366e9 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirSupertypesExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/SerializationFirSupertypesExtension.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlinx.serialization.compiler.fir import org.jetbrains.kotlin.descriptors.isObject import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingDeclarationSymbol import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirRegularClass @@ -21,6 +20,7 @@ import org.jetbrains.kotlin.fir.extensions.buildUserTypeFromQualifierParts import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference +import org.jetbrains.kotlin.fir.resolve.getContainingDeclaration import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -51,7 +51,7 @@ class SerializationFirSupertypesExtension(session: FirSession) : FirSupertypeGen if (isJvmOrMetadata) return false if (declaration !is FirRegularClass) return false if (!declaration.isCompanion) return false - val parentSymbol = declaration.symbol.getContainingDeclarationSymbol(session) as FirClassSymbol<*> + val parentSymbol = declaration.symbol.getContainingDeclaration(session) as FirClassSymbol<*> return session.predicateBasedProvider.matches(annotatedWithSerializableOrMeta, parentSymbol) && parentSymbol.companionNeedsSerializerFactory }