aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operations.java4
-rw-r--r--src/main/java/org/zwobble/couscous/ast/Operator.java1
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/ExpressionReadingTests.java53
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());
- }
}