Make ConeContractRenderer a renderer component

This commit is contained in:
Mikhail Glukhikh
2022-07-08 14:09:18 +02:00
committed by Space
parent 31a46866b6
commit e484a4a946
3 changed files with 42 additions and 25 deletions
@@ -5,61 +5,66 @@
package org.jetbrains.kotlin.fir.contracts.description
import org.jetbrains.kotlin.fir.renderer.FirRendererComponents
import org.jetbrains.kotlin.fir.types.renderForDebugging
class ConeContractRenderer(private val builder: StringBuilder) : ConeContractDescriptionVisitor<Unit, Nothing?>() {
class ConeContractRenderer : ConeContractDescriptionVisitor<Unit, Nothing?>() {
internal lateinit var components: FirRendererComponents
private val printer get() = components.printer
override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) {
conditionalEffect.effect.accept(this, data)
builder.append(" -> ")
printer.print(" -> ")
conditionalEffect.condition.accept(this, data)
}
override fun visitReturnsEffectDeclaration(returnsEffect: ConeReturnsEffectDeclaration, data: Nothing?) {
builder.append("Returns(")
printer.print("Returns(")
returnsEffect.value.accept(this, data)
builder.append(")")
printer.print(")")
}
override fun visitCallsEffectDeclaration(callsEffect: ConeCallsEffectDeclaration, data: Nothing?) {
builder.append("CallsInPlace(")
printer.print("CallsInPlace(")
callsEffect.valueParameterReference.accept(this, data)
builder.append(", ${callsEffect.kind})")
printer.print(", ${callsEffect.kind})")
}
override fun visitLogicalBinaryOperationContractExpression(binaryLogicExpression: ConeBinaryLogicExpression, data: Nothing?) {
inBracketsIfNecessary(binaryLogicExpression, binaryLogicExpression.left) { binaryLogicExpression.left.accept(this, data) }
builder.append(" ${binaryLogicExpression.kind.token} ")
printer.print(" ${binaryLogicExpression.kind.token} ")
inBracketsIfNecessary(binaryLogicExpression, binaryLogicExpression.right) { binaryLogicExpression.right.accept(this, data) }
}
override fun visitLogicalNot(logicalNot: ConeLogicalNot, data: Nothing?) {
inBracketsIfNecessary(logicalNot, logicalNot.arg) { builder.append("!") }
inBracketsIfNecessary(logicalNot, logicalNot.arg) { printer.print("!") }
logicalNot.arg.accept(this, data)
}
override fun visitIsInstancePredicate(isInstancePredicate: ConeIsInstancePredicate, data: Nothing?) {
isInstancePredicate.arg.accept(this, data)
builder.append(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type.renderForDebugging()}")
printer.print(" ${if (isInstancePredicate.isNegated) "!" else ""}is ${isInstancePredicate.type.renderForDebugging()}")
}
override fun visitIsNullPredicate(isNullPredicate: ConeIsNullPredicate, data: Nothing?) {
isNullPredicate.arg.accept(this, data)
builder.append(" ${if (isNullPredicate.isNegated) "!=" else "=="} null")
printer.print(" ${if (isNullPredicate.isNegated) "!=" else "=="} null")
}
override fun visitConstantDescriptor(constantReference: ConeConstantReference, data: Nothing?) {
builder.append(constantReference.name)
printer.print(constantReference.name)
}
override fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: Nothing?) {
builder.append(valueParameterReference.name)
printer.print(valueParameterReference.name)
}
private fun inBracketsIfNecessary(parent: ConeContractDescriptionElement, child: ConeContractDescriptionElement, block: () -> Unit) {
if (needsBrackets(parent, child)) {
builder.append("(")
printer.print("(")
block()
builder.append(")")
printer.print(")")
} else {
block()
}
@@ -36,6 +36,7 @@ class FirRenderer private constructor(
private val bodyRenderer: FirBodyRenderer?,
private val callArgumentsRenderer: FirCallArgumentsRenderer,
private val classMemberRenderer: FirClassMemberRenderer,
private val contractRenderer: ConeContractRenderer?,
private val declarationRenderer: FirDeclarationRenderer,
private val modifierRenderer: FirModifierRenderer,
private val packageDirectiveRenderer: FirPackageDirectiveRenderer?,
@@ -64,6 +65,7 @@ class FirRenderer private constructor(
bodyRenderer?.components = components
callArgumentsRenderer.components = components
classMemberRenderer.components = components
contractRenderer?.components = components
declarationRenderer.components = components
modifierRenderer.components = components
packageDirectiveRenderer?.components = components
@@ -84,6 +86,7 @@ class FirRenderer private constructor(
FirBodyRenderer(),
FirCallArgumentsRenderer(),
FirClassMemberRenderer(),
ConeContractRenderer(),
FirDeclarationRenderer(),
FirAllModifierRenderer(),
packageDirectiveRenderer = null,
@@ -99,6 +102,7 @@ class FirRenderer private constructor(
bodyRenderer: FirBodyRenderer? = this.bodyRenderer,
callArgumentsRenderer: FirCallArgumentsRenderer = this.callArgumentsRenderer,
classMemberRenderer: FirClassMemberRenderer = this.classMemberRenderer,
contractRenderer: ConeContractRenderer? = this.contractRenderer,
declarationRenderer: FirDeclarationRenderer = this.declarationRenderer,
modifierRenderer: FirModifierRenderer = this.modifierRenderer,
packageDirectiveRenderer: FirPackageDirectiveRenderer? = this.packageDirectiveRenderer,
@@ -108,7 +112,7 @@ class FirRenderer private constructor(
): FirRenderer = FirRenderer(
builder, mode, FirComponentsImpl(),
annotationRenderer, bodyRenderer, callArgumentsRenderer, classMemberRenderer,
declarationRenderer, modifierRenderer, packageDirectiveRenderer,
contractRenderer, declarationRenderer, modifierRenderer, packageDirectiveRenderer,
propertyAccessorRenderer, typeRenderer, valueParameterRenderer
)
@@ -137,6 +141,8 @@ class FirRenderer private constructor(
override var bodyRenderer: FirBodyRenderer? = null
override var contractRenderer: ConeContractRenderer? = null
override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null
override var propertyAccessorRenderer: FirPropertyAccessorRenderer? = null
@@ -1172,22 +1178,25 @@ class FirRenderer private constructor(
override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) {
newLine()
print("[Effect declaration]")
renderInBraces("<", ">") {
println(buildString { effectDeclaration.effect.accept(ConeContractRenderer(this), null) })
}
println("[Effect declaration] <")
contractRenderer?.let { effectDeclaration.effect.accept(it, null) }
println()
println(">")
}
override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) {
newLine()
println("[R|Contract description]")
renderInBraces("<", ">") {
resolvedContractDescription.effects
.map { it.effect }
.forEach {
println(buildString { it.accept(ConeContractRenderer(this), null) })
}
println(" <")
pushIndent()
resolvedContractDescription.effects.forEach { declaration ->
contractRenderer?.let {
declaration.effect.accept(it, null)
println()
}
}
popIndent()
println(">")
}
override fun visitContractDescription(contractDescription: FirContractDescription) {
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.fir.renderer
import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer
internal interface FirRendererComponents {
val visitor: FirRenderer.Visitor
val printer: FirPrinter
@@ -13,6 +15,7 @@ internal interface FirRendererComponents {
val bodyRenderer: FirBodyRenderer?
val callArgumentsRenderer: FirCallArgumentsRenderer
val classMemberRenderer: FirClassMemberRenderer
val contractRenderer: ConeContractRenderer?
val modifierRenderer: FirModifierRenderer
val packageDirectiveRenderer: FirPackageDirectiveRenderer?
val propertyAccessorRenderer: FirPropertyAccessorRenderer?