diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractRenderer.kt index 11a8fc63692..a9c50b35ffb 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractRenderer.kt @@ -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() { +class ConeContractRenderer : ConeContractDescriptionVisitor() { + + 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() } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index d216235fb55..a284ff426c9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt @@ -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) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt index 5b9114b44b6..6015bd958a2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt @@ -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?