diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt index 2ea30f4c12d..a750448afbd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/description/ConeContractDescriptionVisitor.kt @@ -48,6 +48,6 @@ abstract class ConeContractDescriptionVisitor { open fun visitValueParameterReference(valueParameterReference: ConeValueParameterReference, data: D): R = visitValue(valueParameterReference, data) - open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R = + open fun visitBooleanValueParameterReference(booleanValueParameterReference: ConeBooleanValueParameterReference, data: D): R = visitValueParameterReference(booleanValueParameterReference, data) } \ No newline at end of file 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 a9c50b35ffb..7e9da417520 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,6 +5,10 @@ package org.jetbrains.kotlin.fir.contracts.description +import org.jetbrains.kotlin.fir.contracts.* +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription +import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner +import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.renderer.FirRendererComponents import org.jetbrains.kotlin.fir.types.renderForDebugging @@ -12,6 +16,63 @@ class ConeContractRenderer : ConeContractDescriptionVisitor() { internal lateinit var components: FirRendererComponents private val printer get() = components.printer + private val visitor get() = components.visitor + + fun render(declaration: FirDeclaration) { + val contractDescription = (declaration as? FirContractDescriptionOwner)?.contractDescription ?: return + render(contractDescription) + } + + fun render(contractDescription: FirContractDescription) { + printer.pushIndent() + if (contractDescription !is FirEmptyContractDescription) { + printer.newLine() + val prefix = if (contractDescription is FirResolvedContractDescription) "R|" else "" + printer.print("[${prefix}Contract description]") + } + when (contractDescription) { + is FirLegacyRawContractDescription -> render(contractDescription) + is FirRawContractDescription -> render(contractDescription) + is FirResolvedContractDescription -> { + printer.println() + render(contractDescription) + } + } + printer.popIndent() + } + + fun render(effectDeclaration: FirEffectDeclaration) { + printer.newLine() + printer.println("[Effect declaration] <") + effectDeclaration.effect.accept(this, null) + printer.println() + printer.println(">") + } + + internal fun render(legacyRawContractDescription: FirLegacyRawContractDescription) { + printer.renderInBraces("<", ">") { + legacyRawContractDescription.contractCall.accept(visitor) + printer.newLine() + } + } + + internal fun render(rawContractDescription: FirRawContractDescription) { + printer.renderInBraces("<", ">") { + printer.renderSeparatedWithNewlines(rawContractDescription.rawEffects, visitor) + printer.newLine() + } + } + + internal fun render(resolvedContractDescription: FirResolvedContractDescription) { + printer.println(" <") + printer.pushIndent() + resolvedContractDescription.effects.forEach { declaration -> + declaration.effect.accept(this, null) + printer.println() + } + printer.popIndent() + printer.println(">") + } override fun visitConditionalEffectDeclaration(conditionalEffect: ConeConditionalEffectDeclaration, data: Nothing?) { conditionalEffect.effect.accept(this, data) 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 f6b1554b25d..ebcbce2e423 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 @@ -114,47 +114,35 @@ class FirRenderer( visitor.visitMemberDeclaration(firClass) } - private class FirComponentsImpl : FirRendererComponents { - override var annotationRenderer: FirAnnotationRenderer? = null - - override var bodyRenderer: FirBodyRenderer? = null - - override var contractRenderer: ConeContractRenderer? = null - - override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null - - override var propertyAccessorRenderer: FirPropertyAccessorRenderer? = null - - override var resolvePhaseRenderer: FirResolvePhaseRenderer? = null - - override lateinit var callArgumentsRenderer: FirCallArgumentsRenderer - - override lateinit var classMemberRenderer: FirClassMemberRenderer - - override lateinit var declarationRenderer: FirDeclarationRenderer - - override lateinit var idRenderer: ConeIdRenderer - - override lateinit var modifierRenderer: FirModifierRenderer - - override lateinit var typeRenderer: ConeTypeRenderer - - override lateinit var valueParameterRenderer: FirValueParameterRenderer - - override lateinit var visitor: Visitor - - override lateinit var printer: FirPrinter + fun renderAnnotations(annotationContainer: FirAnnotationContainer) { + annotationRenderer?.render(annotationContainer) } - private fun List.renderTypesSeparated() { - for ((index, element) in this.withIndex()) { - if (index > 0) { - print(", ") - } - print(element.renderForDebugging()) + fun renderSupertypes(regularClass: FirRegularClass) { + if (regularClass.superTypeRefs.isNotEmpty()) { + print(" : ") + renderSeparated(regularClass.superTypeRefs, visitor) } } + private class FirComponentsImpl : FirRendererComponents { + override var annotationRenderer: FirAnnotationRenderer? = null + override var bodyRenderer: FirBodyRenderer? = null + override var contractRenderer: ConeContractRenderer? = null + override var packageDirectiveRenderer: FirPackageDirectiveRenderer? = null + override var propertyAccessorRenderer: FirPropertyAccessorRenderer? = null + override var resolvePhaseRenderer: FirResolvePhaseRenderer? = null + + override lateinit var callArgumentsRenderer: FirCallArgumentsRenderer + override lateinit var classMemberRenderer: FirClassMemberRenderer + override lateinit var declarationRenderer: FirDeclarationRenderer + override lateinit var idRenderer: ConeIdRenderer + override lateinit var modifierRenderer: FirModifierRenderer + override lateinit var typeRenderer: ConeTypeRenderer + override lateinit var valueParameterRenderer: FirValueParameterRenderer + override lateinit var visitor: Visitor + override lateinit var printer: FirPrinter + } private fun Variance.renderVariance() { label.let { @@ -173,13 +161,6 @@ class FirRenderer( newLine() } - private fun FirDeclaration.renderContractDescription() { - val contractDescription = (this as? FirContractDescriptionOwner)?.contractDescription ?: return - pushIndent() - contractDescription.accept(visitor) - popIndent() - } - private fun List.renderTypeParameters() { if (isNotEmpty()) { print("<") @@ -196,27 +177,6 @@ class FirRenderer( } } - fun renderSupertypes(regularClass: FirRegularClass) { - if (regularClass.superTypeRefs.isNotEmpty()) { - print(" : ") - renderSeparated(regularClass.superTypeRefs, visitor) - } - } - - fun renderAnnotations(annotationContainer: FirAnnotationContainer) { - annotationRenderer?.render(annotationContainer) - } - - fun renderClassDeclarations(regularClass: FirRegularClass) { - classMemberRenderer.render(regularClass) - } - - private fun visitAssignment(operation: FirOperation, rValue: FirExpression) { - print(operation.operator) - print(" ") - rValue.accept(visitor) - } - inner class Visitor internal constructor() : FirVisitorVoid() { override fun visitElement(element: FirElement) { @@ -266,7 +226,7 @@ class FirRenderer( } print(": ") callableDeclaration.returnTypeRef.accept(this) - callableDeclaration.renderContractDescription() + contractRenderer?.render(callableDeclaration) } override fun visitContextReceiver(contextReceiver: FirContextReceiver) { @@ -327,7 +287,7 @@ class FirRenderer( annotationRenderer?.render(regularClass) visitMemberDeclaration(regularClass) renderSupertypes(regularClass) - renderClassDeclarations(regularClass) + classMemberRenderer.render(regularClass) } override fun visitEnumEntry(enumEntry: FirEnumEntry) { @@ -421,7 +381,7 @@ class FirRenderer( valueParameterRenderer.renderParameters(propertyAccessor.valueParameters) print(": ") propertyAccessor.returnTypeRef.accept(this) - propertyAccessor.renderContractDescription() + contractRenderer?.render(propertyAccessor) bodyRenderer?.render(propertyAccessor) } @@ -879,9 +839,12 @@ class FirRenderer( if (resolvedNamedReference is FirResolvedCallableReference) { if (resolvedNamedReference.inferredTypeArguments.isNotEmpty()) { print("<") - - resolvedNamedReference.inferredTypeArguments.renderTypesSeparated() - + for ((index, element) in resolvedNamedReference.inferredTypeArguments.withIndex()) { + if (index > 0) { + print(", ") + } + typeRenderer.render(element) + } print(">") } } @@ -1007,7 +970,9 @@ class FirRenderer( visitQualifiedAccess(variableAssignment) variableAssignment.lValue.accept(this) print(" ") - visitAssignment(FirOperation.ASSIGN, variableAssignment.rValue) + print(FirOperation.ASSIGN.operator) + print(" ") + variableAssignment.rValue.accept(visitor) } override fun visitAugmentedArraySetCall(augmentedArraySetCall: FirAugmentedArraySetCall) { @@ -1118,45 +1083,8 @@ class FirRenderer( visitNamedReference(errorNamedReference) } - override fun visitLegacyRawContractDescription(legacyRawContractDescription: FirLegacyRawContractDescription) { - newLine() - print("[Contract description]") - renderInBraces("<", ">") { - legacyRawContractDescription.contractCall.accept(this) - newLine() - } - } - - override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { - newLine() - print("[Contract description]") - renderInBraces("<", ">") { - renderSeparatedWithNewlines(rawContractDescription.rawEffects, visitor) - newLine() - } - } - override fun visitEffectDeclaration(effectDeclaration: FirEffectDeclaration) { - newLine() - println("[Effect declaration] <") - contractRenderer?.let { effectDeclaration.effect.accept(it, null) } - println() - println(">") - } - - override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) { - newLine() - println("[R|Contract description]") - println(" <") - pushIndent() - resolvedContractDescription.effects.forEach { declaration -> - contractRenderer?.let { - declaration.effect.accept(it, null) - println() - } - } - popIndent() - println(">") + contractRenderer?.render(effectDeclaration) } override fun visitContractDescription(contractDescription: FirContractDescription) {