From b283f657cf16c15f835209115e59482f446b7c3e Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 2 Oct 2019 13:54:11 +0200 Subject: [PATCH] Fix a nasty bug in logical context. A meta logical within a pattern was not properly initialized before the rule body is processed. --- .../mps/logic/reactor/core/internal/RuleMatchImpl.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/RuleMatchImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/RuleMatchImpl.kt index b0d6681a..a37e6bab 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/RuleMatchImpl.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/RuleMatchImpl.kt @@ -37,14 +37,20 @@ internal class RuleMatchImpl(private val rule: Rule, val meta2logical = HashMap, Logical<*>>() - override fun variable(meta: MetaLogical): Logical = - (meta2logical[meta] ?: subst[meta]?.let { value -> + override fun variable(meta: MetaLogical): Logical { + if (meta2logical.containsKey(meta)) return meta2logical[meta] as Logical + + val logical = subst[meta]?.let { value -> when (value) { is Logical<*> -> value is LogicalOwner -> value.logical() else -> LogicalImpl(meta, value as V) } - } ?: meta.logical().also { logical -> meta2logical[meta] = logical }) as Logical + } ?: meta.logical() + + meta2logical[meta] = logical + return logical as Logical + } }