From 16f14a21e2889b956806427291bc2ebf0131d658 Mon Sep 17 00:00:00 2001 From: Justin Paupore Date: Wed, 11 Jan 2023 15:36:45 -0800 Subject: [PATCH] [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. --- .../api/descriptors/types/KtFe10FunctionalType.kt | 3 +++ .../kotlin/analysis/api/fir/types/KtFirFunctionalType.kt | 3 +++ .../api/renderer/types/impl/KtTypeRendererForSource.kt | 2 +- .../renderer/types/renderers/KtFunctionalTypeRenderer.kt | 8 ++++++++ .../src/org/jetbrains/kotlin/analysis/api/types/KtType.kt | 1 + .../typeInfoProvider/functionClassKind/kFunction.txt | 2 +- .../functionClassKind/kSuspendFunction.txt | 2 +- 7 files changed, 18 insertions(+), 3 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 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