]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/relations/CHRConstraint.java
(refs #7250) CHR rules modularization (first working version)
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / relations / CHRConstraint.java
index 8612fd766ade4410ad9b1706f887e2504e29273b..c0f43928877458cbb9a9241ad3e764481acd3ce5 100644 (file)
@@ -38,9 +38,9 @@ public class CHRConstraint extends Symbol implements CHRRelation {
     public boolean implicitlyDeclared;
 
     // Analysis
-    public int firstPriorityAdded;
+    //public int firstPriorityAdded;
     public int lastPriorityAdded;
-    public int firstPriorityRemoved;
+    //public int firstPriorityRemoved;
     public int lastPriorityRemoved;
     
     // Transient info
@@ -56,11 +56,9 @@ public class CHRConstraint extends Symbol implements CHRRelation {
     public Constant addProcedure;
     public Constant removeProcedure;
     
-    public TIntObjectHashMap<IndexInfo> indices;
+    public String nextContainerFieldName;
     
-    // Query plans
-    public int minimumPriority = Integer.MAX_VALUE;
-    public int nextPriority = Integer.MAX_VALUE; // used in code generation
+    public TIntObjectHashMap<IndexInfo> indices;
     
     public static class IndexInfo {
         public final int indexMask;
@@ -86,7 +84,7 @@ public class CHRConstraint extends Symbol implements CHRRelation {
         JavaTypeTranslator jtt = context.javaTypeTranslator;
         
         this.parentRuleset = parentRuleset;
-        this.factClassName = parentRuleset.runtimeRulesetName + "$" + name;
+        this.factClassName = parentRuleset.runtimeRulesetClassName + "$" + name;
         TCon factTypeConstructor = Types.con(parentRuleset.runtimeRulesetType.module, parentRuleset.runtimeRulesetType.name + "$" + name); 
         this.factType = Types.apply(factTypeConstructor, TVar.EMPTY_ARRAY);
         this.factTypeDesc = TypeDesc.forClass(factClassName);
@@ -126,6 +124,11 @@ public class CHRConstraint extends Symbol implements CHRRelation {
         
         if(context.module != null) // for unit testing
             context.module.addTypeDescriptor(factTypeConstructor.name, new StandardTypeConstructor(factTypeConstructor, TVar.EMPTY_ARRAY, factTypeDesc));
+        
+        // next container
+        if(parentRuleset.extensible) {
+            nextContainerFieldName = CHRCodeGenerationConstants.nextContainerName(name);
+        }
     }
 
     @Override
@@ -161,11 +164,11 @@ public class CHRConstraint extends Symbol implements CHRRelation {
         Constant accessIndex;
         if(indexMask == 0) {
             accessIndex = new CallJava(TVar.EMPTY_ARRAY, Types.PROC, factType, new Type[] {parentRuleset.runtimeRulesetType},
-                    null, new FieldRef(parentRuleset.runtimeRulesetName, name + "$" + indexName, factTypeDesc), null);
+                    null, new FieldRef(parentRuleset.runtimeRulesetClassName, name + "$" + indexName, factTypeDesc), null);
         }
         else {
             Type[] keyTypes = keyTypeList.toArray(new Type[keyTypeList.size()]);
-            accessIndex = new JavaMethod(true, parentRuleset.runtimeRulesetName, name + "$" + indexName, Types.PROC, factType, keyTypes);
+            accessIndex = new JavaMethod(true, parentRuleset.runtimeRulesetClassName, name + "$" + indexName, Types.PROC, factType, keyTypes);
         }
         return new IndexInfo(
                 indexMask,
@@ -176,13 +179,17 @@ public class CHRConstraint extends Symbol implements CHRRelation {
                 );
     }
     
-    public IVal fetchFromIndex(CompilationContext context, int boundMask) {
+    public IndexInfo getOrCreateIndex(CompilationContext context, int boundMask) {
         IndexInfo indexInfo = indices.get(boundMask);
         if(indexInfo == null) {
             indexInfo = createIndexInfo(context, boundMask);
             indices.put(boundMask, indexInfo);
         }
-        return indexInfo.firstFact;
+        return indexInfo;
+    }
+    
+    public IVal fetchFromIndex(CompilationContext context, int boundMask) {
+        return getOrCreateIndex(context, boundMask).firstFact;
     }
 
     public Constant nextElement(CompilationContext context, int boundMask) {
@@ -191,7 +198,7 @@ public class CHRConstraint extends Symbol implements CHRRelation {
             indexInfo = createIndexInfo(context, boundMask);
             indices.put(boundMask, indexInfo);
         }
-        return indexInfo.nextFact;
+        return getOrCreateIndex(context, boundMask).nextFact;
     }