aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-09-30 18:55:40 +0100
committerMichael Williamson <mike@zwobble.org>2015-09-30 18:55:40 +0100
commitd635b2b3870717e4af475e1349765f75878eadcf (patch)
tree7185c4974191766250e9c4e849c4f9016224efeb /src/main
parentcf12234c6f3d022c5e0882a26e6cfd39b45e0abf (diff)
Allow arguments to be passed to methods
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java9
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java8
-rw-r--r--src/main/java/org/zwobble/couscous/values/BooleanValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/values/IntegerValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/values/InterpreterValue.java4
-rw-r--r--src/main/java/org/zwobble/couscous/values/StringValue.java9
-rw-r--r--src/main/java/org/zwobble/couscous/values/UnitValue.java4
7 files changed, 34 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index 55249a3..09058fc 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -1,16 +1,21 @@
package org.zwobble.couscous.ast;
+import java.util.List;
+
import org.zwobble.couscous.ast.visitors.ExpressionNodeVisitor;
+import static java.util.Arrays.asList;
+
import lombok.Value;
@Value
public class MethodCallNode implements ExpressionNode {
ExpressionNode receiver;
String methodName;
+ List<ExpressionNode> arguments;
- public static MethodCallNode methodCall(ExpressionNode receiver, String methodName) {
- return new MethodCallNode(receiver, methodName);
+ public static MethodCallNode methodCall(ExpressionNode receiver, String methodName, ExpressionNode... arguments) {
+ return new MethodCallNode(receiver, methodName, asList(arguments));
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 54a1f60..7a57137 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.interpreter;
+import java.util.stream.Collectors;
+
import org.zwobble.couscous.ast.Assignment;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.LiteralNode;
@@ -59,7 +61,11 @@ public class Evaluator implements ExpressionNodeVisitor<InterpreterValue> {
@Override
public InterpreterValue visit(MethodCallNode methodCall) {
val receiver = eval(methodCall.getReceiver());
+ val arguments = methodCall.getArguments()
+ .stream()
+ .map(argument -> eval(argument))
+ .collect(Collectors.toList());
// TODO: handle missing methods
- return receiver.callMethod(methodCall.getMethodName());
+ return receiver.callMethod(methodCall.getMethodName(), arguments);
}
}
diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
index e6998df..dd8cd39 100644
--- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java
+++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.values;
+import java.util.List;
+
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Value;
@@ -14,7 +16,7 @@ public class BooleanValue implements InterpreterValue {
}
@Override
- public InterpreterValue callMethod(String methodName) {
+ public InterpreterValue callMethod(String methodName, List<InterpreterValue> arguments) {
throw new UnsupportedOperationException();
}
}
diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
index 2bb28d8..acc0c56 100644
--- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java
+++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.values;
+import java.util.List;
+
import lombok.Value;
@Value
@@ -7,7 +9,7 @@ public class IntegerValue implements InterpreterValue {
int value;
@Override
- public InterpreterValue callMethod(String methodName) {
+ public InterpreterValue callMethod(String methodName, List<InterpreterValue> arguments) {
throw new UnsupportedOperationException();
}
}
diff --git a/src/main/java/org/zwobble/couscous/values/InterpreterValue.java b/src/main/java/org/zwobble/couscous/values/InterpreterValue.java
index 7ffebbc..6162aaa 100644
--- a/src/main/java/org/zwobble/couscous/values/InterpreterValue.java
+++ b/src/main/java/org/zwobble/couscous/values/InterpreterValue.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.values;
+import java.util.List;
+
public interface InterpreterValue {
- InterpreterValue callMethod(String methodName);
+ InterpreterValue callMethod(String methodName, List<InterpreterValue> arguments);
}
diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java
index 0e3f626..3a1a13d 100644
--- a/src/main/java/org/zwobble/couscous/values/StringValue.java
+++ b/src/main/java/org/zwobble/couscous/values/StringValue.java
@@ -1,15 +1,22 @@
package org.zwobble.couscous.values;
+import java.util.List;
+
import lombok.Value;
+import lombok.val;
@Value
public class StringValue implements InterpreterValue {
String value;
@Override
- public InterpreterValue callMethod(String methodName) {
+ public InterpreterValue callMethod(String methodName, List<InterpreterValue> arguments) {
if (methodName == "length") {
return new IntegerValue(value.length());
+ } else if (methodName == "substring") {
+ val startIndex = (IntegerValue)arguments.get(0);
+ val endIndex = (IntegerValue)arguments.get(1);
+ return new StringValue(value.substring(startIndex.getValue(), endIndex.getValue()));
} else {
throw new UnsupportedOperationException();
}
diff --git a/src/main/java/org/zwobble/couscous/values/UnitValue.java b/src/main/java/org/zwobble/couscous/values/UnitValue.java
index 45178dd..030fb03 100644
--- a/src/main/java/org/zwobble/couscous/values/UnitValue.java
+++ b/src/main/java/org/zwobble/couscous/values/UnitValue.java
@@ -1,5 +1,7 @@
package org.zwobble.couscous.values;
+import java.util.List;
+
import lombok.ToString;
@ToString
@@ -10,7 +12,7 @@ public class UnitValue implements InterpreterValue {
}
@Override
- public InterpreterValue callMethod(String methodName) {
+ public InterpreterValue callMethod(String methodName, List<InterpreterValue> arguments) {
throw new UnsupportedOperationException();
}
}