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 732d2eb6ee3..d65525b8449 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 @@ -53,6 +53,9 @@ internal class KtFe10FunctionalType( override val isSuspend: Boolean get() = withValidityAssertion { descriptor.functionKind.isSuspendType } + override val isReflectType: Boolean + get() = withValidityAssertion { descriptor.functionKind.isReflectType } + override val arity: Int get() = withValidityAssertion { descriptor.arity } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirFunctionalType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirFunctionalType.kt index e3b0c96a43b..090a219b9cc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirFunctionalType.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/KtFirFunctionalType.kt @@ -50,6 +50,9 @@ internal class KtFirFunctionalType( override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() } override val isSuspend: Boolean get() = withValidityAssertion { coneType.isSuspendOrKSuspendFunctionType(builder.rootSession) } + + override val isReflectType: Boolean get() = withValidityAssertion { coneType.isKFunctionType(builder.rootSession) } + override val arity: Int get() = withValidityAssertion { if (coneType.isExtensionFunctionType) coneType.typeArguments.size - 2 diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt index a4f0b5e78f2..a0e7f6c7f13 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt @@ -18,7 +18,7 @@ public object KtTypeRendererForSource { definitelyNotNullTypeRenderer = KtDefinitelyNotNullTypeRenderer.AS_TYPE_INTERSECTION dynamicTypeRenderer = KtDynamicTypeRenderer.AS_DYNAMIC_WORD flexibleTypeRenderer = KtFlexibleTypeRenderer.AS_SHORT - functionalTypeRenderer = KtFunctionalTypeRenderer.AS_FUNCTIONAL_TYPE + functionalTypeRenderer = KtFunctionalTypeRenderer.AS_CLASS_TYPE_FOR_REFLECTION_TYPES integerLiteralTypeRenderer = KtIntegerLiteralTypeRenderer.AS_ILT_WITH_VALUE intersectionTypeRenderer = KtIntersectionTypeRenderer.AS_INTERSECTION typeErrorTypeRenderer = KtTypeErrorTypeRenderer.AS_CODE_IF_POSSIBLE diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt index 4be5dc9d43b..c7ffe140993 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt @@ -63,4 +63,12 @@ public interface KtFunctionalTypeRenderer { } } + public object AS_CLASS_TYPE_FOR_REFLECTION_TYPES : KtFunctionalTypeRenderer { + context(KtAnalysisSession, KtTypeRenderer) + override fun renderType(type: KtFunctionalType, printer: PrettyPrinter): Unit { + val renderer = if (type.isReflectType) AS_CLASS_TYPE else AS_FUNCTIONAL_TYPE + renderer.renderType(type, printer) + } + } + } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt index cef47793d71..685ca8edda7 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/types/KtType.kt @@ -55,6 +55,7 @@ public sealed class KtNonErrorClassType : KtClassType() { public abstract class KtFunctionalType : KtNonErrorClassType(), KtContextReceiversOwner { public abstract val isSuspend: Boolean + public abstract val isReflectType: Boolean public abstract val arity: Int public abstract val hasContextReceivers: Boolean public abstract val receiverType: KtType? diff --git a/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kFunction.txt b/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kFunction.txt index cd2a48ec033..574e3cb1360 100644 --- a/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kFunction.txt +++ b/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kFunction.txt @@ -1,3 +1,3 @@ expression: xy -expected type: (kotlin.Int) -> kotlin.String +expected type: kotlin.reflect.KFunction1 functionClassKind: KFunction diff --git a/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kSuspendFunction.txt b/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kSuspendFunction.txt index 2431cb2d249..eb4f15ae243 100644 --- a/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kSuspendFunction.txt +++ b/analysis/analysis-api/testData/components/typeInfoProvider/functionClassKind/kSuspendFunction.txt @@ -1,3 +1,3 @@ expression: xy -expected type: suspend () -> kotlin.Unit +expected type: kotlin.reflect.KSuspendFunction0 functionClassKind: KSuspendFunction