]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ERealLiteral.java
(refs #7375) Replaced collectVars method by a visitor
[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;
2
3
4 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
5 import org.simantics.scl.compiler.common.names.Names;
6 import org.simantics.scl.compiler.constants.DoubleConstant;
7 import org.simantics.scl.compiler.constants.FloatConstant;
8 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
9 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
10 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
11 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
12 import org.simantics.scl.compiler.errors.ErrorLog;
13 import org.simantics.scl.compiler.errors.Locations;
14 import org.simantics.scl.compiler.types.Type;
15 import org.simantics.scl.compiler.types.Types;
16 import org.simantics.scl.compiler.types.exceptions.MatchException;
17
18 public class ERealLiteral extends SimplifiableExpression {
19     public String value;
20     public EVariable constraint;
21
22     public ERealLiteral(String value) {
23         this.value = value;
24     }
25
26     private Expression tryToConvertToPrimitive(ErrorLog errorLog, Type requiredType) {
27         if(requiredType.equals(Types.DOUBLE))
28             return new ELiteral(new DoubleConstant(Double.parseDouble(value)));
29         else if(requiredType.equals(Types.FLOAT))
30             return new ELiteral(new FloatConstant(Float.parseFloat(value)));
31         else if(requiredType.equals(Types.INTEGER)) {
32             errorLog.log(location, "Cannot convert real literal to Integer.");
33             return new EError();
34         }
35         else if(requiredType.equals(Types.LONG)) {
36             errorLog.log(location, "Cannot convert real literal to Long.");
37             return new EError();
38         }
39         else
40             return null;
41     }
42     
43     @Override
44     public Expression checkBasicType(TypingContext context, Type requiredType) {
45         requiredType = Types.canonical(requiredType);
46         Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), requiredType);
47         if(primitive != null)
48             return primitive;
49         else {
50             setType(requiredType);        
51             constraint = new EVariable(location, null);
52             constraint.setType(Types.pred(Types.REAL, requiredType));
53             context.addConstraintDemand(constraint);
54             return this;
55         }
56     }
57
58     @Override
59     protected void updateType() throws MatchException {
60         throw new InternalCompilerError("TODO");
61     }
62
63     @Override
64     public Expression simplify(SimplificationContext context) {
65         Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), getType());
66         if(primitive != null)
67             return primitive;
68         return context.apply(
69                 context.getConstant(Names.Prelude_fromDouble, getType()),
70                 constraint.simplify(context),
71                 context.literal(new DoubleConstant(Double.parseDouble(value)))
72                 );
73     }
74
75     @Override
76     public Expression resolve(TranslationContext context) {
77         return this;
78     }
79     
80     @Override
81     public Expression resolveAsPattern(TranslationContext context) {
82         return new ELiteral(new DoubleConstant(Double.parseDouble(value)));
83     }
84     
85     @Override
86     public Expression replace(ReplaceContext context) {
87         ERealLiteral copy = new ERealLiteral(value);
88         copy.setType(getType().replace(context.tvarMap));
89         return copy;
90     }
91     
92     @Override
93     public void setLocationDeep(long loc) {
94         if(location == Locations.NO_LOCATION) {
95             location = loc;
96             if(constraint != null)
97                 constraint.setLocationDeep(loc);
98         }
99     }
100     
101     @Override
102     public void accept(ExpressionVisitor visitor) {
103         visitor.visit(this);
104     }
105
106     public String getValue() {
107         return value;
108     }
109     
110     @Override
111     public Expression accept(ExpressionTransformer transformer) {
112         return transformer.transform(this);
113     }
114
115 }