]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIf.java
migrated to svn revision 33108
[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 org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
4 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
5 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
6 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
7 import org.simantics.scl.compiler.environment.Environment;\r
8 import org.simantics.scl.compiler.errors.Locations;\r
9 import org.simantics.scl.compiler.internal.codegen.references.IVal;\r
10 import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;\r
11 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
12 import org.simantics.scl.compiler.internal.interpreted.IExpression;\r
13 import org.simantics.scl.compiler.internal.interpreted.IIf;\r
14 import org.simantics.scl.compiler.top.ExpressionInterpretationContext;\r
15 import org.simantics.scl.compiler.types.Type;\r
16 import org.simantics.scl.compiler.types.Types;\r
17 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
18 \r
19 import gnu.trove.map.hash.TObjectIntHashMap;\r
20 import gnu.trove.set.hash.THashSet;\r
21 import gnu.trove.set.hash.TIntHashSet;\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 checkIgnoredType(TypingContext context) {\r
122         condition = condition.checkType(context, Types.BOOLEAN);\r
123         then_ = then_.checkIgnoredType(context);\r
124         else_ = else_.checkIgnoredType(context);\r
125         return this;\r
126     }\r
127     \r
128     @Override\r
129     public Expression decorate(ExpressionDecorator decorator) {\r
130         condition = condition.decorate(decorator);\r
131         then_ = then_.decorate(decorator);\r
132         else_ = else_.decorate(decorator);        \r
133         return decorator.decorate(this);\r
134     }\r
135     \r
136     @Override\r
137     public boolean isEffectful() {\r
138         return condition.isEffectful() || then_.isEffectful() || else_.isEffectful();\r
139     }\r
140 \r
141     @Override\r
142     public void collectEffects(THashSet<Type> effects) {\r
143         condition.collectEffects(effects);\r
144         then_.collectEffects(effects);\r
145         else_.collectEffects(effects);\r
146     }\r
147     \r
148     @Override\r
149     public void setLocationDeep(long loc) {\r
150         if(location == Locations.NO_LOCATION) {\r
151             location = loc;\r
152             condition.setLocationDeep(loc);\r
153             then_.setLocationDeep(loc);\r
154             else_.setLocationDeep(loc);\r
155         }\r
156     }\r
157     \r
158     @Override\r
159     public void accept(ExpressionVisitor visitor) {\r
160         visitor.visit(this);\r
161     }\r
162     \r
163     @Override\r
164     public IExpression toIExpression(ExpressionInterpretationContext target) {\r
165         return new IIf(condition.toIExpression(target), then_.toIExpression(target), else_.toIExpression(target));\r
166     }\r
167     \r
168     public Expression getCondition() {\r
169         return condition;\r
170     }\r
171     \r
172     public Expression getThen() {\r
173         return then_;\r
174     }\r
175     \r
176     public Expression getElse() {\r
177         return else_;\r
178     }\r
179 \r
180     @Override\r
181     public void forVariables(VariableProcedure procedure) {\r
182         condition.forVariables(procedure);\r
183         then_.forVariables(procedure);\r
184         else_.forVariables(procedure);\r
185     }\r
186     @Override\r
187     public Expression accept(ExpressionTransformer transformer) {\r
188         return transformer.transform(this);\r
189     }\r
190 \r
191 }\r