[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
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<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) {
if (isDebugText) {
append("ft<")
@@ -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: []