]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.elaboration.chr.ast;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
7 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
8
9 public class CHRAstConjunction extends CHRAstQuery {
10     public List<CHRAstQuery> conjuncts;
11
12     public CHRAstConjunction(List<CHRAstQuery> conjuncts) {
13         this.conjuncts = conjuncts;
14     }
15     
16     @Override
17     public void accept(CHRAstQueryVisitor visitor) {
18         visitor.visit(this);
19     }
20     
21     public static CHRAstQuery conjunction(CHRAstQuery[] conjuncts) {
22         ArrayList<CHRAstQuery> result = new ArrayList<CHRAstQuery>(conjuncts.length);
23         for(CHRAstQuery conjunct : conjuncts) {
24             if(conjunct instanceof CHRAstConjunction)
25                 result.addAll(((CHRAstConjunction)conjunct).conjuncts);
26             else
27                 result.add(conjunct);
28         }
29         if(result.size() == 1)
30             return result.get(0);
31         else
32             return new CHRAstConjunction(result);
33     }
34
35     @Override
36     protected void translate(TranslationContext context, boolean isHead, ArrayList<CHRLiteral> literals) {
37         for(CHRAstQuery conjunct : conjuncts)
38             conjunct.translate(context, isHead, literals);
39     }
40 }