Provide better explanation message if interpreter fails

This commit is contained in:
Ivan Kylchik
2022-08-18 15:00:14 +03:00
committed by Space
parent 4e740e91f2
commit 44af612775
@@ -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)
}