diff options
Diffstat (limited to 'src/main/java')
4 files changed, 59 insertions, 8 deletions
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<InterpreterValue> { List<InterpreterValue> arguments = evalArguments(methodCall.getArguments()); MethodSignature signature = methodCall.signature(); - return methodCall.getReceiver().accept(new Receiver.Mapper<InterpreterValue>() { + return evalReceiver(methodCall.getReceiver()) + .callMethod(environment, signature, arguments); + } + + private ReceiverValue evalReceiver(Receiver receiver) { + return receiver.accept(new Receiver.Mapper<ReceiverValue>() { @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<InterpreterValue> 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<InterpreterValue> 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<InterpreterValue> arguments) { + return type.callStaticMethod(environment, signature, arguments); + } +} |
