aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-11 21:33:25 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-11 21:33:25 +0000
commita34a00ba19f6ffb61762da4629b53b8a633f9d17 (patch)
tree6ae34a92c0dfe9a24df0b7e90da2da263a61f708 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parent6d02b3e3e6f8da9837a46efda4733bdd89e38aaf (diff)
Implement static constructor and fields in interpreter
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, 17 insertions, 19 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 6c40960..1d88c6b 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -55,8 +55,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
assignment.getTarget().accept(new AssignableExpressionNodeVisitor(){
@Override
public void visit(FieldAccessNode fieldAccess) {
- // TODO: handle static receiver
- InterpreterValue left = eval(((InstanceReceiver)fieldAccess.getLeft()).getExpression());
+ ReceiverValue left = evalReceiver(fieldAccess.getLeft());
left.setField(fieldAccess.getFieldName(), value);
}
@@ -91,24 +90,10 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
return evalReceiver(methodCall.getReceiver())
.callMethod(environment, signature, arguments);
}
-
- private ReceiverValue evalReceiver(Receiver receiver) {
- return receiver.accept(new Receiver.Mapper<ReceiverValue>() {
- @Override
- public ReceiverValue visit(ExpressionNode receiver) {
- return new InstanceReceiverValue(eval(receiver));
- }
-
- @Override
- public ReceiverValue visit(TypeName receiver) {
- return new StaticReceiverValue(environment.findClass(receiver));
- }
- });
- }
@Override
public InterpreterValue visit(ConstructorCallNode call) {
- ConcreteType clazz = environment.findClass(call.getType());
+ StaticReceiverValue clazz = environment.findClass(call.getType());
List<InterpreterValue> arguments = evalArguments(call.getArguments());
return clazz.callConstructor(environment, arguments);
}
@@ -120,8 +105,7 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
@Override
public InterpreterValue visit(FieldAccessNode fieldAccess) {
- // TODO: handle static receiver
- InterpreterValue left = eval(((InstanceReceiver)fieldAccess.getLeft()).getExpression());
+ ReceiverValue left = evalReceiver(fieldAccess.getLeft());
return left.getField(fieldAccess.getFieldName());
}
@@ -173,4 +157,18 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
.map(argument -> eval(argument))
.collect(Collectors.toList());
}
+
+ private ReceiverValue evalReceiver(Receiver receiver) {
+ return receiver.accept(new Receiver.Mapper<ReceiverValue>() {
+ @Override
+ public ReceiverValue visit(ExpressionNode receiver) {
+ return new InstanceReceiverValue(eval(receiver));
+ }
+
+ @Override
+ public ReceiverValue visit(TypeName receiver) {
+ return environment.findClass(receiver);
+ }
+ });
+ }
} \ No newline at end of file