IrCatch element.
This commit is contained in:
committed by
Dmitry Petrov
parent
c02ae4a4a5
commit
90119880c5
+10
-8
@@ -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
|
||||
}
|
||||
+27
-30
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user