From 23f9e97a5f0379116571a4a6660dead322731d64 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 12 Apr 2022 22:55:42 +0300 Subject: [PATCH] Create `getInnerDeclarations` function to extract statements from parent This function is needed to be able to work with files and scripts --- .../ir/interpreter/checker/IrCompileTimeChecker.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 699112ce93a..cf9bdd15d16 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 @@ -31,6 +31,10 @@ class IrCompileTimeChecker( override fun visitElement(element: IrElement, data: Nothing?) = false + private fun IrDeclarationParent.getInnerDeclarations(): List { + return (this as? IrDeclarationContainer)?.declarations ?: (this as? IrStatementContainer)?.statements ?: emptyList() + } + private fun visitStatements(statements: List, data: Nothing?): Boolean { if (mode == EvaluationMode.ONLY_BUILTINS || mode == EvaluationMode.ONLY_INTRINSIC_CONST) { val statement = statements.singleOrNull() ?: return false @@ -149,8 +153,8 @@ class IrCompileTimeChecker( receiverComputable && initializerComputable } else -> { - val parent = owner.parent as IrDeclarationContainer - val getter = parent.declarations.filterIsInstance().singleOrNull { it == property }?.getter ?: return false + val declarations = owner.parent.getInnerDeclarations() + val getter = declarations.filterIsInstance().singleOrNull { it == property }?.getter ?: return false visitedStack.contains(getter) } } @@ -160,8 +164,8 @@ class IrCompileTimeChecker( if (expression.accessesTopLevelOrObjectField()) return false //todo check receiver? val property = expression.symbol.owner.correspondingPropertySymbol?.owner - val parent = expression.symbol.owner.parent as IrDeclarationContainer - val setter = parent.declarations.filterIsInstance().single { it == property }.setter ?: return false + val declarations = expression.symbol.owner.parent.getInnerDeclarations() + val setter = declarations.filterIsInstance().single { it == property }.setter ?: return false return visitedStack.contains(setter) && expression.value.accept(this, data) }