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