[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