From f8ed993307b36f4923eacfd8fc2eee61e29295d0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 28 Oct 2022 09:56:57 +0200 Subject: [PATCH] [Analysis API FE1.0] fix functional types for KFunction previously, they were throwing an exception --- .../descriptors/types/KtFe10FunctionalType.kt | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt index 1e0c495014f..7fc8e92c1ec 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/KtFe10FunctionalType.kt @@ -15,12 +15,12 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType @@ -56,16 +56,32 @@ internal class KtFe10FunctionalType( get() = withValidityAssertion { descriptor.arity } override val hasReceiver: Boolean - get() = withValidityAssertion { type.getReceiverTypeFromFunctionType() != null } + get() = withValidityAssertion { + if (descriptor.functionKind.isReflectType) false + else type.getReceiverTypeFromFunctionType() != null + } override val receiverType: KtType? - get() = withValidityAssertion { type.getReceiverTypeFromFunctionType()?.toKtType(analysisContext) } + get() = withValidityAssertion { + if (descriptor.functionKind.isReflectType) null + else type.getReceiverTypeFromFunctionType()?.toKtType(analysisContext) + } override val parameterTypes: List - get() = withValidityAssertion { type.getValueParameterTypesFromFunctionType().map { it.type.toKtType(analysisContext) } } + get() = withValidityAssertion { + when { + descriptor.functionKind.isReflectType -> type.arguments.dropLast(1) + else -> type.getValueParameterTypesFromFunctionType() + }.map { it.type.toKtType(analysisContext) } + } override val returnType: KtType - get() = withValidityAssertion { type.getReturnTypeFromFunctionType().toKtType(analysisContext) } + get() = withValidityAssertion { + when { + descriptor.functionKind.isReflectType -> type.arguments.last().type + else -> type.getReturnTypeFromFunctionType() + }.toKtType(analysisContext) + } override val classId: ClassId get() = withValidityAssertion {