diff options
Diffstat (limited to 'src')
4 files changed, 42 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/Operations.java b/src/main/java/org/zwobble/couscous/ast/Operations.java index 308d070..a94235e 100644 --- a/src/main/java/org/zwobble/couscous/ast/Operations.java +++ b/src/main/java/org/zwobble/couscous/ast/Operations.java @@ -33,6 +33,10 @@ public class Operations { return booleanOperation(Operator.BOOLEAN_OR, left, right); } + public static ExpressionNode integerNegation(ExpressionNode value) { + return OperationNode.operation(Operator.INTEGER_NEGATION, list(value), Types.INT); + } + public static ExpressionNode integerAdd(ExpressionNode left, ExpressionNode right) { return integerOperation(Operator.ADD, left, right); } diff --git a/src/main/java/org/zwobble/couscous/ast/Operator.java b/src/main/java/org/zwobble/couscous/ast/Operator.java index a77a135..54ab6c6 100644 --- a/src/main/java/org/zwobble/couscous/ast/Operator.java +++ b/src/main/java/org/zwobble/couscous/ast/Operator.java @@ -5,6 +5,7 @@ public enum Operator { BOOLEAN_OR("||", true, OperatorType.INFIX), BOOLEAN_NOT("!", true, OperatorType.PREFIX), + INTEGER_NEGATION("-", false, OperatorType.PREFIX), ADD("+", false, OperatorType.INFIX), SUBTRACT("-", false, OperatorType.INFIX), MULTIPLY("*", false, OperatorType.INFIX), diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java index 22a9895..33acb80 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java @@ -374,6 +374,8 @@ public class JavaExpressionReader { private ExpressionNode readPrefixExpression(PrefixExpression expression) { if (expression.getOperator() == PrefixExpression.Operator.NOT) { return not(readExpression(Types.BOOLEAN, expression.getOperand())); + } else if (expression.getOperator() == PrefixExpression.Operator.MINUS) { + return Operations.integerNegation(readExpression(Types.INT, expression.getOperand())); } else { Operator operator = readOperator(expression.getOperator()); return AssignmentNode.assign( diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java index 4aa015e..a337943 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java @@ -522,6 +522,41 @@ public class ExpressionReadingTests { } @Test + public void canReadPrefixDecrement() { + ClassNode classNode = readClass( + "public void go(int value) {" + + " --value;" + + "}"); + + MethodNode method = classNode.getMethods().get(0); + FormalArgumentNode argument = method.getArguments().get(0); + ExpressionStatementNode statement = (ExpressionStatementNode) + classNode.getMethods().get(0).getBody().get().get(0); + assertEquals( + assign( + reference(argument), + integerSubtract(reference(argument), literal(1))), + statement.getExpression()); + } + + @Test + public void canReadIntegerNegation() { + ClassNode classNode = readClass( + "public int go(int value) {" + + " return -value;" + + "}"); + + MethodNode method = classNode.getMethods().get(0); + FormalArgumentNode argument = method.getArguments().get(0); + ReturnNode statement = (ReturnNode) + classNode.getMethods().get(0).getBody().get().get(0); + assertEquals( + integerNegation(reference(argument)), + statement.getValue() + ); + } + + @Test public void canReadCompoundAssignmentOperations() { canReadCompoundAssignmentOperation("+=", Operator.ADD); canReadCompoundAssignmentOperation("-=", Operator.SUBTRACT); @@ -584,22 +619,4 @@ public class ExpressionReadingTests { boxInt(integerAdd(unboxInt(reference(left)), reference(right)))), statement.getExpression()); } - - @Test - public void canReadPrefixDecrement() { - ClassNode classNode = readClass( - "public void go(int value) {" + - " --value;" + - "}"); - - MethodNode method = classNode.getMethods().get(0); - FormalArgumentNode argument = method.getArguments().get(0); - ExpressionStatementNode statement = (ExpressionStatementNode) - classNode.getMethods().get(0).getBody().get().get(0); - assertEquals( - assign( - reference(argument), - integerSubtract(reference(argument), literal(1))), - statement.getExpression()); - } } |
