From 25cee12421ff81fd69419fe2dfc76ddaacae5030 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 8 Apr 2020 15:21:37 +0300 Subject: [PATCH] [FIR] Add contracts to FIR renderer --- .../org/jetbrains/kotlin/fir/FirRenderer.kt | 48 ++++++++++++++++--- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt index 4941077f4f1e2..3972c4e89ea5f 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt @@ -10,12 +10,14 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.FirRawContractDescription +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription +import org.jetbrains.kotlin.fir.contracts.description.ConeContractRenderer +import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.* -import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition -import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub -import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression -import org.jetbrains.kotlin.fir.expressions.impl.FirUnitExpression +import org.jetbrains.kotlin.fir.expressions.impl.* import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag @@ -157,6 +159,14 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM } print(": ") callableDeclaration.returnTypeRef.accept(this) + callableDeclaration.renderContractDescription() + } + + private fun FirDeclaration.renderContractDescription() { + val contractDescription = (this as? FirContractDescriptionOwner)?.contractDescription ?: return + pushIndent() + contractDescription.accept(this@FirRenderer) + popIndent() } private fun Visibility.asString(effectiveVisibility: FirEffectiveVisibility? = null): String { @@ -310,12 +320,12 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM } } - fun renderInBraces(f: () -> Unit) { - println(" {") + fun renderInBraces(leftBrace: String = "{", rightBrace: String = "}", f: () -> Unit) { + println(" $leftBrace") pushIndent() f() popIndent() - println("}") + println(rightBrace) } fun renderSupertypes(regularClass: FirRegularClass) { @@ -423,6 +433,7 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM propertyAccessor.valueParameters.renderParameters() print(": ") propertyAccessor.returnTypeRef.accept(this) + propertyAccessor.renderContractDescription() propertyAccessor.body?.renderBody() } @@ -1116,4 +1127,27 @@ class FirRenderer(builder: StringBuilder, private val mode: RenderMode = RenderM override fun visitErrorNamedReference(errorNamedReference: FirErrorNamedReference) { visitNamedReference(errorNamedReference) } + + override fun visitRawContractDescription(rawContractDescription: FirRawContractDescription) { + newLine() + print("[Contract description]") + renderInBraces("<", ">") { + rawContractDescription.contractCall.accept(this) + newLine() + } + } + + override fun visitResolvedContractDescription(resolvedContractDescription: FirResolvedContractDescription) { + newLine() + println("[R|Contract description]") + renderInBraces("<", ">") { + for (effect in resolvedContractDescription.effects) { + println(buildString { effect.accept(ConeContractRenderer(this), null) }) + } + } + } + + override fun visitContractDescription(contractDescription: FirContractDescription) { + require(contractDescription is FirEmptyContractDescription) + } }