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