]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java
a802a80accbc1ea64cda833701aa1788ad427f63
[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 collectVars(TObjectIntHashMap<Variable> allVars,
32             TIntHashSet vars) {
33         a.collectVars(allVars, vars);
34         b.collectVars(allVars, vars);
35     }
36
37     @Override
38     public void collectFreeVariables(THashSet<Variable> vars) {
39         b.collectFreeVariables(vars);
40         a.collectFreeVariables(vars);
41     }
42
43     @Override
44     public CompiledQualifier compile(SimplificationContext context) {
45         CompiledQualifier cA = a.compile(context);
46         CompiledQualifier cB = b.compile(context);      
47         
48         Variable x = new Variable("xTemp", cA.pattern.getType());
49         Variable y = new Variable("yTemp", cB.pattern.getType());
50         
51         Expression value = context.concatMap( 
52                 context.lambda(context.var(x), context.mapList(
53                         context.lambda(context.var(y), context.tuple(context.var(x), context.var(y))),
54                         context.match(context.var(x), cA.pattern, cB.value))), 
55                         cA.value);
56         /*try {
57             value.validateType(context.getEnvironment());
58         } catch (TypeValidationException e) {
59             e.printStackTrace();
60         }*/
61         return new CompiledQualifier(value, context.tuple(cA.pattern, cB.pattern));
62     }
63
64     @Override
65     public void resolve(TranslationContext context) {
66         a.resolve(context);
67         b.resolve(context);
68     }
69     
70     @Override
71     public void collectEffects(THashSet<Type> effects) {
72         a.collectEffects(effects);
73         b.collectEffects(effects);
74     }
75     
76     @Override
77     public void setLocationDeep(long loc) {
78         if(location == Locations.NO_LOCATION) {
79             location = loc;
80             a.setLocationDeep(loc);
81             b.setLocationDeep(loc);
82         }
83     }
84     
85     @Override
86     public void accept(ListQualifierVisitor visitor) {
87         visitor.visit(this);
88     }
89     
90     @Override
91     public ListQualifier accept(ListQualifierTransformer transformer) {
92         return transformer.transform(this);
93     }
94 }