[FIR IDE] Support type annotation rendering in AAPI/FE10

This fixes the following tests:
- KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterName()
- KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameInNonFunctionType()
- KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameGeneric()
- KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameMixed()
- KtFe10ResolveCallTestGenerated#testVariableAsFunctionWithParameterNameAnnotation()
This commit is contained in:
Yan Zhulanow
2021-11-02 20:19:20 +09:00
parent 07fb02c1f9
commit 2cdaa48e75
2 changed files with 55 additions and 4 deletions
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.analysis.api.descriptors.utils package org.jetbrains.kotlin.analysis.api.descriptors.utils
import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions 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.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.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType 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.ClassifierDescriptorWithTypeParameters
import org.jetbrains.kotlin.descriptors.PossiblyInnerType import org.jetbrains.kotlin.descriptors.PossiblyInnerType
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor 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.FqName
import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.renderer.render
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType 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.*
import org.jetbrains.kotlin.types.checker.NewCapturedType import org.jetbrains.kotlin.types.checker.NewCapturedType
import org.jetbrains.kotlin.types.checker.NewTypeVariableConstructor 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) { private fun KtFe10RendererConsumer.renderType(type: KotlinType) {
if (isDebugText) {
renderTypeAnnotationsDebug(type)
}
when (val unwrappedType = type.unwrap()) { when (val unwrappedType = type.unwrap()) {
is FlexibleType -> renderFlexibleType(unwrappedType) is FlexibleType -> renderFlexibleType(unwrappedType)
is DefinitelyNotNullType -> renderDefinitelyNotNullType(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<KtNamedConstantValue>) {
append("@")
if (classId != null) {
append("R|")
renderFqName(classId.asSingleFqName())
append("|")
} else {
print("<ERROR TYPE REF>")
}
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("<ERROR>")
}
}
private fun KtFe10RendererConsumer.renderFlexibleType(type: FlexibleType) { private fun KtFe10RendererConsumer.renderFlexibleType(type: FlexibleType) {
if (isDebugText) { if (isDebugText) {
append("ft<") append("ft<")
@@ -132,7 +132,7 @@ KtValueParameterSymbol:
annotatedType: [ annotatedType: [
Anno2() Anno2()
psi: KtAnnotationEntry psi: KtAnnotationEntry
] I ] @R|Anno2|() I
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
callableIdIfNonLocal: null callableIdIfNonLocal: null
@@ -149,7 +149,7 @@ KtFunctionSymbol:
annotatedType: [ annotatedType: [
Anno3() Anno3()
psi: KtAnnotationEntry psi: KtAnnotationEntry
] I ] @R|Anno3|() I
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
callableIdIfNonLocal: /X.f callableIdIfNonLocal: /X.f
@@ -179,7 +179,7 @@ KtKotlinPropertySymbol:
annotatedType: [ annotatedType: [
Anno4() Anno4()
psi: KtAnnotationEntry psi: KtAnnotationEntry
] I ] @R|Anno4|() I
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
callableIdIfNonLocal: /X.x callableIdIfNonLocal: /X.x
@@ -229,7 +229,7 @@ KtNamedClassOrObjectSymbol:
[ [
Anno1() Anno1()
psi: KtAnnotationEntry psi: KtAnnotationEntry
] I ] @R|Anno1|() I
] ]
symbolKind: TOP_LEVEL symbolKind: TOP_LEVEL
typeParameters: [] typeParameters: []