[FIR] Expand typealiases when resolving to companions

^KT-59901 Fixed
This commit is contained in:
Nikolay Lunyak
2023-08-01 12:46:28 +03:00
committed by Space Team
parent 4a9ba1c9ac
commit c392b0c477
3 changed files with 16 additions and 7 deletions
@@ -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)
}
}
@@ -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 {
@@ -11,5 +11,5 @@ typealias CA = C
val test1 = CA
val test2 = CA.<!UNRESOLVED_REFERENCE!>Companion<!>
val test3 = CA.x
val test3 = <!API_NOT_AVAILABLE!>CA<!>.x
val test4 = CA.<!UNRESOLVED_REFERENCE!>Companion<!>.x