diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index bee536a..910cba7 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -4,6 +4,8 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.interpreter.values.*; +import org.zwobble.couscous.values.BooleanValue; +import org.zwobble.couscous.values.IntegerValue; import java.util.List; import java.util.stream.Collectors; @@ -102,15 +104,35 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { // TODO: check that the type coercion is valid // TODO: boxing booleans InterpreterValue value = eval(typeCoercion.getExpression()); - if (typeCoercion.isIntegerBox()) { + if (isIntegerBox(typeCoercion)) { return ((IntegerInterpreterValue)value).box(); - } else if (typeCoercion.isIntegerUnbox()) { + } else if (isIntegerUnbox(typeCoercion)) { return value.getField("value"); } else { return value; } } + private static boolean isIntegerBox(TypeCoercionNode typeCoercion) { + return typeCoercion.getExpression().getType().equals(IntegerValue.REF) && + !typeCoercion.getType().equals(IntegerValue.REF); + } + + private static boolean isIntegerUnbox(TypeCoercionNode typeCoercion) { + return !typeCoercion.getExpression().getType().equals(IntegerValue.REF) && + typeCoercion.getType().equals(IntegerValue.REF); + } + + private static boolean isBooleanBox(TypeCoercionNode typeCoercion) { + return typeCoercion.getExpression().getType().equals(BooleanValue.REF) && + !typeCoercion.getType().equals(BooleanValue.REF); + } + + private static boolean isBooleanUnbox(TypeCoercionNode typeCoercion) { + return !typeCoercion.getExpression().getType().equals(BooleanValue.REF) && + typeCoercion.getType().equals(BooleanValue.REF); + } + private List<InterpreterValue> evalArguments(List<? extends ExpressionNode> arguments) { return arguments.stream() .map(argument -> eval(argument)) |
