diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt index 4cf7dbf20c1..a9ad4f655e4 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/EvaluationMode.kt @@ -6,5 +6,5 @@ package org.jetbrains.kotlin.ir.interpreter.checker enum class EvaluationMode { - FULL, ONLY_BUILTINS + FULL, WITH_ANNOTATIONS, ONLY_BUILTINS } \ No newline at end of file diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt index 2d0972661df..3c6ccdf14b0 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt @@ -8,6 +8,7 @@ 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.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.interpreter.builtins.compileTimeAnnotation import org.jetbrains.kotlin.ir.interpreter.builtins.contractsDslAnnotation @@ -20,7 +21,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.FqName class IrCompileTimeChecker( - containingDeclaration: IrElement? = null, private val mode: EvaluationMode = EvaluationMode.FULL + containingDeclaration: IrElement? = null, private val mode: EvaluationMode = EvaluationMode.WITH_ANNOTATIONS ) : IrElementVisitor { private val visitedStack = mutableListOf().apply { if (containingDeclaration != null) add(containingDeclaration) } @@ -31,8 +32,9 @@ class IrCompileTimeChecker( private fun IrDeclaration.isContract() = isMarkedWith(contractsDslAnnotation) private fun IrDeclaration.isMarkedAsEvaluateIntrinsic() = isMarkedWith(evaluateIntrinsicAnnotation) private fun IrDeclaration.isMarkedAsCompileTime(expression: IrCall? = null): Boolean { - if (mode == EvaluationMode.FULL) { - return isMarkedWith(compileTimeAnnotation) || + if (mode == EvaluationMode.WITH_ANNOTATIONS) { + return isMarkedWith(compileTimeAnnotation) || this.origin == IrBuiltIns.BUILTIN_OPERATOR || + (this is IrSimpleFunction && this.isOperator && this.name.asString() == "invoke") || (this is IrSimpleFunction && this.isFakeOverride && this.overriddenSymbols.any { it.owner.isMarkedAsCompileTime() }) || this.parentClassOrNull?.fqNameWhenAvailable?.asString() in compileTimeTypeAliases }