[FIR] Add pretty rendering of functional types
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir
|
||||
|
||||
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
@@ -736,13 +738,27 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
|
||||
}
|
||||
|
||||
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
|
||||
resolvedTypeRef.annotations.renderAnnotations()
|
||||
val kind = resolvedTypeRef.functionTypeKind
|
||||
val annotations = if (kind.withPrettyRender()) {
|
||||
resolvedTypeRef.annotations.dropExtensionFunctionAnnotation()
|
||||
} else {
|
||||
resolvedTypeRef.annotations
|
||||
}
|
||||
annotations.renderAnnotations()
|
||||
print("R|")
|
||||
val coneType = resolvedTypeRef.type
|
||||
print(coneType.render())
|
||||
print(coneType.renderFunctionType(kind, resolvedTypeRef.isExtensionFunctionType()))
|
||||
print("|")
|
||||
}
|
||||
|
||||
private val FirResolvedTypeRef.functionTypeKind: FunctionClassDescriptor.Kind?
|
||||
get() {
|
||||
val classId = (type as? ConeClassLikeType)?.lookupTag?.classId ?: return null
|
||||
return BuiltInFictitiousFunctionClassFactory.getFunctionalClassKind(
|
||||
classId.shortClassName.asString(), classId.packageFqName
|
||||
)
|
||||
}
|
||||
|
||||
override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) {
|
||||
userTypeRef.annotations.renderAnnotations()
|
||||
for ((index, qualifier) in userTypeRef.qualifier.withIndex()) {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.types
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -32,4 +34,26 @@ val FirFunctionTypeRef.parametersCount: Int
|
||||
get() = if (receiverTypeRef != null)
|
||||
valueParameters.size + 1
|
||||
else
|
||||
valueParameters.size
|
||||
valueParameters.size
|
||||
|
||||
const val EXTENSION_FUNCTION_ANNOTATION = "kotlin/ExtensionFunctionType"
|
||||
|
||||
fun FirTypeRef.isExtensionFunctionType(): Boolean {
|
||||
return annotations.any {
|
||||
it.isExtensionFunctionAnnotationCall
|
||||
}
|
||||
}
|
||||
|
||||
val FirAnnotationCall.isExtensionFunctionAnnotationCall: Boolean
|
||||
get() = (this as? FirAnnotationCall)?.let {
|
||||
(it.annotationTypeRef as? FirResolvedTypeRef)?.let {
|
||||
(it.type as? ConeClassLikeType)?.let {
|
||||
it.lookupTag.classId.asString() == EXTENSION_FUNCTION_ANNOTATION
|
||||
}
|
||||
}
|
||||
} == true
|
||||
|
||||
|
||||
fun List<FirAnnotationCall>.dropExtensionFunctionAnnotation(): List<FirAnnotationCall> {
|
||||
return filterNot { it.isExtensionFunctionAnnotationCall }
|
||||
}
|
||||
Reference in New Issue
Block a user