[FIR] Add pretty rendering of functional types

This commit is contained in:
Dmitriy Novozhilov
2019-11-07 18:19:01 +03:00
parent 18dc652404
commit e910653d6f
66 changed files with 201 additions and 143 deletions
@@ -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 }
}