FIR: handle object invoke via type alias
This commit is contained in:
committed by
Mikhail Glukhikh
parent
4a803e9d2f
commit
7872b21914
+15
-9
@@ -7,17 +7,15 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.asReversedFrozen
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.isInner
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder
|
||||
import org.jetbrains.kotlin.fir.references.FirSuperReference
|
||||
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
|
||||
import org.jetbrains.kotlin.fir.resolve.buildResolvedQualifierForClass
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
import org.jetbrains.kotlin.fir.resolve.scope
|
||||
import org.jetbrains.kotlin.fir.resolve.transformQualifiedAccessUsingSmartcastInfo
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
@@ -26,6 +24,7 @@ import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
@@ -563,11 +562,13 @@ class FirTowerResolverSession internal constructor(
|
||||
val invokeBuiltinExtensionMode = invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION
|
||||
|
||||
for (invokeReceiverCandidate in candidateFactoriesAndCollectors.invokeReceiverCollector!!.bestCandidates()) {
|
||||
val symbol = invokeReceiverCandidate.symbol
|
||||
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue
|
||||
|
||||
val isExtensionFunctionType =
|
||||
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(components.session) == true
|
||||
val returnTypeRef = when (val symbol = invokeReceiverCandidate.symbol) {
|
||||
is FirTypeAliasSymbol -> symbol.fir.expandedTypeRef
|
||||
is FirCallableSymbol<*> -> symbol.fir.returnTypeRef
|
||||
is FirRegularClassSymbol -> null
|
||||
else -> continue
|
||||
}
|
||||
val isExtensionFunctionType = returnTypeRef?.isExtensionFunctionType(components.session) == true
|
||||
|
||||
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
|
||||
continue
|
||||
@@ -653,6 +654,11 @@ private fun BodyResolveComponents.createExplicitReceiverForInvoke(
|
||||
candidate, info, invokeBuiltinExtensionMode, extensionReceiverExpression, symbol
|
||||
)
|
||||
is FirRegularClassSymbol -> buildResolvedQualifierForClass(symbol, sourceElement = null)
|
||||
is FirTypeAliasSymbol -> {
|
||||
val type = symbol.fir.expandedTypeRef.coneTypeUnsafe<ConeClassLikeType>().fullyExpandedType(session)
|
||||
val expansionRegularClass = type.lookupTag.toSymbol(session)?.fir as? FirRegularClass
|
||||
buildResolvedQualifierForClass(expansionRegularClass!!.symbol, sourceElement = symbol.fir.source)
|
||||
}
|
||||
else -> throw AssertionError()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
object O {
|
||||
val x = "OK"
|
||||
|
||||
|
||||
+2
-2
@@ -15,10 +15,10 @@ typealias WI = ObjectWithInvoke
|
||||
|
||||
typealias CWI = ClassWithCompanionObjectWithInvoke
|
||||
|
||||
val test1 = <!INAPPLICABLE_CANDIDATE!>WI<!>()
|
||||
val test1 = WI()
|
||||
val test2 = <!INAPPLICABLE_CANDIDATE!>WI<!>(null)
|
||||
|
||||
val test3 = CWI()
|
||||
val test4 = <!INAPPLICABLE_CANDIDATE!>CWI<!>("")
|
||||
val test4 = CWI("")
|
||||
val test5 = <!INAPPLICABLE_CANDIDATE!>CWI<!>(null)
|
||||
val test5a = <!INAPPLICABLE_CANDIDATE!>ClassWithCompanionObjectWithInvoke<!>(null)
|
||||
|
||||
Reference in New Issue
Block a user