diff options
Diffstat (limited to 'src/main/java/org')
5 files changed, 25 insertions, 39 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/AssignableExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/AssignableExpressionNode.java index eba641f..cc83de9 100644 --- a/src/main/java/org/zwobble/couscous/ast/AssignableExpressionNode.java +++ b/src/main/java/org/zwobble/couscous/ast/AssignableExpressionNode.java @@ -1,7 +1,4 @@ package org.zwobble.couscous.ast; -import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; - public interface AssignableExpressionNode extends ExpressionNode { - void accept(AssignableExpressionNodeVisitor mapper); } diff --git a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java index a6ef2dd..e4c422f 100644 --- a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java +++ b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java @@ -1,10 +1,9 @@ package org.zwobble.couscous.ast; -import org.zwobble.couscous.types.ScalarType; -import org.zwobble.couscous.types.Type; -import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; +import org.zwobble.couscous.types.ScalarType; +import org.zwobble.couscous.types.Type; import org.zwobble.couscous.util.ExtraIterables; import static org.zwobble.couscous.ast.InstanceReceiver.instanceReceiver; @@ -85,11 +84,6 @@ public class FieldAccessNode implements AssignableExpressionNode { } @Override - public void accept(AssignableExpressionNodeVisitor mapper) { - mapper.visit(this); - } - - @Override public String toString() { return "FieldAccessNode(left=" + left + ", fieldName=" + fieldName + ", type=" + type + ")"; diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java index 2fb65ef..96f2fdf 100644 --- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.identifiers.Identifier; import org.zwobble.couscous.types.Type; -import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.util.ExtraIterables; @@ -41,11 +40,6 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc } @Override - public void accept(AssignableExpressionNodeVisitor mapper) { - mapper.visit(this); - } - - @Override public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); } diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/AssignableExpressionNodeVisitor.java b/src/main/java/org/zwobble/couscous/ast/visitors/AssignableExpressionNodeVisitor.java deleted file mode 100644 index 57cb105..0000000 --- a/src/main/java/org/zwobble/couscous/ast/visitors/AssignableExpressionNodeVisitor.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.zwobble.couscous.ast.visitors; - -import org.zwobble.couscous.ast.FieldAccessNode; -import org.zwobble.couscous.ast.VariableReferenceNode; - -public interface AssignableExpressionNodeVisitor { - void visit(VariableReferenceNode reference); - void visit(FieldAccessNode fieldAccess); -} 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) { |
