]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRLiteral.java
(refs #7601) Wildcard syntax for SCL records
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRLiteral.java
index 2697ea08fe287bc36c441e39c8ba738316346ba1..6bea58310c73b24dd8a0e841793252e09d926c53 100644 (file)
@@ -5,6 +5,7 @@ import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
 import org.simantics.scl.compiler.elaboration.chr.relations.ExternalCHRRelation;
 import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation;
 import org.simantics.scl.compiler.elaboration.chr.relations.UnresolvedCHRRelation;
+import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext.ExistentialFrame;
@@ -23,7 +24,6 @@ import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
 import gnu.trove.set.hash.TIntHashSet;
 
 public class CHRLiteral extends Symbol {
@@ -37,11 +37,11 @@ public class CHRLiteral extends Symbol {
     public boolean negated;
     public boolean passive = true;
     
-    public CHRLiteral(long location, CHRRelation relation, Expression[] parameters, boolean remove, boolean negated) {
+    public CHRLiteral(long location, CHRRelation relation, Expression[] parameters, boolean killAfterMatch, boolean negated) {
         this.location = location;
         this.relation = relation;
         this.parameters = parameters;
-        this.killAfterMatch = remove;
+        this.killAfterMatch = killAfterMatch;
         this.negated = negated;
     }
 
@@ -93,7 +93,7 @@ public class CHRLiteral extends Symbol {
                 context.getErrorLog().log(location, "Relation " + relation + " does not define field names.");
                 return;
             }
-            parameters = ERecord.translateFieldsToFunctionParameters(context, fields, fieldNames);
+            parameters = ERecord.translateFieldsToFunctionParameters(context, fields, fieldNames, true);
             if(parameters == null)
                 return;
             for(int i=0;i<parameters.length;++i) {
@@ -148,19 +148,6 @@ public class CHRLiteral extends Symbol {
                 parameter.collectVars(allVars, vars);
     }
 
-    public void collectFreeVariables(THashSet<Variable> vars) {
-        if(relation == SpecialCHRRelation.ASSIGN) {
-            parameters[1].collectFreeVariables(vars);
-        }
-        else {
-            for(Expression parameter : parameters)
-                parameter.collectFreeVariables(vars);
-            if(typeConstraintEvidenceParameters != null)
-                for(Expression parameter : typeConstraintEvidenceParameters)
-                    parameter.collectFreeVariables(vars);
-        }
-    }
-
     public void setLocationDeep(long loc) {
         if(location == Locations.NO_LOCATION) {
             this.location = loc;
@@ -184,11 +171,14 @@ public class CHRLiteral extends Symbol {
         return b.toString();
     }
 
-    public void collectQueryEffects(THashSet<Type> effects) {
-        // TODO
-    }
-
-    public void collectEnforceEffects(THashSet<Type> effects) {
-        // TODO
+    public CHRLiteral replace(ReplaceContext context) {
+        CHRLiteral copy = new CHRLiteral(location, relation, context.replace(parameters), killAfterMatch, negated);
+        for(int i=0;i<parameters.length;++i)
+            copy.parameters[i] = copy.parameters[i].replace(context);
+        copy.passive = passive;
+        copy.typeConstraintEvidenceParameters = context.replace(typeConstraintEvidenceParameters);
+        copy.typeParameters = context.replace(typeParameters);
+        copy.fields = context.replace(fields);
+        return copy;
     }
 }