From bf3645905d5384d25b20e572803b6886c476e057 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 8 Jan 2016 21:27:39 +0000 Subject: Add support for String.equals --- .../zwobble/couscous/backends/python/PrimitiveMethods.java | 5 ++++- .../backends/python/ast/PythonBinaryOperation.java | 4 ++++ .../java/org/zwobble/couscous/interpreter/Evaluator.java | 2 +- .../interpreter/values/BooleanInterpreterValue.java | 3 +++ .../couscous/interpreter/values/InterpreterValues.java | 4 +++- .../interpreter/values/StringInterpreterValue.java | 14 ++++++++++---- 6 files changed, 25 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java index 054a359..5e3795c 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java @@ -41,7 +41,10 @@ public class PrimitiveMethods { .put("toLowerCase", (receiver, arguments) -> pythonCall(pythonAttributeAccess(receiver, "lower"), list())) - + + .put("equals", (receiver, arguments) -> + PythonBinaryOperation.pythonEq(receiver, arguments.get(0))) + .build(); private static final Map BOOLEAN_METHODS = diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBinaryOperation.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBinaryOperation.java index fb33626..8d6b9ce 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBinaryOperation.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBinaryOperation.java @@ -10,6 +10,10 @@ public class PythonBinaryOperation implements PythonExpressionNode { public static PythonExpressionNode pythonAdd(PythonExpressionNode left, PythonExpressionNode right) { return new PythonBinaryOperation("+", left, right); } + + public static PythonExpressionNode pythonEq(PythonExpressionNode left, PythonExpressionNode right) { + return new PythonBinaryOperation("==", left, right); + } private final String operator; private final PythonExpressionNode left; diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index c04cb3e..059f2ad 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -80,7 +80,7 @@ public class Evaluator implements ExpressionNodeMapper { List arguments = evalArguments(methodCall.getArguments()); MethodSignature signature = new MethodSignature( methodCall.getMethodName(), - eagerMap(arguments, argument -> argument.getType().getName())); + eagerMap(methodCall.getArguments(), argument -> argument.getType())); return type.callMethod(environment, receiver, signature, arguments); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java index 820c2b1..03a0289 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java @@ -7,6 +7,9 @@ import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; public final class BooleanInterpreterValue implements InterpreterValue { + public static final BooleanInterpreterValue TRUE = new BooleanInterpreterValue(true); + public static final BooleanInterpreterValue FALSE = new BooleanInterpreterValue(false); + private static final ConcreteType TYPE = ConcreteType.builder(BooleanInterpreterValue.class, "boolean") .method("negate", Collections.emptyList(), (environment, arguments) -> diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java index e06732a..14d1085 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/InterpreterValues.java @@ -9,7 +9,9 @@ import org.zwobble.couscous.values.UnitValue; public class InterpreterValues { public static final UnitInterpreterValue UNIT = UnitInterpreterValue.UNIT; - + public static final BooleanInterpreterValue FALSE = BooleanInterpreterValue.FALSE; + public static final BooleanInterpreterValue TRUE = BooleanInterpreterValue.TRUE; + public static InterpreterValue value(int value) { return new IntegerInterpreterValue(value); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java index 4fff53e..3aaa073 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java @@ -1,10 +1,7 @@ package org.zwobble.couscous.interpreter.values; import org.zwobble.couscous.interpreter.NoSuchField; -import org.zwobble.couscous.values.IntegerValue; -import org.zwobble.couscous.values.PrimitiveValue; -import org.zwobble.couscous.values.PrimitiveValues; -import org.zwobble.couscous.values.StringValue; +import org.zwobble.couscous.values.*; import java.util.Optional; @@ -29,6 +26,15 @@ public final class StringInterpreterValue implements InterpreterValue { .method("toLowerCase", list(), (environment, arguments) -> of(arguments.getReceiver().value.toLowerCase())) + .method("equals", list(ObjectValues.OBJECT), (environment, arguments) -> { + InterpreterValue right = arguments.get(0); + if (right instanceof StringInterpreterValue) { + return new BooleanInterpreterValue(arguments.getReceiver().value.equals(((StringInterpreterValue)right).value)); + } else { + return InterpreterValues.FALSE; + } + }) + .build(); private final String value; -- cgit v1.2.3