aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
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
parent15c67a851605262ef165279d99964ce8a53a45f5 (diff)
Remove ExpressionNodeMapper
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ArrayNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AssignmentNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/CastNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ExpressionNode.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/LiteralNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java6
-rw-r--r--src/main/java/org/zwobble/couscous/ast/OperationNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java19
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java32
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java27
17 files changed, 20 insertions, 156 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ArrayNode.java b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
index 1f3c8e3..784cb69 100644
--- a/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ArrayNode.java
@@ -1,6 +1,5 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.types.Types;
@@ -34,11 +33,6 @@ public class ArrayNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.ARRAY;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
index d41f629..e12c5dd 100644
--- a/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/AssignmentNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
@@ -42,11 +41,6 @@ public class AssignmentNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.ASSIGNMENT;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/CastNode.java b/src/main/java/org/zwobble/couscous/ast/CastNode.java
index d22bb63..02b2626 100644
--- a/src/main/java/org/zwobble/couscous/ast/CastNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/CastNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
public class CastNode implements ExpressionNode {
@@ -28,11 +27,6 @@ public class CastNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.CAST;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
index e9eabd6..2f9c44e 100644
--- a/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ConstructorCallNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import java.util.List;
@@ -35,11 +34,6 @@ public class ConstructorCallNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.CONSTRUCTOR_CALL;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
index 16a47e8..4a588d1 100644
--- a/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ExpressionNode.java
@@ -1,13 +1,9 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
import org.zwobble.couscous.types.Type;
public interface ExpressionNode extends Node {
Type getType();
- <T> T accept(ExpressionNodeMapper<T> visitor);
-
-
ExpressionNode transform(NodeTransformer transformer);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
index e4c422f..f3470ee 100644
--- a/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/FieldAccessNode.java
@@ -1,6 +1,5 @@
package org.zwobble.couscous.ast;
-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;
@@ -61,11 +60,6 @@ public class FieldAccessNode implements AssignableExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.FIELD_ACCESS;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java b/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
index f2dcc0b..ea4200d 100644
--- a/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/InstanceOfNode.java
@@ -1,6 +1,5 @@
package org.zwobble.couscous.ast;
-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;
@@ -30,11 +29,6 @@ public class InstanceOfNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.INSTANCE_OF;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
index b8d8735..1522c7f 100644
--- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java
@@ -1,6 +1,5 @@
package org.zwobble.couscous.ast;
-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;
@@ -55,11 +54,6 @@ public class LiteralNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.LITERAL;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index 381fb11..0d78c40 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -1,6 +1,5 @@
package org.zwobble.couscous.ast;
-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;
@@ -155,11 +154,6 @@ public class MethodCallNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.METHOD_CALL;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/OperationNode.java b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
index 44f2d1f..1a838bd 100644
--- a/src/main/java/org/zwobble/couscous/ast/OperationNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/OperationNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import java.util.List;
@@ -47,11 +46,6 @@ public class OperationNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.OPERATION;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
index 0d2ecda..979bd33 100644
--- a/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TernaryConditionalNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
public class TernaryConditionalNode implements ExpressionNode {
@@ -39,11 +38,6 @@ public class TernaryConditionalNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.TERNARY_CONDITIONAL;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
index 8da97e6..5b80b9c 100644
--- a/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/ThisReferenceNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
public class ThisReferenceNode implements ExpressionNode, ReferenceNode {
@@ -21,11 +20,6 @@ public class ThisReferenceNode implements ExpressionNode, ReferenceNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public <T> T accept(Visitor<T> visitor) {
return visitor.visit(this);
}
diff --git a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
index 9e4507d..1c8ee6e 100644
--- a/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/TypeCoercionNode.java
@@ -1,8 +1,7 @@
package org.zwobble.couscous.ast;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
import static org.zwobble.couscous.types.Types.concrete;
@@ -38,11 +37,6 @@ public class TypeCoercionNode implements ExpressionNode {
}
@Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
- @Override
public int type() {
return NodeTypes.TYPE_COERCION;
}
diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
index 96f2fdf..0763fc4 100644
--- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java
@@ -1,9 +1,8 @@
package org.zwobble.couscous.ast;
import org.zwobble.couscous.ast.identifiers.Identifier;
-import org.zwobble.couscous.types.Type;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
+import org.zwobble.couscous.types.Type;
import org.zwobble.couscous.util.ExtraIterables;
public class VariableReferenceNode implements AssignableExpressionNode, ReferenceNode {
@@ -25,11 +24,6 @@ public class VariableReferenceNode implements AssignableExpressionNode, Referenc
return referent;
}
- @Override
- public <T> T accept(ExpressionNodeMapper<T> visitor) {
- return visitor.visit(this);
- }
-
public Identifier getReferentId() {
return referent.getId();
}
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java b/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java
deleted file mode 100644
index acc972a..0000000
--- a/src/main/java/org/zwobble/couscous/ast/visitors/ExpressionNodeMapper.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.zwobble.couscous.ast.visitors;
-
-import org.zwobble.couscous.ast.*;
-
-public interface ExpressionNodeMapper<T> {
- T visit(LiteralNode literal);
- T visit(VariableReferenceNode variableReference);
- T visit(ThisReferenceNode reference);
- T visit(ArrayNode array);
- T visit(AssignmentNode assignment);
- T visit(TernaryConditionalNode ternaryConditional);
- T visit(MethodCallNode methodCall);
- T visit(ConstructorCallNode call);
- T visit(OperationNode operation);
- T visit(InstanceOfNode instanceOf);
- T visit(FieldAccessNode fieldAccess);
- T visit(TypeCoercionNode typeCoercion);
- T visit(CastNode cast);
-}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
index c520e2a..7b016bf 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -7,7 +7,6 @@ import com.google.common.collect.Iterators;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.structure.NodeStructure;
import org.zwobble.couscous.ast.visitors.DynamicNodeMapper;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
import org.zwobble.couscous.backends.naming.Names;
import org.zwobble.couscous.backends.python.ast.*;
import org.zwobble.couscous.types.ScalarType;
@@ -252,7 +251,7 @@ public class PythonCodeGenerator {
public PythonStatementNode visit(ExpressionStatementNode expressionStatement) {
if (expressionStatement.getExpression() instanceof AssignmentNode) {
AssignmentNode assignment = (AssignmentNode)expressionStatement.getExpression();
- return pythonAssignment(assignment.getTarget().accept(EXPRESSION_GENERATOR), generateExpression(assignment.getValue()));
+ return pythonAssignment(generateExpression(assignment.getTarget()), generateExpression(assignment.getValue()));
} else {
return pythonExpressionStatement(generateExpression(expressionStatement.getExpression()));
}
@@ -277,7 +276,7 @@ public class PythonCodeGenerator {
}
public static PythonExpressionNode generateExpression(ExpressionNode expression) {
- return expression.accept(EXPRESSION_GENERATOR);
+ return ExpressionGenerator.VISITOR.apply(expression);
}
private static List<PythonExpressionNode> generateExpressions(Iterable<? extends ExpressionNode> expressions) {
@@ -285,40 +284,32 @@ public class PythonCodeGenerator {
}
private static final ExpressionGenerator EXPRESSION_GENERATOR = new ExpressionGenerator();
- private static class ExpressionGenerator implements ExpressionNodeMapper<PythonExpressionNode> {
- @Override
+ public static class ExpressionGenerator {
+ private static final Function<Node, PythonExpressionNode> VISITOR =
+ DynamicNodeMapper.instantiate(new ExpressionGenerator(), "visit");
+
public PythonExpressionNode visit(LiteralNode literal) {
return generateCode(literal.getValue());
}
- @Override
public PythonVariableReferenceNode visit(VariableReferenceNode variableReference) {
return pythonVariableReference(variableReference.getReferent().getName());
}
- @Override
public PythonExpressionNode visit(ThisReferenceNode reference) {
return pythonVariableReference("self");
}
- @Override
public PythonExpressionNode visit(ArrayNode array) {
return pythonList(eagerMap(
array.getElements(),
PythonCodeGenerator::generateExpression));
}
- @Override
- public PythonExpressionNode visit(AssignmentNode assignment) {
- throw new UnsupportedOperationException();
- }
-
- @Override
public PythonExpressionNode visit(TernaryConditionalNode ternaryConditional) {
return pythonConditionalExpression(generateExpression(ternaryConditional.getCondition()), generateExpression(ternaryConditional.getIfTrue()), generateExpression(ternaryConditional.getIfFalse()));
}
- @Override
public PythonExpressionNode visit(MethodCallNode methodCall) {
PythonExpressionNode receiver = generateReceiver(methodCall.getReceiver());
List<PythonExpressionNode> arguments = generateExpressions(methodCall.getArguments());
@@ -347,7 +338,6 @@ public class PythonCodeGenerator {
});
}
- @Override
public PythonExpressionNode visit(ConstructorCallNode call) {
final Type className = call.getType();
final org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode classReference = typeReference(className);
@@ -355,23 +345,14 @@ public class PythonCodeGenerator {
return pythonCall(classReference, arguments);
}
- @Override
public PythonExpressionNode visit(OperationNode operation) {
return generateExpression(operation.desugar());
}
- @Override
- public PythonExpressionNode visit(InstanceOfNode instanceOf) {
- // TODO:
- throw new UnsupportedOperationException();
- }
-
- @Override
public PythonExpressionNode visit(FieldAccessNode fieldAccess) {
return pythonAttributeAccess(generateReceiver(fieldAccess.getLeft()), fieldAccess.getFieldName());
}
- @Override
public PythonExpressionNode visit(TypeCoercionNode typeCoercion) {
PythonExpressionNode value = generateExpression(typeCoercion.getExpression());
if (isIntegerBox(typeCoercion)) {
@@ -386,7 +367,6 @@ public class PythonCodeGenerator {
}
}
- @Override
public PythonExpressionNode visit(CastNode cast) {
// TODO: implement this properly
// Can't test this properly (i.e. in one test, rather than one per backend)
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())) {