Generate catch-block body within proper scope
This commit is contained in:
+5
-5
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.psi2ir.generators
|
package org.jetbrains.kotlin.psi2ir.generators
|
||||||
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl
|
||||||
@@ -37,7 +36,6 @@ class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
|||||||
val ktCatchParameter = ktCatchClause.catchParameter!!
|
val ktCatchParameter = ktCatchClause.catchParameter!!
|
||||||
val ktCatchBody = ktCatchClause.catchBody!!
|
val ktCatchBody = ktCatchClause.catchBody!!
|
||||||
val catchParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktCatchParameter)
|
val catchParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktCatchParameter)
|
||||||
val irCatchResult = statementGenerator.generateExpression(ktCatchBody)
|
|
||||||
|
|
||||||
val irCatch = IrCatchImpl(
|
val irCatch = IrCatchImpl(
|
||||||
ktCatchClause.startOffset, ktCatchClause.endOffset,
|
ktCatchClause.startOffset, ktCatchClause.endOffset,
|
||||||
@@ -45,9 +43,11 @@ class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
|||||||
ktCatchParameter.startOffset, ktCatchParameter.endOffset,
|
ktCatchParameter.startOffset, ktCatchParameter.endOffset,
|
||||||
IrDeclarationOrigin.CATCH_PARAMETER,
|
IrDeclarationOrigin.CATCH_PARAMETER,
|
||||||
catchParameterDescriptor
|
catchParameterDescriptor
|
||||||
),
|
)
|
||||||
irCatchResult
|
).apply {
|
||||||
)
|
result = statementGenerator.generateExpression(ktCatchBody)
|
||||||
|
}
|
||||||
|
|
||||||
irTryCatch.catches.add(irCatch)
|
irTryCatch.catches.add(irCatch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,11 +63,22 @@ class IrTryImpl(startOffset: Int, endOffset: Int, type: KotlinType) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class IrCatchImpl(
|
class IrCatchImpl(startOffset: Int, endOffset: Int)
|
||||||
startOffset: Int, endOffset: Int,
|
: IrCatch, IrElementBase(startOffset, endOffset)
|
||||||
override var catchParameter: IrVariable,
|
{
|
||||||
override var result: IrExpression
|
constructor(startOffset: Int, endOffset: Int, catchParameter: IrVariable)
|
||||||
) : IrCatch, IrElementBase(startOffset, endOffset) {
|
: this(startOffset, endOffset) {
|
||||||
|
this.catchParameter = catchParameter
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(startOffset: Int, endOffset: Int, catchParameter: IrVariable, result: IrExpression)
|
||||||
|
: this(startOffset, endOffset, catchParameter) {
|
||||||
|
this.result = result
|
||||||
|
}
|
||||||
|
|
||||||
|
override lateinit var catchParameter: IrVariable
|
||||||
|
override lateinit var result: IrExpression
|
||||||
|
|
||||||
override val parameter: VariableDescriptor get() = catchParameter.descriptor
|
override val parameter: VariableDescriptor get() = catchParameter.descriptor
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
fun test(f: () -> Unit) =
|
||||||
|
try { f() } catch (e: Exception) { throw e }
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
FILE /catchParameterAccess.kt
|
||||||
|
FUN public fun test(f: () -> kotlin.Unit): kotlin.Unit
|
||||||
|
VALUE_PARAMETER value-parameter f: () -> kotlin.Unit
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='test(() -> Unit): Unit'
|
||||||
|
TRY type=kotlin.Unit
|
||||||
|
try: BLOCK type=kotlin.Unit origin=null
|
||||||
|
CALL 'invoke(): Unit' type=kotlin.Unit origin=INVOKE
|
||||||
|
$this: GET_VAR 'value-parameter f: () -> Unit' type=() -> kotlin.Unit origin=VARIABLE_AS_FUNCTION
|
||||||
|
CATCH parameter=e: Exception /* = Exception */
|
||||||
|
VAR CATCH_PARAMETER val e: kotlin.Exception /* = java.lang.Exception */
|
||||||
|
BLOCK type=kotlin.Nothing origin=null
|
||||||
|
THROW type=kotlin.Nothing
|
||||||
|
GET_VAR 'e: Exception /* = Exception */' type=kotlin.Exception /* = java.lang.Exception */ origin=null
|
||||||
@@ -551,6 +551,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("catchParameterAccess.kt")
|
||||||
|
public void testCatchParameterAccess() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/catchParameterAccess.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("chainOfSafeCalls.kt")
|
@TestMetadata("chainOfSafeCalls.kt")
|
||||||
public void testChainOfSafeCalls() throws Exception {
|
public void testChainOfSafeCalls() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/chainOfSafeCalls.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/chainOfSafeCalls.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user