]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java
Merge "List the unsatisfied dependencies in CanvasContext"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / ERealLiteral.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.elaboration.contexts.ReplaceContext;\r
9 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;\r
10 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;\r
11 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;\r
12 import org.simantics.scl.compiler.errors.ErrorLog;\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 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 ERealLiteral extends SimplifiableExpression {\r
24     public String value;\r
25     EVariable constraint;\r
26 \r
27     public ERealLiteral(String value) {\r
28         this.value = value;\r
29     }\r
30 \r
31     @Override\r
32     public void collectRefs(TObjectIntHashMap<Object> allRefs,\r
33             TIntHashSet refs) {\r
34     }\r
35 \r
36     @Override\r
37     public void collectVars(TObjectIntHashMap<Variable> allVars,\r
38             TIntHashSet vars) {\r
39     }\r
40 \r
41     private Expression tryToConvertToPrimitive(ErrorLog errorLog, Type requiredType) {\r
42         if(requiredType.equals(Types.DOUBLE))\r
43             return new ELiteral(new DoubleConstant(Double.parseDouble(value)));\r
44         else if(requiredType.equals(Types.FLOAT))\r
45             return new ELiteral(new FloatConstant(Float.parseFloat(value)));\r
46         else if(requiredType.equals(Types.INTEGER)) {\r
47             errorLog.log(location, "Cannot convert real literal to Integer.");\r
48             return new EError();\r
49         }\r
50         else if(requiredType.equals(Types.LONG)) {\r
51             errorLog.log(location, "Cannot convert real literal to Long.");\r
52             return new EError();\r
53         }\r
54         else\r
55             return null;\r
56     }\r
57     \r
58     @Override\r
59     public Expression checkBasicType(TypingContext context, Type requiredType) {\r
60         requiredType = Types.canonical(requiredType);\r
61         Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), requiredType);\r
62         if(primitive != null)\r
63             return primitive;\r
64         else {\r
65             setType(requiredType);        \r
66             constraint = new EVariable(location, null);\r
67             constraint.setType(Types.pred(Types.REAL, requiredType));\r
68             context.addConstraintDemand(constraint);\r
69             return this;\r
70         }\r
71     }\r
72 \r
73     @Override\r
74     protected void updateType() throws MatchException {\r
75         throw new InternalCompilerError("TODO");\r
76     }\r
77     \r
78     @Override\r
79     public void collectFreeVariables(THashSet<Variable> vars) {\r
80     }\r
81 \r
82     @Override\r
83     public Expression simplify(SimplificationContext context) {\r
84         Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), getType());\r
85         if(primitive != null)\r
86             return primitive;\r
87         return context.apply(\r
88                 context.getConstant(Names.Prelude_fromDouble, getType()),\r
89                 constraint.simplify(context),\r
90                 context.literal(new DoubleConstant(Double.parseDouble(value)))\r
91                 );\r
92     }\r
93 \r
94     @Override\r
95     public Expression resolve(TranslationContext context) {\r
96         return this;\r
97     }\r
98     \r
99     @Override\r
100     public Expression resolveAsPattern(TranslationContext context) {\r
101         return new ELiteral(new DoubleConstant(Double.parseDouble(value)));\r
102     }\r
103     \r
104     @Override\r
105     public Expression replace(ReplaceContext context) {\r
106         ERealLiteral copy = new ERealLiteral(value);\r
107         copy.setType(getType().replace(context.tvarMap));\r
108         return copy;\r
109     }\r
110     \r
111     @Override\r
112     public Expression decorate(ExpressionDecorator decorator) {     \r
113         return decorator.decorate(this);\r
114     }\r
115 \r
116     @Override\r
117     public void collectEffects(THashSet<Type> effects) {\r
118     }\r
119     \r
120     @Override\r
121     public void setLocationDeep(long loc) {\r
122         if(location == Locations.NO_LOCATION) {\r
123             location = loc;\r
124             if(constraint != null)\r
125                 constraint.setLocationDeep(loc);\r
126         }\r
127     }\r
128     \r
129     @Override\r
130     public void accept(ExpressionVisitor visitor) {\r
131         visitor.visit(this);\r
132     }\r
133 \r
134     public String getValue() {\r
135         return value;\r
136     }\r
137 \r
138     @Override\r
139     public void forVariables(VariableProcedure procedure) {\r
140         if(constraint != null)\r
141             constraint.forVariables(procedure);\r
142     }\r
143     \r
144     @Override\r
145     public Expression accept(ExpressionTransformer transformer) {\r
146         return transformer.transform(this);\r
147     }\r
148 \r
149 }\r