diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-12-31 22:07:13 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-12-31 22:07:13 +0000 |
| commit | 34db8d9949d41e6433fa3e09b7ead9032d319023 (patch) | |
| tree | f0c6eeced9c4112f8ffdf9e62ba560fac178aaf5 | |
| parent | 1e770167feb081a1019fd4401ec583ab4f0543ff (diff) | |
Add support for reading Boolean negation
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) {" + |
