From 16f43313e816626d78fd172e27e7530dd6666b8a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Nov 2015 14:59:55 +0000 Subject: Extract static methods for building operations --- .../org/zwobble/couscous/ast/MethodCallNode.java | 62 ++++++++++++++++++++-- .../tests/frontends/java/JavaReaderTests.java | 29 +++++----- 2 files changed, 73 insertions(+), 18 deletions(-) (limited to 'src') 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()); } -- cgit v1.2.3