From 44af612775d367f4b23c1c11ba6add349ddae446 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 18 Aug 2022 15:00:14 +0300 Subject: [PATCH] Provide better explanation message if interpreter fails --- .../interpreter/checker/IrConstTransformer.kt | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt index 5b1032906d0..e861e591320 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrConstTransformer.kt @@ -7,7 +7,10 @@ package org.jetbrains.kotlin.ir.interpreter.checker import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer +import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase +import org.jetbrains.kotlin.ir.declarations.IrField +import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl @@ -15,6 +18,7 @@ import org.jetbrains.kotlin.ir.interpreter.IrInterpreter import org.jetbrains.kotlin.ir.interpreter.isPrimitiveArray import org.jetbrains.kotlin.ir.interpreter.toIrConst import org.jetbrains.kotlin.ir.types.* +import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid class IrConstTransformer( @@ -44,9 +48,19 @@ class IrConstTransformer( return this } + private fun IrExpression.interpret(failAsError: Boolean): IrExpression { + val result = try { + interpreter.interpret(this, irFile) + } catch (e: Throwable) { + throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e) + } + + return if (failAsError) result.reportIfError(this) else result.warningIfError(this) + } + override fun visitCall(expression: IrCall): IrExpression { if (expression.accept(IrCompileTimeChecker(mode = mode), null)) { - return interpreter.interpret(expression, irFile).warningIfError(expression) + return expression.interpret(failAsError = false) } return super.visitCall(expression) } @@ -59,8 +73,7 @@ class IrConstTransformer( if (expression is IrConst<*>) return declaration val isConst = declaration.correspondingPropertySymbol?.owner?.isConst == true if (isConst && expression.accept(IrCompileTimeChecker(declaration, mode), null)) { - val result = interpreter.interpret(expression, irFile) - initializer.expression = result.reportIfError(expression) + initializer.expression = expression.interpret(failAsError = true) } return super.visitField(declaration) @@ -106,8 +119,7 @@ class IrConstTransformer( private fun IrExpression.transformSingleArg(expectedType: IrType): IrExpression { if (this.accept(IrCompileTimeChecker(mode = mode), null)) { - val const = interpreter.interpret(this, irFile).reportIfError(this) - return const.convertToConstIfPossible(expectedType) + return this.interpret(failAsError = true).convertToConstIfPossible(expectedType) } else if (this is IrConstructorCall) { transformAnnotation(this) }