]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/EIntegerLiteral.java
Merge "Re-enabled Acorn transaction cancellation support for testing"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / EIntegerLiteral.java
1 package org.simantics.scl.compiler.elaboration.expressions;\r
2 \r
3 \r
4 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
5 import org.simantics.scl.compiler.common.names.Names;\r
6 import org.simantics.scl.compiler.constants.DoubleConstant;\r
7 import org.simantics.scl.compiler.constants.FloatConstant;\r
8 import org.simantics.scl.compiler.constants.IntegerConstant;\r
9 import org.simantics.scl.compiler.constants.LongConstant;\r
10 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;\r
11 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
12 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
13 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
14 import org.simantics.scl.compiler.errors.Locations;\r
15 import org.simantics.scl.compiler.internal.elaboration.utils.ExpressionDecorator;\r
16 import org.simantics.scl.compiler.types.Type;\r
17 import org.simantics.scl.compiler.types.Types;\r
18 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
19 \r
20 import gnu.trove.map.hash.TObjectIntHashMap;\r
21 import gnu.trove.set.hash.THashSet;\r
22 import gnu.trove.set.hash.TIntHashSet;\r
23 \r
24 public class EIntegerLiteral extends SimplifiableExpression {\r
25     public String value;\r
26     EVariable constraint;\r
27 \r
28     public EIntegerLiteral(String value) {\r
29         this.value = value;\r
30     }\r
31 \r
32     @Override\r
33     public void collectRefs(TObjectIntHashMap<Object> allRefs,\r
34             TIntHashSet refs) {\r
35     }\r
36 \r
37     @Override\r
38     public void collectVars(TObjectIntHashMap<Variable> allVars,\r
39             TIntHashSet vars) {\r
40     }\r
41     \r
42     public String getValue() {\r
43         return value;\r
44     }\r
45     \r
46     private Expression tryToConvertToPrimitive(Type requiredType) {\r
47         if(requiredType.equals(Types.INTEGER))\r
48             return new ELiteral(new IntegerConstant(Integer.parseInt(value)));\r
49         else if(requiredType.equals(Types.DOUBLE))\r
50             return new ELiteral(new DoubleConstant(Double.parseDouble(value)));\r
51         else if(requiredType.equals(Types.FLOAT))\r
52             return new ELiteral(new FloatConstant(Float.parseFloat(value)));\r
53         else if(requiredType.equals(Types.LONG))\r
54             return new ELiteral(new LongConstant(Long.parseLong(value)));\r
55         else\r
56             return null;\r
57     }\r
58     \r
59     @Override\r
60     public Expression checkBasicType(TypingContext context, Type requiredType) {\r
61         requiredType = Types.canonical(requiredType);\r
62         \r
63         try {\r
64             Expression primitive = tryToConvertToPrimitive(requiredType);\r
65             if(primitive != null)\r
66                 return primitive;\r
67         } catch(NumberFormatException e) {\r
68             context.getErrorLog().log(getLocation(), "Invalid number format.");\r
69         }\r
70         \r
71         setType(requiredType);\r
72         constraint = new EVariable(location, null);\r
73         constraint.setType(Types.pred(Types.RING, requiredType));\r
74         context.addConstraintDemand(constraint);\r
75         return this;        \r
76     }\r
77     \r
78     @Override\r
79     protected void updateType() throws MatchException {\r
80         throw new InternalCompilerError();\r
81     }\r
82 \r
83     @Override\r
84     public void collectFreeVariables(THashSet<Variable> vars) {\r
85     }\r
86 \r
87     @Override\r
88     public Expression simplify(SimplificationContext context) {\r
89         try {\r
90             Expression primitive = tryToConvertToPrimitive(Types.canonical(getType()));\r
91             if(primitive != null)\r
92                 return primitive;\r
93             return context.apply(\r
94                     context.getConstant(Names.Prelude_fromInteger, getType()),\r
95                     constraint.simplify(context),\r
96                     context.literal(new IntegerConstant(Integer.parseInt(value)))\r
97                     );\r
98         } catch(NumberFormatException e) {\r
99             context.getErrorLog().log(getLocation(), "Invalid number format (maybe too long for the expected number type).");\r
100             return this;\r
101         }\r
102     }\r
103 \r
104     @Override\r
105     public Expression resolve(TranslationContext context) {\r
106         return this;\r
107     }\r
108     \r
109     @Override\r
110     public Expression resolveAsPattern(TranslationContext context) {\r
111         return this;\r
112     }\r
113     \r
114     @Override\r
115     public Expression replace(ReplaceContext context) {\r
116         EIntegerLiteral copy = new EIntegerLiteral(value);\r
117         copy.setType(getType().replace(context.tvarMap));\r
118         copy.constraint = (EVariable)constraint.replace(context);\r
119         return copy;\r
120     }\r
121 \r
122     @Override\r
123     public Expression decorate(ExpressionDecorator decorator) {     \r
124         return decorator.decorate(this);\r
125     }\r
126     \r
127     @Override\r
128     public boolean isEffectful() {\r
129         return false;\r
130     }\r
131 \r
132     @Override\r
133     public void collectEffects(THashSet<Type> effects) {\r
134     }\r
135     \r
136     @Override\r
137     public void setLocationDeep(long loc) {\r
138         if(location == Locations.NO_LOCATION) {\r
139             location = loc;\r
140             if(constraint != null)\r
141                 constraint.setLocationDeep(loc);\r
142         }\r
143     }\r
144     \r
145     @Override\r
146     public void accept(ExpressionVisitor visitor) {\r
147         visitor.visit(this);\r
148     }\r
149 \r
150     @Override\r
151     public void forVariables(VariableProcedure procedure) {\r
152         if(constraint != null)\r
153             constraint.forVariables(procedure);\r
154     }\r
155     \r
156     @Override\r
157     public boolean isPattern(int arity) {\r
158         return arity == 0;\r
159     }\r
160     \r
161     @Override\r
162     public Expression accept(ExpressionTransformer transformer) {\r
163         return transformer.transform(this);\r
164     }\r
165 \r
166 }\r