From 2cdaa48e75475aa14953bcde264fc00493ba1207 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 2 Nov 2021 20:19:20 +0900 Subject: [PATCH] [FIR IDE] Support type annotation rendering in AAPI/FE10 This fixes the following tests: - KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterName() - KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameInNonFunctionType() - KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameGeneric() - KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameMixed() - KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameAnnotation() --- .../descriptors/utils/KtFe10TypeRenderer.kt | 51 +++++++++++++++++++ .../typeAnnotations.descriptors.txt | 8 +-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10TypeRenderer.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10TypeRenderer.kt index ba14f0d2ec9..16107b7ec5d 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10TypeRenderer.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/utils/KtFe10TypeRenderer.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.analysis.api.descriptors.utils import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue +import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType @@ -14,11 +17,15 @@ import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.descriptors.PossiblyInnerType import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.SpecialNames +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.calls.inference.CapturedType +import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.NewCapturedType import org.jetbrains.kotlin.types.checker.NewTypeVariableConstructor @@ -34,6 +41,9 @@ internal class KtFe10TypeRenderer(private val options: KtTypeRendererOptions, pr } private fun KtFe10RendererConsumer.renderType(type: KotlinType) { + if (isDebugText) { + renderTypeAnnotationsDebug(type) + } when (val unwrappedType = type.unwrap()) { is FlexibleType -> renderFlexibleType(unwrappedType) is DefinitelyNotNullType -> renderDefinitelyNotNullType(unwrappedType) @@ -66,6 +76,47 @@ internal class KtFe10TypeRenderer(private val options: KtTypeRendererOptions, pr } } + private fun KtFe10RendererConsumer.renderTypeAnnotationsDebug(type: KotlinType) { + val annotations = type.annotations + .filter { it.annotationClass?.classId != StandardClassIds.Annotations.ExtensionFunctionType } + + renderList(annotations, separator = " ", postfix = " ", renderWhenEmpty = false) { renderTypeAnnotationDebug(it) } + } + + private fun KtFe10RendererConsumer.renderTypeAnnotationDebug(annotation: AnnotationDescriptor) { + val namedValues = annotation.allValueArguments.map { KtNamedConstantValue(it.key.asString(), it.value.toKtConstantValue()) } + renderAnnotationDebug(annotation.annotationClass?.classId, namedValues) + } + + private fun KtFe10RendererConsumer.renderAnnotationDebug(classId: ClassId?, namedValues: List) { + append("@") + + if (classId != null) { + append("R|") + renderFqName(classId.asSingleFqName()) + append("|") + } else { + print("") + } + + renderList(namedValues, separator = ", ", prefix = "(", postfix = ")") { (name, value) -> + append(name).append(" = ") + renderConstantValueDebug(value) + } + } + + private fun KtFe10RendererConsumer.renderConstantValueDebug(value: KtConstantValue) { + when (value) { + is KtAnnotationConstantValue -> renderAnnotationDebug(value.classId, value.arguments) + is KtArrayConstantValue -> + renderList(value.values, separator = ", ", prefix = "[", postfix = "]") { renderConstantValueDebug(it) } + is KtEnumEntryConstantValue -> append(value.callableId) + is KtLiteralConstantValue<*> -> append(value.constantValueKind.asString).append("(").append(value.value).append(")") + KtUnsupportedConstantValue -> append(KtUnsupportedConstantValue::class.java.simpleName) + is KtErrorValue -> append("") + } + } + private fun KtFe10RendererConsumer.renderFlexibleType(type: FlexibleType) { if (isDebugText) { append("ft<") diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index 7baeeef335e..d69c9178723 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -132,7 +132,7 @@ KtValueParameterSymbol: annotatedType: [ Anno2() psi: KtAnnotationEntry - ] I + ] @R|Anno2|() I annotationClassIds: [] annotations: [] callableIdIfNonLocal: null @@ -149,7 +149,7 @@ KtFunctionSymbol: annotatedType: [ Anno3() psi: KtAnnotationEntry - ] I + ] @R|Anno3|() I annotationClassIds: [] annotations: [] callableIdIfNonLocal: /X.f @@ -179,7 +179,7 @@ KtKotlinPropertySymbol: annotatedType: [ Anno4() psi: KtAnnotationEntry - ] I + ] @R|Anno4|() I annotationClassIds: [] annotations: [] callableIdIfNonLocal: /X.x @@ -229,7 +229,7 @@ KtNamedClassOrObjectSymbol: [ Anno1() psi: KtAnnotationEntry - ] I + ] @R|Anno1|() I ] symbolKind: TOP_LEVEL typeParameters: []