aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-14 17:52:58 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-14 17:52:58 +0100
commitbf193128af596fd85b0cb52b0074a8a9abadbc20 (patch)
treef70ea2d88a338992f16d64f0d3a1821f86b8d7f4 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parentced4460f8c80d78492c3ebbbfe85a48039a0a724 (diff)
Remove AssignableExpressionVisitor
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java36
1 files changed, 23 insertions, 13 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index d7da3b4..afcea8b 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -1,7 +1,7 @@
package org.zwobble.couscous.interpreter;
import org.zwobble.couscous.ast.*;
-import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor;
+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;
@@ -66,20 +66,30 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
@Override
public InterpreterValue visit(AssignmentNode assignment) {
InterpreterValue value = eval(assignment.getValue());
- assignment.getTarget().accept(new AssignableExpressionNodeVisitor(){
- @Override
- public void visit(FieldAccessNode fieldAccess) {
- ReceiverValue left = evalReceiver(fieldAccess.getLeft());
- left.setField(fieldAccess.getFieldName(), value);
- }
-
- @Override
- public void visit(VariableReferenceNode reference) {
- environment.put(reference.getReferentId(), value);
- }
- });
+ assignVisitor.instantiate(new Assign(value)).accept(assignment.getTarget());
return value;
}
+
+ private static final DynamicNodeVisitor<Assign> assignVisitor = DynamicNodeVisitor.build(
+ Assign.class, "visit"
+ );
+
+ public class Assign {
+ private final InterpreterValue value;
+
+ private Assign(InterpreterValue value) {
+ this.value = value;
+ }
+
+ public void visit(FieldAccessNode fieldAccess) {
+ ReceiverValue left = evalReceiver(fieldAccess.getLeft());
+ left.setField(fieldAccess.getFieldName(), value);
+ }
+
+ public void visit(VariableReferenceNode reference) {
+ environment.put(reference.getReferentId(), value);
+ }
+ }
@Override
public InterpreterValue visit(TernaryConditionalNode ternaryConditional) {