IrCatch element.

This commit is contained in:
Dmitry Petrov
2016-09-15 14:24:21 +03:00
committed by Dmitry Petrov
parent c02ae4a4a5
commit 90119880c5
11 changed files with 104 additions and 92 deletions
@@ -17,19 +17,21 @@
package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
interface IrTryCatch : IrExpression {
interface IrTry : IrExpression {
var tryResult: IrExpression
val catchClausesCount: Int
fun getNthCatchParameter(n: Int): VariableDescriptor?
fun getNthCatchResult(n: Int): IrExpression?
fun putNthCatchParameter(n: Int, variableDescriptor: VariableDescriptor)
fun putNthCatchResult(n: Int, expression: IrExpression)
val catches: List<IrCatch>
var finallyExpression : IrExpression?
}
val IrTryCatch.catchClauseIndices: IntRange get() = 0 ..catchClausesCount - 1
interface IrCatch : IrElement {
val parameter: VariableDescriptor
var result: IrExpression
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrCatch =
super.transform(transformer, data) as IrCatch
}
@@ -17,57 +17,54 @@
package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.IrElementBase
import org.jetbrains.kotlin.ir.expressions.IrCatch
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrTryCatch
import org.jetbrains.kotlin.ir.expressions.IrTry
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.utils.SmartList
class IrTryCatchImpl(startOffset: Int, endOffset: Int, type: KotlinType) :
IrExpressionBase(startOffset, endOffset, type), IrTryCatch {
class IrTryImpl(startOffset: Int, endOffset: Int, type: KotlinType) :
IrExpressionBase(startOffset, endOffset, type), IrTry {
override lateinit var tryResult: IrExpression
private val catchClauseParameters = SmartList<VariableDescriptor>()
private val catchClauseResults = SmartList<IrExpression>()
override val catchClausesCount: Int get() = catchClauseResults.size
fun addCatchClause(parameter: VariableDescriptor, result: IrExpression) {
catchClauseParameters.add(parameter)
catchClauseResults.add(result)
}
override fun getNthCatchParameter(n: Int): VariableDescriptor? =
catchClauseParameters.getOrNull(n)
override fun getNthCatchResult(n: Int): IrExpression? =
catchClauseResults.getOrNull(n)
override fun putNthCatchParameter(n: Int, variableDescriptor: VariableDescriptor) {
catchClauseParameters[n] = variableDescriptor
}
override fun putNthCatchResult(n: Int, expression: IrExpression) {
catchClauseResults[n] = expression
}
override val catches: MutableList<IrCatch> = SmartList()
override var finallyExpression: IrExpression? = null
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitTryCatch(this, data)
return visitor.visitTry(this, data)
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
tryResult.accept(visitor, data)
catchClauseResults.forEach { it.accept(visitor, data) }
catches.forEach { it.accept(visitor, data) }
finallyExpression?.accept(visitor, data)
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
tryResult = tryResult.transform(transformer, data)
catchClauseResults.forEachIndexed { i, irExpression ->
catchClauseResults[i] = irExpression.transform(transformer, data)
catches.forEachIndexed { i, irCatch ->
catches[i] = irCatch.transform(transformer, data)
}
}
}
class IrCatchImpl(startOffset: Int, endOffset: Int,
override val parameter: VariableDescriptor,
override var result: IrExpression
) : IrCatch, IrElementBase(startOffset, endOffset) {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitCatch(this, data)
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
result.accept(visitor, data)
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
result = result.transform(transformer, data)
}
}
@@ -142,14 +142,13 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
}
}
override fun visitTryCatch(tryCatch: IrTryCatch, data: String) {
tryCatch.dumpLabeledElementWith(data) {
tryCatch.tryResult.accept(this, "try")
for (i in 0 .. tryCatch.catchClausesCount - 1) {
val catchClauseParameter = tryCatch.getNthCatchParameter(i)!!
tryCatch.getNthCatchResult(i)!!.accept(this, "catch ${catchClauseParameter.name}")
override fun visitTry(aTry: IrTry, data: String) {
aTry.dumpLabeledElementWith(data) {
aTry.tryResult.accept(this, "try")
for (aCatch in aTry.catches) {
aCatch.accept(this, "")
}
tryCatch.finallyExpression?.accept(this, "finally")
aTry.finallyExpression?.accept(this, "finally")
}
}
@@ -179,8 +179,11 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitGetClass(expression: IrGetClass, data: Nothing?): String =
"GET_CLASS type=${expression.type.render()}"
override fun visitTryCatch(tryCatch: IrTryCatch, data: Nothing?): String =
"TRY_CATCH type=${tryCatch.type.render()}"
override fun visitTry(aTry: IrTry, data: Nothing?): String =
"TRY type=${aTry.type.render()}"
override fun visitCatch(aCatch: IrCatch, data: Nothing?): String =
"CATCH parameter=${aCatch.parameter.ref()}"
override fun visitErrorDeclaration(declaration: IrErrorDeclaration, data: Nothing?): String =
"ERROR_DECL ${declaration.descriptor.javaClass.simpleName} ${declaration.descriptor.ref()}"
@@ -104,7 +104,12 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
override fun visitLoop(loop: IrLoop, data: D) = visitExpression(loop, data)
override fun visitWhileLoop(loop: IrWhileLoop, data: D) = visitLoop(loop, data)
override fun visitDoWhileLoop(loop: IrDoWhileLoop, data: D) = visitLoop(loop, data)
override fun visitTryCatch(tryCatch: IrTryCatch, data: D) = visitExpression(tryCatch, data)
override fun visitTry(aTry: IrTry, data: D) = visitExpression(aTry, data)
override fun visitCatch(aCatch: IrCatch, data: D): IrCatch {
aCatch.transformChildren(this, data)
return aCatch
}
override fun visitBreakContinue(jump: IrBreakContinue, data: D) = visitExpression(jump, data)
override fun visitBreak(jump: IrBreak, data: D) = visitBreakContinue(jump, data)
@@ -81,7 +81,8 @@ interface IrElementVisitor<out R, in D> {
fun visitLoop(loop: IrLoop, data: D) = visitExpression(loop, data)
fun visitWhileLoop(loop: IrWhileLoop, data: D) = visitLoop(loop, data)
fun visitDoWhileLoop(loop: IrDoWhileLoop, data: D) = visitLoop(loop, data)
fun visitTryCatch(tryCatch: IrTryCatch, data: D) = visitExpression(tryCatch, data)
fun visitTry(aTry: IrTry, data: D) = visitExpression(aTry, data)
fun visitCatch(aCatch: IrCatch, data: D) = visitElement(aCatch, data)
fun visitBreakContinue(jump: IrBreakContinue, data: D) = visitExpression(jump, data)
fun visitBreak(jump: IrBreak, data: D) = visitBreakContinue(jump, data)
@@ -174,8 +174,11 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitDoWhileLoop(loop: IrDoWhileLoop) = visitLoop(loop)
override fun visitDoWhileLoop(loop: IrDoWhileLoop, data: Nothing?) = visitDoWhileLoop(loop)
fun visitTryCatch(tryCatch: IrTryCatch) = visitExpression(tryCatch)
override fun visitTryCatch(tryCatch: IrTryCatch, data: Nothing?) = visitTryCatch(tryCatch)
fun visitTry(aTry: IrTry) = visitExpression(aTry)
override fun visitTry(aTry: IrTry, data: Nothing?) = visitTry(aTry)
fun visitCatch(aCatch: IrCatch) = visitElement(aCatch)
override fun visitCatch(aCatch: IrCatch, data: Nothing?) = visitCatch(aCatch)
fun visitBreakContinue(jump: IrBreakContinue) = visitExpression(jump)
override fun visitBreakContinue(jump: IrBreakContinue, data: Nothing?) = visitBreakContinue(jump)