diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-11 21:33:25 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-11 21:33:25 +0000 |
| commit | a34a00ba19f6ffb61762da4629b53b8a633f9d17 (patch) | |
| tree | 6ae34a92c0dfe9a24df0b7e90da2da263a61f708 /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java | |
| parent | 6d02b3e3e6f8da9837a46efda4733bdd89e38aaf (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.java | 36 |
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 |
