Skip to content

Commit

Permalink
[FIR] Add contracts to FIR renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
demiurg906 committed Apr 15, 2020
1 parent 50627f2 commit 25cee12
Showing 1 changed file with 41 additions and 7 deletions.
48 changes: 41 additions & 7 deletions compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirRenderer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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()
}

Expand Down Expand Up @@ -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)
}
}

0 comments on commit 25cee12

Please sign in to comment.