FIR renderer: extract separate ConeTypeRenderer

This commit is contained in:
Mikhail Glukhikh
2022-07-05 11:56:50 +02:00
committed by Space
parent 591143be7c
commit a82baf87cb
46 changed files with 438 additions and 266 deletions
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.fir.contracts.description
import org.jetbrains.kotlin.fir.types.renderForDebugging
class ConeContractRenderer(private val builder: StringBuilder) : ConeContractDescriptionVisitor<Unit, Nothing?>() {
override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) {
conditionalEffect.effect.accept(this, data)
@@ -37,7 +39,7 @@ class ConeContractRenderer(private val builder: StringBuilder) : ConeContractDes
override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Nothing?) {
isInstancePredicate.arg.accept(this, data)
builder.append(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type}")
builder.append(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type.renderForDebugging()}")
}
override fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: Nothing?) {
@@ -23,7 +23,7 @@ open class FirAnnotationRenderer internal constructor(components: FirRendererCom
}
}
private fun renderAnnotation(annotation: FirAnnotation) {
internal fun renderAnnotation(annotation: FirAnnotation) {
printer.print("@")
annotation.useSiteTarget?.let {
printer.print(it.name)
@@ -20,7 +20,7 @@ class FirBodyRenderer internal constructor(components: FirRendererComponents) :
if (block == null) return
when (block) {
is FirLazyBlock -> {
println(" { LAZY_BLOCK }")
printer.println(" { LAZY_BLOCK }")
}
else -> {
annotationRenderer?.render(block)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.utils.Printer
abstract class FirPrinter internal constructor(builder: StringBuilder) {
open class FirPrinter(builder: StringBuilder) {
private val printer = Printer(builder)
private var lineBeginning = true
@@ -47,6 +47,8 @@ open class FirRenderer private constructor(
override var bodyRenderer: FirBodyRenderer? = null
override lateinit var typeRenderer: ConeTypeRenderer
override lateinit var visitor: Visitor
override lateinit var printer: FirPrinter
@@ -154,12 +156,18 @@ open class FirRenderer private constructor(
else ->
null
}
private val bodyRenderer = if (mode.renderBodies) FirBodyRenderer(components) else null
private val bodyRenderer =
if (mode.renderBodies) FirBodyRenderer(components) else null
@Suppress("LeakingThis")
private val typeRenderer =
if (mode.renderDetailedTypeReferences) ConeTypeRendererForDebugging(builder) else ConeTypeRenderer(builder)
init {
components.visitor = visitor
components.annotationRenderer = annotationRenderer
components.bodyRenderer = bodyRenderer
components.typeRenderer = typeRenderer
@Suppress("LeakingThis")
components.printer = this
}
@@ -188,7 +196,7 @@ open class FirRenderer private constructor(
if (index > 0) {
print(", ")
}
print(element.render())
print(element.renderForDebugging())
}
}
@@ -318,6 +326,10 @@ open class FirRenderer private constructor(
}
}
fun renderAnnotations(annotationContainer: FirAnnotationContainer) {
annotationRenderer?.render(annotationContainer)
}
protected open fun renderClassDeclarations(regularClass: FirRegularClass) {
if (mode.renderNestedDeclarations) {
regularClass.declarations.renderDeclarations()
@@ -346,6 +358,14 @@ open class FirRenderer private constructor(
popIndent()
}
override fun visitAnnotation(annotation: FirAnnotation) {
annotationRenderer?.renderAnnotation(annotation)
}
override fun visitAnnotationCall(annotationCall: FirAnnotationCall) {
annotationRenderer?.renderAnnotation(annotationCall)
}
override fun visitCallableDeclaration(callableDeclaration: FirCallableDeclaration) {
renderContexts(callableDeclaration.contextReceivers)
annotationRenderer?.render(callableDeclaration)
@@ -603,7 +623,7 @@ open class FirRenderer private constructor(
constructor.renderDeclarationData()
constructor.dispatchReceiverType?.let {
print(it.render())
typeRenderer.render(it)
print(".")
}
print("constructor")
@@ -1051,15 +1071,7 @@ open class FirRenderer private constructor(
}
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
val kind = resolvedTypeRef.functionTypeKind
if (mode.renderDetailedTypeReferences) {
print("R|")
}
val coneType = resolvedTypeRef.type
print(coneType.renderFunctionType(kind, renderFqNames = mode.renderDetailedTypeReferences))
if (mode.renderDetailedTypeReferences) {
print("|")
}
typeRenderer.renderAsPossibleFunctionType(resolvedTypeRef.type)
}
override fun visitUserTypeRef(userTypeRef: FirUserTypeRef) {
@@ -10,4 +10,5 @@ internal interface FirRendererComponents {
val printer: FirPrinter
val annotationRenderer: FirAnnotationRenderer?
val bodyRenderer: FirBodyRenderer?
val typeRenderer: ConeTypeRenderer
}
@@ -75,13 +75,13 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
when (a) {
is ConeErrorType -> {
require(b is ConeErrorType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
return a.hashCode() - b.hashCode()
}
is ConeLookupTagBasedType -> {
require(b is ConeLookupTagBasedType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val nameDiff = a.lookupTag.name.compareTo(b.lookupTag.name)
if (nameDiff != 0) {
@@ -95,7 +95,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
}
is ConeFlexibleType -> {
require(b is ConeFlexibleType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val lowerBoundDiff = compare(a.lowerBound, b.lowerBound)
if (lowerBoundDiff != 0) {
@@ -105,7 +105,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
}
is ConeCapturedType -> {
require(b is ConeCapturedType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val aHasLowerType = if (a.lowerType != null) 1 else 0
val bHasLowerType = if (b.lowerType != null) 1 else 0
@@ -127,13 +127,13 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
}
is ConeDefinitelyNotNullType -> {
require(b is ConeDefinitelyNotNullType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
return compare(a.original, b.original)
}
is ConeIntersectionType -> {
require(b is ConeIntersectionType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val sizeDiff = a.intersectedTypes.size - b.intersectedTypes.size
if (sizeDiff != 0) {
@@ -144,7 +144,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
}
is ConeStubType -> {
require(b is ConeStubType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val nameDiff = a.constructor.variable.typeConstructor.name.compareTo(b.constructor.variable.typeConstructor.name)
if (nameDiff != 0) {
@@ -154,7 +154,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
}
is ConeIntegerLiteralConstantType -> {
require(b is ConeIntegerLiteralConstantType) {
"priority is inconsistent: ${a.render()} v.s. ${b.render()}"
"priority is inconsistent: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}"
}
val valueDiff = a.value - b.value
if (valueDiff != 0L) {
@@ -171,7 +171,7 @@ object ConeKotlinTypeComparator : Comparator<ConeKotlinType> {
return compare(a.nullability, b.nullability)
}
else ->
error("Unsupported type comparison: ${a.render()} v.s. ${b.render()}")
error("Unsupported type comparison: ${a.renderForDebugging()} v.s. ${b.renderForDebugging()}")
}
}
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.types
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
@@ -15,6 +14,8 @@ import org.jetbrains.kotlin.fir.expressions.FirExpressionWithSmartcast
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.typeAttributeExtensions
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.renderer.ConeTypeRenderer
import org.jetbrains.kotlin.fir.renderer.ConeTypeRendererForDebugging
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.StandardClassIds
@@ -195,13 +196,3 @@ val ConeKotlinType.canBeNull: Boolean
}
}
val ConeKotlinType?.functionTypeKind: FunctionClassKind?
get() {
val classId = (this as? ConeClassLikeType)?.lookupTag?.classId ?: return null
return FunctionClassKind.getFunctionalClassKind(
classId.shortClassName.asString(), classId.packageFqName
)
}
val FirResolvedTypeRef.functionTypeKind: FunctionClassKind?
get() = type.functionTypeKind