]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIf.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EIf.java
1 package org.simantics.scl.compiler.elaboration.expressions;\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.ReplaceContext;\r
8 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
9 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
10 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
11 import org.simantics.scl.compiler.environment.Environment;\r
12 import org.simantics.scl.compiler.errors.Locations;\r
13 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
14 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
15 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
16 import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
17 import org.simantics.scl.compiler.internal.interpreted.IIf;\r
18 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
19 import org.simantics.scl.compiler.types.Type;\r
20 import org.simantics.scl.compiler.types.Types;\r
21 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
22 \r
23 public class EIf extends Expression {\r
24     public Expression condition;\r
25     public Expression then_;\r
26     public Expression else_;\r
27     \r
28     public EIf(Expression condition, Expression then_, Expression else_) {\r
29         this.condition = condition;\r
30         this.then_ = then_;\r
31         this.else_ = else_;\r
32     }\r
33 \r
34     public EIf(long loc, Expression condition, Expression then_, Expression else_) {\r
35         super(loc);\r
36         this.condition = condition;\r
37         this.then_ = then_;\r
38         this.else_ = else_;\r
39     }\r
40 \r
41         public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {\r
42         condition.collectRefs(allRefs, refs);\r
43         then_.collectRefs(allRefs, refs);\r
44         else_.collectRefs(allRefs, refs);\r
45     }\r
46 \r
47         @Override\r
48         public void collectVars(TObjectIntHashMap<Variable> allVars,\r
49                 TIntHashSet vars) {\r
50             condition.collectVars(allVars, vars);\r
51         then_.collectVars(allVars, vars);\r
52         else_.collectVars(allVars, vars);\r
53         }\r
54 \r
55         @Override\r
56         protected void updateType() throws MatchException {\r
57             setType(then_.getType());\r
58         }\r
59         \r
60         @Override\r
61         public IVal toVal(Environment env, CodeWriter w) {\r
62         IVal conditionVal = condition.toVal(env, w); \r
63         \r
64         CodeWriter thenBlock = w.createBlock();\r
65         CodeWriter elseBlock = w.createBlock();\r
66         \r
67         CodeWriter joinPoint = w.createBlock(getType());\r
68         \r
69         w.if_(conditionVal, thenBlock.getContinuation(), elseBlock.getContinuation());\r
70         \r
71         IVal thenVal = then_.toVal(env, thenBlock);\r
72         thenBlock.jump(joinPoint.getContinuation(), thenVal);\r
73         \r
74         IVal elseVal = else_.toVal(env, elseBlock);\r
75         elseBlock.jump(joinPoint.getContinuation(), elseVal);\r
76         \r
77         w.continueAs(joinPoint);\r
78         \r
79         return w.getParameters()[0];\r
80     }\r
81 \r
82     @Override\r
83     public void collectFreeVariables(THashSet<Variable> vars) {\r
84         condition.collectFreeVariables(vars);\r
85         then_.collectFreeVariables(vars);\r
86         else_.collectFreeVariables(vars);\r
87     }\r
88 \r
89     @Override\r
90     public Expression simplify(SimplificationContext context) {\r
91         condition = condition.simplify(context);\r
92         then_ = then_.simplify(context);\r
93         else_ = else_.simplify(context);\r
94         return this;\r
95     }\r
96 \r
97     @Override\r
98     public Expression resolve(TranslationContext context) {\r
99         condition = condition.resolve(context);\r
100         then_ = then_.resolve(context);\r
101         else_ = else_.resolve(context);\r
102         return this;\r
103     }\r
104 \r
105     @Override\r
106     public Expression replace(ReplaceContext context) {\r
107         return new EIf(condition.replace(context), \r
108                 then_.replace(context), \r
109                 else_.replace(context));\r
110     }\r
111     \r
112     @Override\r
113     public Expression checkBasicType(TypingContext context, Type requiredType) {\r
114         condition = condition.checkType(context, Types.BOOLEAN);\r
115         then_ = then_.checkType(context, requiredType);\r
116         else_ = else_.checkType(context, requiredType);\r
117         return this;\r
118     }\r
119     \r
120     @Override\r
121     public Expression decorate(ExpressionDecorator decorator) {\r
122         condition = condition.decorate(decorator);\r
123         then_ = then_.decorate(decorator);\r
124         else_ = else_.decorate(decorator);        \r
125         return decorator.decorate(this);\r
126     }\r
127     \r
128     @Override\r
129     public boolean isEffectful() {\r
130         return condition.isEffectful() || then_.isEffectful() || else_.isEffectful();\r
131     }\r
132 \r
133     @Override\r
134     public void collectEffects(THashSet<Type> effects) {\r
135         condition.collectEffects(effects);\r
136         then_.collectEffects(effects);\r
137         else_.collectEffects(effects);\r
138     }\r
139     \r
140     @Override\r
141     public void setLocationDeep(long loc) {\r
142         if(location == Locations.NO_LOCATION) {\r
143             location = loc;\r
144             condition.setLocationDeep(loc);\r
145             then_.setLocationDeep(loc);\r
146             else_.setLocationDeep(loc);\r
147         }\r
148     }\r
149     \r
150     @Override\r
151     public void accept(ExpressionVisitor visitor) {\r
152         visitor.visit(this);\r
153     }\r
154     \r
155     @Override\r
156     public IExpression toIExpression(ExpressionInterpretationContext target) {\r
157         return new IIf(condition.toIExpression(target), then_.toIExpression(target), else_.toIExpression(target));\r
158     }\r
159     \r
160     public Expression getCondition() {\r
161         return condition;\r
162     }\r
163     \r
164     public Expression getThen() {\r
165         return then_;\r
166     }\r
167     \r
168     public Expression getElse() {\r
169         return else_;\r
170     }\r
171 \r
172     @Override\r
173     public void forVariables(VariableProcedure procedure) {\r
174         condition.forVariables(procedure);\r
175         then_.forVariables(procedure);\r
176         else_.forVariables(procedure);\r
177     }\r
178     @Override\r
179     public Expression accept(ExpressionTransformer transformer) {\r
180         return transformer.transform(this);\r
181     }\r
182 \r
183 }\r