[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:
+51
@@ -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<")
|
||||
|
||||
+4
-4
@@ -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: []
|
||||
|
||||
Reference in New Issue
Block a user