]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/list/ListSeq.java
6bab8c91e0f52dba74b85b84ee7e40e076b6748b
[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
10 import gnu.trove.map.hash.TObjectIntHashMap;
11 import gnu.trove.set.hash.TIntHashSet;
12
13 public class ListSeq extends ListQualifier {
14     public ListQualifier a;
15     public ListQualifier b;
16     
17     public ListSeq(ListQualifier a, ListQualifier b) {
18         this.a = a;
19         this.b = b;
20     }
21
22     @Override
23     public void checkType(TypingContext context) {
24         a.checkType(context);
25         b.checkType(context);  
26     }
27
28     @Override
29     public void collectVars(TObjectIntHashMap<Variable> allVars,
30             TIntHashSet vars) {
31         a.collectVars(allVars, vars);
32         b.collectVars(allVars, vars);
33     }
34
35     @Override
36     public CompiledQualifier compile(SimplificationContext context) {
37         CompiledQualifier cA = a.compile(context);
38         CompiledQualifier cB = b.compile(context);      
39         
40         Variable x = new Variable("xTemp", cA.pattern.getType());
41         Variable y = new Variable("yTemp", cB.pattern.getType());
42         
43         Expression value = context.concatMap( 
44                 context.lambda(context.var(x), context.mapList(
45                         context.lambda(context.var(y), context.tuple(context.var(x), context.var(y))),
46                         context.match(context.var(x), cA.pattern, cB.value))), 
47                         cA.value);
48         /*try {
49             value.validateType(context.getEnvironment());
50         } catch (TypeValidationException e) {
51             e.printStackTrace();
52         }*/
53         return new CompiledQualifier(value, context.tuple(cA.pattern, cB.pattern));
54     }
55
56     @Override
57     public void resolve(TranslationContext context) {
58         a.resolve(context);
59         b.resolve(context);
60     }
61     
62     @Override
63     public void setLocationDeep(long loc) {
64         if(location == Locations.NO_LOCATION) {
65             location = loc;
66             a.setLocationDeep(loc);
67             b.setLocationDeep(loc);
68         }
69     }
70     
71     @Override
72     public void accept(ListQualifierVisitor visitor) {
73         visitor.visit(this);
74     }
75     
76     @Override
77     public ListQualifier accept(ListQualifierTransformer transformer) {
78         return transformer.transform(this);
79     }
80 }