]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRLiteral.java
index be34361c24ecdca939c654b9302257648655fd92..b34328a53ebb494d0586d331b712b9c361bcb6ab 100644 (file)
@@ -29,6 +29,7 @@ public class CHRLiteral extends Symbol {
     public CHRRelation relation;
     public Type[] typeParameters;
     public Expression[] parameters;
+    public Expression[] typeConstraintEvidenceParameters;
     public boolean killAfterMatch;
     public boolean negated;
     public boolean passive = true;
@@ -73,6 +74,9 @@ public class CHRLiteral extends Symbol {
     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
         for(Expression parameter : parameters)
             parameter.collectRefs(allRefs, refs);
+        if(typeConstraintEvidenceParameters != null)
+            for(Expression parameter : typeConstraintEvidenceParameters)
+                parameter.collectRefs(allRefs, refs);
     }
 
     public void checkType(TypingContext context) {
@@ -80,6 +84,7 @@ public class CHRLiteral extends Symbol {
             if(parameters.length != 1)
                 throw new InternalCompilerError("Wrong number of parameters for EXECUTE constraint.");
             parameters[0] = parameters[0].checkIgnoredType(context);
+            typeConstraintEvidenceParameters = Expression.EMPTY_ARRAY;
         }
         else {
             TVar[] typeVariables = relation.getTypeVariables();
@@ -92,22 +97,33 @@ public class CHRLiteral extends Symbol {
             else
                 for(int i=0;i<parameters.length;++i)
                     parameters[i] = parameters[i].checkType(context, parameterTypes[i]);
+            
+            typeConstraintEvidenceParameters = context.addConstraints(Types.replace(relation.getTypeConstraints(), typeVariables, typeParameters));
         }
     }
 
     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
         for(Expression parameter : parameters)
             parameter.collectVars(allVars, vars);
+        if(typeConstraintEvidenceParameters != null)
+            for(Expression parameter : typeConstraintEvidenceParameters)
+                parameter.collectVars(allVars, vars);
     }
 
     public void forVariables(VariableProcedure procedure) {
         for(Expression parameter : parameters)
             parameter.forVariables(procedure);
+        if(typeConstraintEvidenceParameters != null)
+            for(Expression parameter : typeConstraintEvidenceParameters)
+                parameter.forVariables(procedure);
     }
 
     public void collectFreeVariables(THashSet<Variable> vars) {
         for(Expression parameter : parameters)
             parameter.collectFreeVariables(vars);
+        if(typeConstraintEvidenceParameters != null)
+            for(Expression parameter : typeConstraintEvidenceParameters)
+                parameter.collectFreeVariables(vars);
     }
 
     public void setLocationDeep(long loc) {
@@ -121,6 +137,9 @@ public class CHRLiteral extends Symbol {
     public void simplify(SimplificationContext context) {
         for(int i=0;i<parameters.length;++i)
             parameters[i] = parameters[i].simplify(context);
+        if(typeConstraintEvidenceParameters != null)
+            for(int i=0;i<typeConstraintEvidenceParameters.length;++i)
+                typeConstraintEvidenceParameters[i] = typeConstraintEvidenceParameters[i].simplify(context);
     }
     
     public String toString() {