From 7872b2191421bc413b749d722871b37cfdc23a8d Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 21 Jul 2020 15:36:23 -0700 Subject: [PATCH] FIR: handle object invoke via type alias --- .../calls/tower/FirTowerResolverSession.kt | 24 ++++++++++++------- .../box/typealias/typeAliasObjectCallable.kt | 1 - .../typeAliasObjectWithInvoke.fir.kt | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt index 592578c6b17..dae78e01fe9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirTowerResolverSession.kt @@ -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().fullyExpandedType(session) + val expansionRegularClass = type.lookupTag.toSymbol(session)?.fir as? FirRegularClass + buildResolvedQualifierForClass(expansionRegularClass!!.symbol, sourceElement = symbol.fir.source) + } else -> throw AssertionError() } } diff --git a/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt b/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt index 0f3d325b5b5..5a321ecd586 100644 --- a/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt +++ b/compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR object O { val x = "OK" diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasObjectWithInvoke.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasObjectWithInvoke.fir.kt index 958b5f28c16..7f0db227d54 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasObjectWithInvoke.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasObjectWithInvoke.fir.kt @@ -15,10 +15,10 @@ typealias WI = ObjectWithInvoke typealias CWI = ClassWithCompanionObjectWithInvoke -val test1 = WI() +val test1 = WI() val test2 = WI(null) val test3 = CWI() -val test4 = CWI("") +val test4 = CWI("") val test5 = CWI(null) val test5a = ClassWithCompanionObjectWithInvoke(null)