diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TryCatchExpressionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TryCatchExpressionGenerator.kt index eea7e023844..4f60a7e25af 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TryCatchExpressionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/TryCatchExpressionGenerator.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.psi2ir.generators 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.impl.IrCatchImpl import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl @@ -37,7 +36,6 @@ class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : Stat val ktCatchParameter = ktCatchClause.catchParameter!! val ktCatchBody = ktCatchClause.catchBody!! val catchParameterDescriptor = getOrFail(BindingContext.VALUE_PARAMETER, ktCatchParameter) - val irCatchResult = statementGenerator.generateExpression(ktCatchBody) val irCatch = IrCatchImpl( ktCatchClause.startOffset, ktCatchClause.endOffset, @@ -45,9 +43,11 @@ class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : Stat ktCatchParameter.startOffset, ktCatchParameter.endOffset, IrDeclarationOrigin.CATCH_PARAMETER, catchParameterDescriptor - ), - irCatchResult - ) + ) + ).apply { + result = statementGenerator.generateExpression(ktCatchBody) + } + irTryCatch.catches.add(irCatch) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTryImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTryImpl.kt index 69c217190d5..4a14678d12f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTryImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrTryImpl.kt @@ -63,11 +63,22 @@ class IrTryImpl(startOffset: Int, endOffset: Int, type: KotlinType) : } } -class IrCatchImpl( - startOffset: Int, endOffset: Int, - override var catchParameter: IrVariable, - override var result: IrExpression -) : IrCatch, IrElementBase(startOffset, endOffset) { +class IrCatchImpl(startOffset: Int, endOffset: Int) + : IrCatch, IrElementBase(startOffset, endOffset) +{ + constructor(startOffset: Int, endOffset: Int, catchParameter: IrVariable) + : 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 fun accept(visitor: IrElementVisitor, data: D): R { diff --git a/compiler/testData/ir/irText/expressions/catchParameterAccess.kt b/compiler/testData/ir/irText/expressions/catchParameterAccess.kt new file mode 100644 index 00000000000..2c327d21acd --- /dev/null +++ b/compiler/testData/ir/irText/expressions/catchParameterAccess.kt @@ -0,0 +1,2 @@ +fun test(f: () -> Unit) = + try { f() } catch (e: Exception) { throw e } \ No newline at end of file diff --git a/compiler/testData/ir/irText/expressions/catchParameterAccess.txt b/compiler/testData/ir/irText/expressions/catchParameterAccess.txt new file mode 100644 index 00000000000..183aa91ea91 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/catchParameterAccess.txt @@ -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 diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 83a0935a27c..377cf05cd74 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -551,6 +551,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { 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") public void testChainOfSafeCalls() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/chainOfSafeCalls.kt");