diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-07-14 17:52:58 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-07-14 17:52:58 +0100 |
| commit | bf193128af596fd85b0cb52b0074a8a9abadbc20 (patch) | |
| tree | f70ea2d88a338992f16d64f0d3a1821f86b8d7f4 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | |
| parent | ced4460f8c80d78492c3ebbbfe85a48039a0a724 (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.java | 36 |
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) { |
