]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstConjunction.java
(refs #7377) Refactoring CHR query parsing
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / ast / CHRAstConjunction.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstConjunction.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/ast/CHRAstConjunction.java
new file mode 100644 (file)
index 0000000..48f8ae7
--- /dev/null
@@ -0,0 +1,40 @@
+package org.simantics.scl.compiler.elaboration.chr.ast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
+import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
+
+public class CHRAstConjunction extends CHRAstQuery {
+    public List<CHRAstQuery> conjuncts;
+
+    public CHRAstConjunction(List<CHRAstQuery> conjuncts) {
+        this.conjuncts = conjuncts;
+    }
+    
+    @Override
+    public void accept(CHRAstQueryVisitor visitor) {
+        visitor.visit(this);
+    }
+    
+    public static CHRAstQuery conjunction(CHRAstQuery[] conjuncts) {
+        ArrayList<CHRAstQuery> result = new ArrayList<CHRAstQuery>(conjuncts.length);
+        for(CHRAstQuery conjunct : conjuncts) {
+            if(conjunct instanceof CHRAstConjunction)
+                result.addAll(((CHRAstConjunction)conjunct).conjuncts);
+            else
+                result.add(conjunct);
+        }
+        if(result.size() == 1)
+            return result.get(0);
+        else
+            return new CHRAstConjunction(result);
+    }
+
+    @Override
+    protected void translate(TranslationContext context, boolean isHead, ArrayList<CHRLiteral> literals) {
+        for(CHRAstQuery conjunct : conjuncts)
+            conjunct.translate(context, isHead, literals);
+    }
+}