aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-12-31 22:07:13 +0000
committerMichael Williamson <mike@zwobble.org>2015-12-31 22:07:13 +0000
commit34db8d9949d41e6433fa3e09b7ead9032d319023 (patch)
treef0c6eeced9c4112f8ffdf9e62ba560fac178aaf5
parent1e770167feb081a1019fd4401ec583ab4f0543ff (diff)
Add support for reading Boolean negation
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java23
-rw-r--r--src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java1
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java7
3 files changed, 22 insertions, 9 deletions
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 c864371..a7592a9 100644
--- a/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
+++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaExpressionReader.java
@@ -13,6 +13,7 @@ import java.util.stream.IntStream;
import static java.util.Arrays.asList;
import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall;
import static org.zwobble.couscous.ast.LiteralNode.literal;
+import static org.zwobble.couscous.ast.MethodCallNode.not;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
import static org.zwobble.couscous.frontends.java.JavaOperators.readOperator;
@@ -238,7 +239,7 @@ public class JavaExpressionReader {
if (expression.getOperator() == InfixExpression.Operator.EQUALS) {
return StaticMethodCallNode.same(left, right);
} else if (expression.getOperator() == InfixExpression.Operator.NOT_EQUALS) {
- return MethodCallNode.not(StaticMethodCallNode.same(left, right));
+ return not(StaticMethodCallNode.same(left, right));
} else {
throw new IllegalArgumentException("Unsupported operator: " + expression.getOperator());
}
@@ -259,14 +260,18 @@ public class JavaExpressionReader {
}
private ExpressionNode readPrefixExpression(PrefixExpression expression) {
- Operator operator = readOperator(expression.getOperator());
- return AssignmentNode.assign(
- (AssignableExpressionNode) readExpressionWithoutBoxing(expression.getOperand()),
- MethodCallNode.methodCall(
- readExpression(IntegerValue.REF, expression.getOperand()),
- operator.getMethodName(),
- asList(literal(1)),
- IntegerValue.REF));
+ if (expression.getOperator() == PrefixExpression.Operator.NOT) {
+ return not(readExpression(BooleanValue.REF, expression.getOperand()));
+ } else {
+ Operator operator = readOperator(expression.getOperator());
+ return AssignmentNode.assign(
+ (AssignableExpressionNode) readExpressionWithoutBoxing(expression.getOperand()),
+ MethodCallNode.methodCall(
+ readExpression(IntegerValue.REF, expression.getOperand()),
+ operator.getMethodName(),
+ asList(literal(1)),
+ IntegerValue.REF));
+ }
}
private ExpressionNode readConditionalExpression(ConditionalExpression expression) {
diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
index edb0260..b447894 100644
--- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java
@@ -35,6 +35,7 @@ public class JavaToPythonTests {
assertEquals(value(false), evalExpression("1 > 2"));
assertEquals(value(true), evalExpression("1 == 1"));
assertEquals(value(false), evalExpression("1 != 1"));
+ assertEquals(value(true), evalExpression("!false"));
}
@Test
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 1be1abb..302ae40 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
@@ -405,6 +405,13 @@ public class JavaReaderTests {
}
@Test
+ public void canReadPrefixBooleanNegation() {
+ assertEquals(
+ not(literal(true)),
+ readBooleanExpression("!true"));
+ }
+
+ @Test
public void canReadPrefixIncrement() {
ClassNode classNode = readClass(
"public void go(int value) {" +