]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/chr/CHRCodeGenerator.java
Support for () type in CHR relations
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / chr / CHRCodeGenerator.java
index af06463bbe7a1672f2bb9fe2e8ea10e97b4b5aa7..c4842ea612a1ac23cf49b3d1ce4418d332715379 100644 (file)
@@ -57,8 +57,12 @@ public class CHRCodeGenerator {
             generateFact(storeClassBuilder, constraint, hashIndexInitializations);
         
         // Fields
-        for(int i=0;i<ruleset.parameterTypeDescs.length;++i)
-            storeClassBuilder.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "p" + i, ruleset.parameterTypeDescs[i]);
+        for(int i=0;i<ruleset.parameterTypeDescs.length;++i) {
+            TypeDesc typeDesc = ruleset.parameterTypeDescs[i];
+            if(typeDesc.equals(TypeDesc.VOID))
+                continue;
+            storeClassBuilder.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "p" + i, typeDesc);
+        }
         storeClassBuilder.addField(Opcodes.ACC_PUBLIC, "currentId", FACT_ID_TYPE);
         for(StoreInitialization ini : hashIndexInitializations)
             storeClassBuilder.addField(ini.access, ini.fieldName, ini.fieldType);
@@ -71,6 +75,9 @@ public class CHRCodeGenerator {
             mb.loadThis();
             mb.invokeConstructor(storeClassBuilder.getSuperClassName(), Constants.EMPTY_TYPEDESC_ARRAY);
             for(int i=0;i<ruleset.parameterTypeDescs.length;++i) {
+                TypeDesc typeDesc = ruleset.parameterTypeDescs[i];
+                if(typeDesc.equals(TypeDesc.VOID))
+                    continue;
                 mb.loadThis();
                 mb.loadLocal(mb.getParameter(i));
                 mb.storeField(ruleset.storeClassName, "p" + i, ruleset.parameterTypeDescs[i]);
@@ -136,8 +143,13 @@ public class CHRCodeGenerator {
          */
         TypeDesc[] parameterTypeDescs = jtt.toTypeDescs(constraint.parameterTypes);
         factClassBuilder.addField(Opcodes.ACC_PUBLIC, "id", FACT_ID_TYPE);
-        for(int i=0;i<constraint.parameterTypes.length;++i)
-            factClassBuilder.addField(Opcodes.ACC_PUBLIC, "c" + i, parameterTypeDescs[i]);
+        for(int i=0;i<constraint.parameterTypes.length;++i) {
+            TypeDesc typeDesc = parameterTypeDescs[i];
+            if(typeDesc.equals(TypeDesc.VOID))
+                continue;
+            if(parameterTypeDescs[i] != TypeDesc.VOID)
+                factClassBuilder.addField(Opcodes.ACC_PUBLIC, fieldName(i), typeDesc);
+        }
         
         for(IndexInfo indexInfo : constraint.getIndices()) {
             if(supportsRemoval)
@@ -191,9 +203,13 @@ public class CHRCodeGenerator {
                     int parameterId=0;
                     for(int i=0;i<constraint.parameterTypes.length;++i)
                         if(((indexInfo.indexMask>>i)&1)==1) {
-                            mb.loadLocal(tempFactVar);
-                            mb.loadLocal(mb.getParameter(parameterId++));
-                            mb.storeField(factClassName, "c"+i, parameterTypeDescs[i]);
+                            TypeDesc typeDesc = parameterTypeDescs[i];
+                            if(!typeDesc.equals(TypeDesc.VOID)) {
+                                mb.loadLocal(tempFactVar);
+                                mb.loadLocal(mb.getParameter(parameterId));
+                                mb.storeField(factClassName, fieldName(i), typeDesc);
+                            }
+                            ++parameterId;
                         }
 
                     mb.loadThis();
@@ -521,20 +537,26 @@ public class CHRCodeGenerator {
             //     this.c1 = c1;
             // }
             
-            TypeDesc[] constructorParameters = new TypeDesc[parameterTypeDescs.length+1];
-            constructorParameters[0] = FACT_ID_TYPE;
-            for(int i=0;i<parameterTypeDescs.length;++i)
-                constructorParameters[i+1] = parameterTypeDescs[i];
-            MethodBuilderBase mb = factClassBuilder.addConstructor(Opcodes.ACC_PUBLIC, constructorParameters);
+            ArrayList<TypeDesc> constructorParameters = new ArrayList<TypeDesc>(parameterTypeDescs.length+1);
+            constructorParameters.add(FACT_ID_TYPE);
+            for(TypeDesc typeDesc : parameterTypeDescs) {
+                if(typeDesc.equals(TypeDesc.VOID))
+                    continue;
+                constructorParameters.add(typeDesc);
+            }
+            MethodBuilderBase mb = factClassBuilder.addConstructor(Opcodes.ACC_PUBLIC, constructorParameters.toArray(new TypeDesc[constructorParameters.size()]));
             mb.loadThis();
             mb.invokeConstructor(factClassBuilder.getSuperClassName(), Constants.EMPTY_TYPEDESC_ARRAY);
             mb.loadThis();
             mb.loadLocal(mb.getParameter(0));
             mb.storeField(factClassName, "id", FACT_ID_TYPE);
-            for(int i=0;i<constraint.parameterTypes.length;++i) {
+            for(int i=0,parameterId=1;i<constraint.parameterTypes.length;++i) {
+                TypeDesc typeDesc = parameterTypeDescs[i];
+                if(typeDesc.equals(TypeDesc.VOID))
+                    continue;
                 mb.loadThis();
-                mb.loadLocal(mb.getParameter(i+1));
-                mb.storeField(factClassName, "c" + i, parameterTypeDescs[i]);
+                mb.loadLocal(mb.getParameter(parameterId++));
+                mb.storeField(factClassName, fieldName(i), typeDesc);
             }
             mb.returnVoid();
             mb.finish();
@@ -591,10 +613,10 @@ public class CHRCodeGenerator {
                     if(fieldTypeDesc.equals(TypeDesc.VOID))
                         continue;
                     mb.loadLocal(aVar);
-                    mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+                    mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
                     
                     mb.loadLocal(bVar);
-                    mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+                    mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
 
                     CodeBuilderUtils.equals(mb, fieldTypeDesc, failure);
                 }
@@ -630,7 +652,7 @@ public class CHRCodeGenerator {
                     if(fieldTypeDesc.equals(TypeDesc.VOID))
                         continue;
                     mb.loadLocal(factVar);
-                    mb.loadField(factClassName, "c"+i, fieldTypeDesc);
+                    mb.loadField(factClassName, fieldName(i), fieldTypeDesc);
                     CodeBuilderUtils.hashCode(mb, fieldTypeDesc);
                     mb.math(Opcodes.IXOR);
                     mb.loadConstant(16777619);
@@ -645,4 +667,8 @@ public class CHRCodeGenerator {
         
         return hashIndexClassBuilder;
     }
+    
+    public static String fieldName(int id) {
+        return "c" + id;
+    }
 }