diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecatedQualifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecatedQualifierChecker.kt index cf66a6442e2..52f570b5ebd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecatedQualifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecatedQualifierChecker.kt @@ -7,9 +7,10 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDeprecated -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals object FirDeprecatedQualifierChecker : FirResolvedQualifierChecker() { override fun check(expression: FirResolvedQualifier, context: CheckerContext, reporter: DiagnosticReporter) { @@ -20,7 +21,14 @@ object FirDeprecatedQualifierChecker : FirResolvedQualifierChecker() { ) } if (expression.resolvedToCompanionObject) { - val companionSymbol = (expression.symbol as? FirRegularClassSymbol)?.companionObjectSymbol ?: return + // Accessing the companion is like following a chain: + // TA1 -> TA2 -> ... -> MyClass ~> Companion. + // The first part - `TA1 -> TA2 -> ... -> MyClass` - + // is handled automatically when getting deprecationInfo + // for the typealias symbol (in FirDeprecationChecker). + // Below we check "the last transition". + @OptIn(SymbolInternals::class) + val companionSymbol = expression.symbol?.fullyExpandedClass(context.session)?.fir?.companionObjectSymbol ?: return FirDeprecationChecker.reportApiStatusIfNeeded(expression.source, companionSymbol, context, reporter) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt index 09d410ccaba..1cd9affb7da 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CandidateFactory.kt @@ -74,8 +74,8 @@ class CandidateFactory private constructor( scope, isFromCompanionObjectTypeScope = when (explicitReceiverKind) { ExplicitReceiverKind.EXTENSION_RECEIVER -> - givenExtensionReceiverOptions.singleOrNull().isCandidateFromCompanionObjectTypeScope() - ExplicitReceiverKind.DISPATCH_RECEIVER -> dispatchReceiver.isCandidateFromCompanionObjectTypeScope() + givenExtensionReceiverOptions.singleOrNull().isCandidateFromCompanionObjectTypeScope(callInfo.session) + ExplicitReceiverKind.DISPATCH_RECEIVER -> dispatchReceiver.isCandidateFromCompanionObjectTypeScope(callInfo.session) // The following cases are not applicable for companion objects. ExplicitReceiverKind.NO_EXPLICIT_RECEIVER, ExplicitReceiverKind.BOTH_RECEIVERS -> false }, @@ -133,10 +133,11 @@ class CandidateFactory private constructor( } } - private fun FirExpression?.isCandidateFromCompanionObjectTypeScope(): Boolean { + private fun FirExpression?.isCandidateFromCompanionObjectTypeScope(useSiteSession: FirSession): Boolean { val resolvedQualifier = this as? FirResolvedQualifier ?: return false val originClassOfCandidate = this.typeRef.coneType.classId ?: return false - return (resolvedQualifier.symbol?.fir as? FirRegularClass)?.companionObjectSymbol?.classId == originClassOfCandidate + val companion = resolvedQualifier.symbol?.fullyExpandedClass(useSiteSession)?.fir?.companionObjectSymbol + return companion?.classId == originClassOfCandidate } fun createErrorCandidate(callInfo: CallInfo, diagnostic: ConeDiagnostic): Candidate { diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsCompanionObjects.fir.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsCompanionObjects.fir.kt index c17ec72b069..8b271459c1b 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsCompanionObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsCompanionObjects.fir.kt @@ -11,5 +11,5 @@ typealias CA = C val test1 = CA val test2 = CA.Companion -val test3 = CA.x +val test3 = CA.x val test4 = CA.Companion.x