aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AssignableExpressionNode.java3
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java10
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/AssignableExpressionNodeVisitor.java9
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java36
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) {