[FIR] Expand typealiases when resolving to companions
^KT-59901 Fixed
This commit is contained in:
committed by
Space Team
parent
4a9ba1c9ac
commit
c392b0c477
+10
-2
@@ -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 {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user