From 14cfc62745e799260ff9577b3eb39b866c7f4819 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 21 Sep 2020 14:43:24 +0300 Subject: [PATCH] FIR: fix calculation of type arguments for bare types --- .../FirExpressionsResolveTransformer.kt | 26 ++++++++++++------- .../coroutines/suspendFunctionN.fir.kt | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 8db46574fd6..a5153637431 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -448,19 +448,27 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform private fun FirTypeRef.withTypeArgumentsForBareType(argument: FirExpression): FirTypeRef { // TODO: Everything should also work for case of checked-type itself is a type alias + val type = coneTypeSafe() + if (type !is ConeClassLikeType || type.typeArguments.isNotEmpty()) { + return this + } val baseTypeArguments = argument.typeRef.coneTypeSafe()?.fullyExpandedType(session)?.typeArguments - val type = coneTypeSafe() - return if ( - type?.typeArguments?.isEmpty() != true || - type is ConeTypeParameterType || - baseTypeArguments?.isEmpty() != false || - (type is ConeClassLikeType && - (type.lookupTag.toSymbol(session)?.fir as? FirTypeParameterRefsOwner)?.typeParameters?.isEmpty() == true) - ) { + + return if (baseTypeArguments?.isEmpty() != false) { this } else { - withReplacedConeType(type.withArguments(baseTypeArguments)) + val typeParameters = (type.lookupTag.toSymbol(session)?.fir as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty() + if (typeParameters.isEmpty()) { + this + } else { + withReplacedConeType( + type.withArguments( + if (baseTypeArguments.size > typeParameters.size) baseTypeArguments.take(typeParameters.size).toTypedArray() + else baseTypeArguments + ) + ) + } } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionN.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionN.fir.kt index e6cbea1e0f2..71e52932b83 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionN.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionN.fir.kt @@ -3,6 +3,6 @@ // SKIP_TXT fun test() { - suspend {} is SuspendFunction0<*> + suspend {} is SuspendFunction0<*> suspend {} is kotlin.coroutines.SuspendFunction0<*> }