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