aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-31 16:07:19 +0000
committerMichael Williamson <mike@zwobble.org>2015-10-31 16:07:19 +0000
commitad4903f04c757779b2e9a875298ef8418cb140b4 (patch)
tree49c28509587633d484e6fbcdd8537e15e854a567 /src/main/java/org/zwobble/couscous/interpreter
parent4e13a3a626f630eb1031f32b1c3405cbf40952bc (diff)
Support equality on reference types
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Interpreter.java24
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/JavaProject.java6
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpeterValue.java14
3 files changed, 30 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
index e5f6482..95510cd 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java
@@ -2,14 +2,12 @@ package org.zwobble.couscous.interpreter;
import java.util.List;
import java.util.Optional;
-import java.util.stream.Collectors;
+
import org.zwobble.couscous.ast.TypeName;
-import org.zwobble.couscous.ast.ExpressionNode;
+import org.zwobble.couscous.interpreter.values.ConcreteType;
import org.zwobble.couscous.interpreter.values.InterpreterValue;
+
import com.google.common.collect.ImmutableMap;
-import static org.zwobble.couscous.ast.LiteralNode.literal;
-import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall;
-import static org.zwobble.couscous.interpreter.Evaluator.eval;
public class Interpreter {
private Project project;
@@ -19,14 +17,12 @@ public class Interpreter {
}
public InterpreterValue run(TypeName className, String methodName, List<InterpreterValue> arguments) {
- List<ExpressionNode> argumentExpressions = arguments.stream()
- .map(argument -> literal(argument.toPrimitiveValue().get()))
- .collect(Collectors.toList());
- return eval(
- new Environment(
- project,
- Optional.empty(),
- ImmutableMap.of()),
- staticMethodCall(className, methodName, argumentExpressions));
+ final Environment environment = new Environment(
+ project,
+ Optional.empty(),
+ ImmutableMap.of());
+
+ ConcreteType clazz = environment.findClass(className);
+ return clazz.callStaticMethod(environment, methodName, arguments);
}
} \ No newline at end of file
diff --git a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
index e6b6df1..50e4508 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java
@@ -5,12 +5,18 @@ import java.util.List;
import org.zwobble.couscous.ast.ClassNode;
import org.zwobble.couscous.interpreter.values.BoxedIntegerInterpreterValue;
import org.zwobble.couscous.interpreter.values.ConcreteType;
+import org.zwobble.couscous.interpreter.values.InternalCouscousInterpeterValue;
import com.google.common.collect.Iterables;
public class JavaProject {
+ private static final ConcreteType OBJECT_TYPE = ConcreteType.classBuilder("java.lang.Object")
+ .build();
+
public static MapBackedProject.Builder builder() {
return MapBackedProject.builder()
+ .addClass(InternalCouscousInterpeterValue.TYPE)
+ .addClass(OBJECT_TYPE)
.addClass(BoxedIntegerInterpreterValue.TYPE);
}
diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpeterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpeterValue.java
new file mode 100644
index 0000000..30645d6
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpeterValue.java
@@ -0,0 +1,14 @@
+package org.zwobble.couscous.interpreter.values;
+
+import org.zwobble.couscous.values.ObjectValue;
+
+import static java.util.Arrays.asList;
+
+public class InternalCouscousInterpeterValue {
+ public static final ConcreteType TYPE = ConcreteType.classBuilder("_couscous")
+ .staticMethod("same", asList(ObjectValue.REF, ObjectValue.REF),
+ (environment, arguments) ->
+ new BooleanInterpreterValue(arguments.get(0) == arguments.get(1)))
+
+ .build();
+}