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