aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-15 12:06:42 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-15 12:06:42 +0100
commit3be68289f34a37ac7f9e1e95fa0d95dfc1bb3836 (patch)
tree4047d657f89b54a07ffddb23de1f5336ffbea6d3 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parent15c67a851605262ef165279d99964ce8a53a45f5 (diff)
Remove ExpressionNodeMapper
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java27
1 files changed, 6 insertions, 21 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 75eeb76..dc23575 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -1,8 +1,8 @@
package org.zwobble.couscous.interpreter;
import org.zwobble.couscous.ast.*;
+import org.zwobble.couscous.ast.visitors.DynamicNodeMapper;
import org.zwobble.couscous.ast.visitors.DynamicNodeVisitor;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.interpreter.errors.ConditionMustBeBoolean;
import org.zwobble.couscous.interpreter.errors.InvalidCast;
import org.zwobble.couscous.interpreter.values.*;
@@ -13,6 +13,7 @@ import org.zwobble.couscous.types.Types;
import java.util.List;
import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
import java.util.stream.Collectors;
import static org.zwobble.couscous.types.Types.erasure;
@@ -20,7 +21,7 @@ import static org.zwobble.couscous.util.Casts.tryCast;
import static org.zwobble.couscous.util.ExtraLists.eagerMap;
import static org.zwobble.couscous.util.ExtraLists.list;
-public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
+public class Evaluator {
public static InterpreterValue eval(Environment environment, ExpressionNode expression) {
return new Evaluator(environment).eval(expression);
}
@@ -28,6 +29,8 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
public static boolean evalCondition(Environment environment, ExpressionNode expression) {
return new Evaluator(environment).evalCondition(expression);
}
+
+ private static final BiFunction<Node, Evaluator, InterpreterValue> EVAL = DynamicNodeMapper.visitor(Evaluator.class, "visit");
private final Environment environment;
@@ -36,20 +39,17 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
}
public InterpreterValue eval(ExpressionNode expression) {
- return expression.accept(this);
+ return EVAL.apply(expression, this);
}
- @Override
public InterpreterValue visit(LiteralNode literal) {
return InterpreterValues.value(literal.getValue());
}
- @Override
public InterpreterValue visit(VariableReferenceNode variableReference) {
return environment.get(variableReference.getReferentId());
}
- @Override
public InterpreterValue visit(ThisReferenceNode reference) {
InterpreterValue thisValue = environment.getThis().get();
// TODO: add a test for this
@@ -57,14 +57,12 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
return thisValue;
}
- @Override
public InterpreterValue visit(ArrayNode array) {
return new ArrayInterpreterValue(
array.getElementType(),
eagerMap(array.getElements(), this::eval));
}
- @Override
public InterpreterValue visit(AssignmentNode assignment) {
InterpreterValue value = eval(assignment.getValue());
AssignableExpressionVisitor.visit.accept(assignment.getTarget(), new AssignableExpressionVisitor() {
@@ -89,7 +87,6 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
void visit(FieldAccessNode node);
}
- @Override
public InterpreterValue visit(TernaryConditionalNode ternaryConditional) {
boolean condition = evalCondition(ternaryConditional.getCondition());
ExpressionNode branch = condition ? ternaryConditional.getIfTrue() : ternaryConditional.getIfFalse();
@@ -104,7 +101,6 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
return ((BooleanInterpreterValue)value).getValue();
}
- @Override
public InterpreterValue visit(MethodCallNode methodCall) {
List<InterpreterValue> arguments = evalArguments(methodCall.getArguments());
MethodSignature signature = methodCall.signature();
@@ -113,7 +109,6 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
.callMethod(environment, signature.generic(), new Arguments(list(), arguments));
}
- @Override
public InterpreterValue visit(ConstructorCallNode call) {
StaticReceiverValue clazz = environment.findClass(erasure(call.getType()));
List<InterpreterValue> arguments = evalArguments(call.getArguments());
@@ -123,24 +118,15 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
return clazz.callConstructor(environment, new Arguments(typeParameters, arguments));
}
- @Override
public InterpreterValue visit(OperationNode operation) {
return eval(operation.desugar());
}
- @Override
- public InterpreterValue visit(InstanceOfNode instanceOf) {
- // TODO:
- throw new UnsupportedOperationException();
- }
-
- @Override
public InterpreterValue visit(FieldAccessNode fieldAccess) {
ReceiverValue left = evalReceiver(fieldAccess.getLeft());
return left.getField(fieldAccess.getFieldName());
}
- @Override
public InterpreterValue visit(TypeCoercionNode typeCoercion) {
// TODO: check that the type coercion is valid
// TODO: boxing booleans
@@ -154,7 +140,6 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
}
}
- @Override
public InterpreterValue visit(CastNode cast) {
InterpreterValue value = eval(cast.getExpression());
if (!InterpreterTypes.isSubType(cast.getType(), value.getType())) {