From 6d02b3e3e6f8da9837a46efda4733bdd89e38aaf Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 11 Feb 2016 21:04:34 +0000 Subject: Introduce ReceiverValue into interpreter --- .../org/zwobble/couscous/interpreter/Evaluator.java | 18 ++++++++++-------- .../interpreter/values/InstanceReceiverValue.java | 20 ++++++++++++++++++++ .../couscous/interpreter/values/ReceiverValue.java | 10 ++++++++++ .../interpreter/values/StaticReceiverValue.java | 19 +++++++++++++++++++ 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java create mode 100644 src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java create mode 100644 src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 68469fd..6c40960 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -88,18 +88,20 @@ public class Evaluator implements ExpressionNodeMapper { List arguments = evalArguments(methodCall.getArguments()); MethodSignature signature = methodCall.signature(); - return methodCall.getReceiver().accept(new Receiver.Mapper() { + return evalReceiver(methodCall.getReceiver()) + .callMethod(environment, signature, arguments); + } + + private ReceiverValue evalReceiver(Receiver receiver) { + return receiver.accept(new Receiver.Mapper() { @Override - public InterpreterValue visit(ExpressionNode receiverExpression) { - InterpreterValue receiver = eval(receiverExpression); - ConcreteType type = receiver.getType(); - return type.callMethod(environment, receiver, signature, arguments); + public ReceiverValue visit(ExpressionNode receiver) { + return new InstanceReceiverValue(eval(receiver)); } @Override - public InterpreterValue visit(TypeName receiver) { - ConcreteType clazz = environment.findClass(receiver); - return clazz.callStaticMethod(environment, signature, arguments); + public ReceiverValue visit(TypeName receiver) { + return new StaticReceiverValue(environment.findClass(receiver)); } }); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java new file mode 100644 index 0000000..3c3d932 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/values/InstanceReceiverValue.java @@ -0,0 +1,20 @@ +package org.zwobble.couscous.interpreter.values; + +import org.zwobble.couscous.ast.MethodSignature; +import org.zwobble.couscous.interpreter.Environment; + +import java.util.List; + +public class InstanceReceiverValue implements ReceiverValue { + private final InterpreterValue value; + + public InstanceReceiverValue(InterpreterValue value) { + this.value = value; + } + + @Override + public InterpreterValue callMethod(Environment environment, MethodSignature signature, List arguments) { + ConcreteType type = value.getType(); + return type.callMethod(environment, value, signature, arguments); + } +} diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java new file mode 100644 index 0000000..5b24f95 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ReceiverValue.java @@ -0,0 +1,10 @@ +package org.zwobble.couscous.interpreter.values; + +import org.zwobble.couscous.ast.MethodSignature; +import org.zwobble.couscous.interpreter.Environment; + +import java.util.List; + +public interface ReceiverValue { + InterpreterValue callMethod(Environment environment, MethodSignature signature, List arguments); +} diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java new file mode 100644 index 0000000..f7ce1f6 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/interpreter/values/StaticReceiverValue.java @@ -0,0 +1,19 @@ +package org.zwobble.couscous.interpreter.values; + +import org.zwobble.couscous.ast.MethodSignature; +import org.zwobble.couscous.interpreter.Environment; + +import java.util.List; + +public class StaticReceiverValue implements ReceiverValue { + private final ConcreteType type; + + public StaticReceiverValue(ConcreteType type) { + this.type = type; + } + + @Override + public InterpreterValue callMethod(Environment environment, MethodSignature signature, List arguments) { + return type.callStaticMethod(environment, signature, arguments); + } +} -- cgit v1.2.3