[FIR] Add contracts to FIR renderer
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user