Make ConeContractRenderer a renderer component
This commit is contained in:
+19
-14
@@ -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?
|
||||
|
||||
Reference in New Issue
Block a user