aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-14 14:59:55 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-14 14:59:55 +0000
commit16f43313e816626d78fd172e27e7530dd6666b8a (patch)
tree114e65eb1c7e237774fb9f02b7a37806de603484
parentce1f94f4fe3d57bc4fc20f6a28297412a4e603f6 (diff)
Extract static methods for building operations
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java62
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java29
2 files changed, 73 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
index c2e0897..508a8f7 100644
--- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
+++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java
@@ -1,10 +1,14 @@
package org.zwobble.couscous.ast;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
+import org.zwobble.couscous.values.BooleanValue;
+import org.zwobble.couscous.values.IntegerValue;
+
import java.util.Collections;
import java.util.List;
-import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper;
-import org.zwobble.couscous.values.BooleanValue;
+import static java.util.Arrays.asList;
public class MethodCallNode implements ExpressionNode {
public static ExpressionNode not(ExpressionNode value) {
@@ -14,7 +18,59 @@ public class MethodCallNode implements ExpressionNode {
throw new IllegalArgumentException("Can only negate booleans");
}
}
-
+
+ public static ExpressionNode integerAdd(ExpressionNode left, ExpressionNode right) {
+ return integerOperation("add", left, right);
+ }
+
+ public static ExpressionNode integerSubtract(ExpressionNode left, ExpressionNode right) {
+ return integerOperation("subtract", left, right);
+ }
+
+ public static ExpressionNode integerMultiply(ExpressionNode left, ExpressionNode right) {
+ return integerOperation("multiply", left, right);
+ }
+
+ public static ExpressionNode integerDivide(ExpressionNode left, ExpressionNode right) {
+ return integerOperation("divide", left, right);
+ }
+
+ public static ExpressionNode integerMod(ExpressionNode left, ExpressionNode right) {
+ return integerOperation("mod", left, right);
+ }
+
+ private static MethodCallNode integerOperation(String methodName, ExpressionNode left, ExpressionNode right) {
+ return methodCall(left, methodName, asList(right), IntegerValue.REF);
+ }
+
+ public static ExpressionNode equal(ExpressionNode left, ExpressionNode right) {
+ return booleanOperation("equals", left, right);
+ }
+
+ public static ExpressionNode notEqual(ExpressionNode left, ExpressionNode right) {
+ return not(booleanOperation("equals", left, right));
+ }
+
+ public static ExpressionNode greaterThan(ExpressionNode left, ExpressionNode right) {
+ return booleanOperation("greaterThan", left, right);
+ }
+
+ public static ExpressionNode greaterThanOrEqual(ExpressionNode left, ExpressionNode right) {
+ return booleanOperation("greaterThanOrEqual", left, right);
+ }
+
+ public static ExpressionNode lessThan(ExpressionNode left, ExpressionNode right) {
+ return booleanOperation("lessThan", left, right);
+ }
+
+ public static ExpressionNode lessThanOrEqual(ExpressionNode left, ExpressionNode right) {
+ return booleanOperation("lessThanOrEqual", left, right);
+ }
+
+ private static ExpressionNode booleanOperation(String methodName, ExpressionNode left, ExpressionNode right) {
+ return methodCall(left, methodName, asList(right), BooleanValue.REF);
+ }
+
public static MethodCallNode methodCall(
ExpressionNode receiver,
String methodName,
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index af62c61..3f06f49 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -24,8 +24,7 @@ import static org.zwobble.couscous.ast.FieldAccessNode.fieldAccess;
import static org.zwobble.couscous.ast.FieldDeclarationNode.field;
import static org.zwobble.couscous.ast.IfStatementNode.ifStatement;
import static org.zwobble.couscous.ast.LiteralNode.literal;
-import static org.zwobble.couscous.ast.MethodCallNode.methodCall;
-import static org.zwobble.couscous.ast.MethodCallNode.not;
+import static org.zwobble.couscous.ast.MethodCallNode.*;
import static org.zwobble.couscous.ast.ReturnNode.returns;
import static org.zwobble.couscous.ast.StaticMethodCallNode.boxBoolean;
import static org.zwobble.couscous.ast.StaticMethodCallNode.boxInt;
@@ -183,38 +182,38 @@ public class JavaReaderTests {
@Test
public void canUseOperatorsOnIntegers() {
assertEquals(
- methodCall(literal(1), "add", asList(literal(2)), IntegerValue.REF),
+ integerAdd(literal(1), literal(2)),
readExpression("1 + 2"));
assertEquals(
- methodCall(literal(1), "subtract", asList(literal(2)), IntegerValue.REF),
+ integerSubtract(literal(1), literal(2)),
readExpression("1 - 2"));
assertEquals(
- methodCall(literal(1), "multiply", asList(literal(2)), IntegerValue.REF),
+ integerMultiply(literal(1), literal(2)),
readExpression("1 * 2"));
assertEquals(
- methodCall(literal(1), "divide", asList(literal(2)), IntegerValue.REF),
+ integerDivide(literal(1), literal(2)),
readExpression("1 / 2"));
assertEquals(
- methodCall(literal(1), "mod", asList(literal(2)), IntegerValue.REF),
+ integerMod(literal(1), literal(2)),
readExpression("1 % 2"));
assertEquals(
- methodCall(literal(1), "equals", asList(literal(2)), BooleanValue.REF),
+ equal(literal(1), literal(2)),
readExpression("1 == 2"));
assertEquals(
- not(methodCall(literal(1), "equals", asList(literal(2)), BooleanValue.REF)),
+ notEqual(literal(1), literal(2)),
readExpression("1 != 2"));
assertEquals(
- methodCall(literal(1), "greaterThan", asList(literal(2)), BooleanValue.REF),
+ greaterThan(literal(1), literal(2)),
readExpression("1 > 2"));
assertEquals(
- methodCall(literal(1), "greaterThanOrEqual", asList(literal(2)), BooleanValue.REF),
+ greaterThanOrEqual(literal(1), literal(2)),
readExpression("1 >= 2"));
assertEquals(
- methodCall(literal(1), "lessThan", asList(literal(2)), BooleanValue.REF),
+ lessThan(literal(1), literal(2)),
readExpression("1 < 2"));
assertEquals(
- methodCall(literal(1), "lessThanOrEqual", asList(literal(2)), BooleanValue.REF),
+ lessThanOrEqual(literal(1), literal(2)),
readExpression("1 <= 2"));
}
@@ -350,7 +349,7 @@ public class JavaReaderTests {
assertEquals(
assign(
reference(argument),
- methodCall(reference(argument), "add", asList(literal(1)), IntegerValue.REF)),
+ integerAdd(reference(argument), literal(1))),
statement.getExpression());
}
@@ -368,7 +367,7 @@ public class JavaReaderTests {
assertEquals(
assign(
reference(argument),
- methodCall(reference(argument), "subtract", asList(literal(1)), IntegerValue.REF)),
+ integerSubtract(reference(argument), literal(1))),
statement.getExpression());
}