FIR: handle object invoke via type alias

This commit is contained in:
Jinseong Jeon
2020-07-21 15:36:23 -07:00
committed by Mikhail Glukhikh
parent 4a803e9d2f
commit 7872b21914
3 changed files with 17 additions and 12 deletions
@@ -7,17 +7,15 @@ package org.jetbrains.kotlin.fir.resolve.calls.tower
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.asReversedFrozen 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.declarations.isInner
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder import org.jetbrains.kotlin.fir.expressions.builder.FirQualifiedAccessExpressionBuilder
import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.buildResolvedQualifierForClass
import org.jetbrains.kotlin.fir.resolve.calls.* 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.resolve.transformers.body.resolve.firUnsafe
import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirCompositeScope
import org.jetbrains.kotlin.fir.scopes.FirScope 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.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol 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.*
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind 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 val invokeBuiltinExtensionMode = invokeResolveMode == InvokeResolveMode.RECEIVER_FOR_INVOKE_BUILTIN_EXTENSION
for (invokeReceiverCandidate in candidateFactoriesAndCollectors.invokeReceiverCollector!!.bestCandidates()) { for (invokeReceiverCandidate in candidateFactoriesAndCollectors.invokeReceiverCollector!!.bestCandidates()) {
val symbol = invokeReceiverCandidate.symbol val returnTypeRef = when (val symbol = invokeReceiverCandidate.symbol) {
if (symbol !is FirCallableSymbol<*> && symbol !is FirRegularClassSymbol) continue is FirTypeAliasSymbol -> symbol.fir.expandedTypeRef
is FirCallableSymbol<*> -> symbol.fir.returnTypeRef
val isExtensionFunctionType = is FirRegularClassSymbol -> null
(symbol as? FirCallableSymbol<*>)?.fir?.returnTypeRef?.isExtensionFunctionType(components.session) == true else -> continue
}
val isExtensionFunctionType = returnTypeRef?.isExtensionFunctionType(components.session) == true
if (invokeBuiltinExtensionMode && !isExtensionFunctionType) { if (invokeBuiltinExtensionMode && !isExtensionFunctionType) {
continue continue
@@ -653,6 +654,11 @@ private fun BodyResolveComponents.createExplicitReceiverForInvoke(
candidate, info, invokeBuiltinExtensionMode, extensionReceiverExpression, symbol candidate, info, invokeBuiltinExtensionMode, extensionReceiverExpression, symbol
) )
is FirRegularClassSymbol -> buildResolvedQualifierForClass(symbol, sourceElement = null) 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() else -> throw AssertionError()
} }
} }
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
object O { object O {
val x = "OK" val x = "OK"
@@ -15,10 +15,10 @@ typealias WI = ObjectWithInvoke
typealias CWI = ClassWithCompanionObjectWithInvoke typealias CWI = ClassWithCompanionObjectWithInvoke
val test1 = <!INAPPLICABLE_CANDIDATE!>WI<!>() val test1 = WI()
val test2 = <!INAPPLICABLE_CANDIDATE!>WI<!>(null) val test2 = <!INAPPLICABLE_CANDIDATE!>WI<!>(null)
val test3 = CWI() val test3 = CWI()
val test4 = <!INAPPLICABLE_CANDIDATE!>CWI<!>("") val test4 = CWI("")
val test5 = <!INAPPLICABLE_CANDIDATE!>CWI<!>(null) val test5 = <!INAPPLICABLE_CANDIDATE!>CWI<!>(null)
val test5a = <!INAPPLICABLE_CANDIDATE!>ClassWithCompanionObjectWithInvoke<!>(null) val test5a = <!INAPPLICABLE_CANDIDATE!>ClassWithCompanionObjectWithInvoke<!>(null)