]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRule.java
(refs #7377) Refactoring CHR query parsing
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRRule.java
index 9846ebd4807db5342ace21ceec9027b41ba4c5f5..c668005d7f1f6b07ea714d3101ef944d28957d45 100644 (file)
@@ -23,13 +23,14 @@ import gnu.trove.set.hash.THashSet;
 import gnu.trove.set.hash.TIntHashSet;
 
 public class CHRRule extends Symbol {
+    public CHRRuleset parentRuleset;
     public int priority;
     public CHRQuery head;
     public CHRQuery body;
     public Variable[] existentialVariables;
     
     // Analysis
-    public int firstPriorityExecuted;
+    //public int firstPriorityExecuted;
     public int lastPriorityExecuted;
     
     // Plans
@@ -44,10 +45,15 @@ public class CHRRule extends Symbol {
         this.body = body;
         this.existentialVariables = existentialVariables;
     }
+    
+    public CHRRule(long location, CHRQuery head, CHRQuery body) {
+        this(location, head, body, null);
+    }
 
     public void resolve(TranslationContext context) {
         context.pushExistentialFrame();
         head.resolve(context);
+        context.disallowNewExistentials();
         body.resolve(context);
         existentialVariables = context.popExistentialFrame();
     }
@@ -93,7 +99,7 @@ public class CHRRule extends Symbol {
     }
 
     public void compile(CompilationContext compilationContext, CHRConstraint initConstraint) {
-        boolean hasActiveLiteral = false;
+        boolean hasLocalActiveLiteral = false;
         for(int i=0;i<head.literals.length;++i) {
             CHRLiteral literal = head.literals[i];
             if(literal.passive)
@@ -102,17 +108,18 @@ public class CHRRule extends Symbol {
             
             Variable activeFact = new Variable("activeFact", constraint.factType);
             QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
-            if(!head.createQueryPlan(context, new EVariable(activeFact), i))
+            if(!head.createQueryPlan(context, new EVariable(activeFact), i, initConstraint))
                 return;
             body.createEnforcePlan(context, priority);
             addPlan(new CHRSearchPlan(constraint, activeFact, context.getPlanOps()));
             
-            hasActiveLiteral = true;
+            if(constraint.parentRuleset == parentRuleset)
+                hasLocalActiveLiteral = true;
         }
-        if(!hasActiveLiteral) {
+        if(!hasLocalActiveLiteral) {
             Variable activeFact = new Variable("activeFact", initConstraint.factType);
             QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
-            if(!head.createQueryPlan(context, null, -1))
+            if(!head.createQueryPlan(context, new EVariable(activeFact), -1, initConstraint))
                 return;
             body.createEnforcePlan(context, priority);
             /*System.out.println(this);
@@ -124,7 +131,6 @@ public class CHRRule extends Symbol {
     
     private void addPlan(CHRSearchPlan plan) {
         plans.add(plan);
-        plan.constraint.minimumPriority = Math.min(plan.constraint.minimumPriority, priority);
     }
 
     public String toString() {