1 package org.simantics.scl.compiler.elaboration.expressions;
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;
18 import gnu.trove.map.hash.TObjectIntHashMap;
19 import gnu.trove.set.hash.THashSet;
20 import gnu.trove.set.hash.TIntHashSet;
22 public class ERealLiteral extends SimplifiableExpression {
26 public ERealLiteral(String value) {
31 public void collectVars(TObjectIntHashMap<Variable> allVars,
35 private Expression tryToConvertToPrimitive(ErrorLog errorLog, Type requiredType) {
36 if(requiredType.equals(Types.DOUBLE))
37 return new ELiteral(new DoubleConstant(Double.parseDouble(value)));
38 else if(requiredType.equals(Types.FLOAT))
39 return new ELiteral(new FloatConstant(Float.parseFloat(value)));
40 else if(requiredType.equals(Types.INTEGER)) {
41 errorLog.log(location, "Cannot convert real literal to Integer.");
44 else if(requiredType.equals(Types.LONG)) {
45 errorLog.log(location, "Cannot convert real literal to Long.");
53 public Expression checkBasicType(TypingContext context, Type requiredType) {
54 requiredType = Types.canonical(requiredType);
55 Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), requiredType);
59 setType(requiredType);
60 constraint = new EVariable(location, null);
61 constraint.setType(Types.pred(Types.REAL, requiredType));
62 context.addConstraintDemand(constraint);
68 protected void updateType() throws MatchException {
69 throw new InternalCompilerError("TODO");
73 public void collectFreeVariables(THashSet<Variable> vars) {
77 public Expression simplify(SimplificationContext context) {
78 Expression primitive = tryToConvertToPrimitive(context.getErrorLog(), getType());
82 context.getConstant(Names.Prelude_fromDouble, getType()),
83 constraint.simplify(context),
84 context.literal(new DoubleConstant(Double.parseDouble(value)))
89 public Expression resolve(TranslationContext context) {
94 public Expression resolveAsPattern(TranslationContext context) {
95 return new ELiteral(new DoubleConstant(Double.parseDouble(value)));
99 public Expression replace(ReplaceContext context) {
100 ERealLiteral copy = new ERealLiteral(value);
101 copy.setType(getType().replace(context.tvarMap));
106 public void collectEffects(THashSet<Type> effects) {
110 public void setLocationDeep(long loc) {
111 if(location == Locations.NO_LOCATION) {
113 if(constraint != null)
114 constraint.setLocationDeep(loc);
119 public void accept(ExpressionVisitor visitor) {
123 public String getValue() {
128 public Expression accept(ExpressionTransformer transformer) {
129 return transformer.transform(this);