From 84e6e1e305a9c63e0e64da14a2f01c50e4540da0 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Sat, 11 Jul 2020 17:23:11 +0300 Subject: [PATCH] Add WITH_ANNOTATIONS evaluation mode This mode means that function can be executed if it has CompileTimeCalculation annotation. FULL mode for now will mean deep check without annotation help --- .../kotlin/ir/interpreter/checker/EvaluationMode.kt | 2 +- .../kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) 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 }