]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java
(refs #7375) Replaced forVariables by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / list / ListSeq.java
1 package org.simantics.scl.compiler.elaboration.expressions.list;
2
3 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
4 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
5 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
7 import org.simantics.scl.compiler.elaboration.expressions.Variable;
8 import org.simantics.scl.compiler.errors.Locations;
9 import org.simantics.scl.compiler.types.Type;
10
11 import gnu.trove.map.hash.TObjectIntHashMap;
12 import gnu.trove.set.hash.THashSet;
13 import gnu.trove.set.hash.TIntHashSet;
14
15 public class ListSeq extends ListQualifier {
16     public ListQualifier a;
17     public ListQualifier b;
18     
19     public ListSeq(ListQualifier a, ListQualifier b) {
20         this.a = a;
21         this.b = b;
22     }
23
24     @Override
25     public void checkType(TypingContext context) {
26         a.checkType(context);
27         b.checkType(context);  
28     }
29     
30     @Override
31     public void collectRefs(TObjectIntHashMap<Object> allRefs,
32             TIntHashSet refs) {
33         a.collectRefs(allRefs, refs);
34         b.collectRefs(allRefs, refs);
35     }
36
37     @Override
38     public void collectVars(TObjectIntHashMap<Variable> allVars,
39             TIntHashSet vars) {
40         a.collectVars(allVars, vars);
41         b.collectVars(allVars, vars);
42     }
43
44     @Override
45     public void collectFreeVariables(THashSet<Variable> vars) {
46         b.collectFreeVariables(vars);
47         a.collectFreeVariables(vars);
48     }
49
50     @Override
51     public CompiledQualifier compile(SimplificationContext context) {
52         CompiledQualifier cA = a.compile(context);
53         CompiledQualifier cB = b.compile(context);      
54         
55         Variable x = new Variable("xTemp", cA.pattern.getType());
56         Variable y = new Variable("yTemp", cB.pattern.getType());
57         
58         Expression value = context.concatMap( 
59                 context.lambda(context.var(x), context.mapList(
60                         context.lambda(context.var(y), context.tuple(context.var(x), context.var(y))),
61                         context.match(context.var(x), cA.pattern, cB.value))), 
62                         cA.value);
63         /*try {
64             value.validateType(context.getEnvironment());
65         } catch (TypeValidationException e) {
66             e.printStackTrace();
67         }*/
68         return new CompiledQualifier(value, context.tuple(cA.pattern, cB.pattern));
69     }
70
71     @Override
72     public void resolve(TranslationContext context) {
73         a.resolve(context);
74         b.resolve(context);
75     }
76     
77     @Override
78     public void collectEffects(THashSet<Type> effects) {
79         a.collectEffects(effects);
80         b.collectEffects(effects);
81     }
82     
83     @Override
84     public void setLocationDeep(long loc) {
85         if(location == Locations.NO_LOCATION) {
86             location = loc;
87             a.setLocationDeep(loc);
88             b.setLocationDeep(loc);
89         }
90     }
91     
92     @Override
93     public void accept(ListQualifierVisitor visitor) {
94         visitor.visit(this);
95     }
96     
97     @Override
98     public ListQualifier accept(ListQualifierTransformer transformer) {
99         return transformer.transform(this);
100     }
101 }