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