[AA] Render reflection functional types as class types.

Render KFunctionN and KSuspendFunctionN by their class names, rather
than using arrow syntax. These types have additional functionality
beyond purely being able to invoke them (e.g. getting the name of the
referred function), so using arrow syntax throws away that functionality
and may cause breakages in the resulting code.
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 732d2eb..d65525b 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 @@
     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 e3b0c96..090a219 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 @@
     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 a4f0b5e..a0e7f6c 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 @@
         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 4be5dc9..c7ffe14 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 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 cef4779..685ca8e 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 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 cd2a48e..574e3cb 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<kotlin.Int, kotlin.String>
 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 2431cb2..eb4f15a 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<kotlin.Unit>
 functionClassKind: KSuspendFunction