diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-31 16:07:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-31 16:07:19 +0000 |
| commit | ad4903f04c757779b2e9a875298ef8418cb140b4 (patch) | |
| tree | 49c28509587633d484e6fbcdd8537e15e854a567 /src/main/java/org/zwobble/couscous/interpreter | |
| parent | 4e13a3a626f630eb1031f32b1c3405cbf40952bc (diff) | |
Support equality on reference types
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter')
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(); +} |
