aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/backends/python
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble/couscous/backends/python')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java11
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java8
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/ast/PythonNotNode.java24
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java2
4 files changed, 45 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
index 9639c72..c6aa62d 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
@@ -6,6 +6,8 @@ import java.util.Optional;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
+import org.zwobble.couscous.backends.python.ast.PythonNotNode;
+import org.zwobble.couscous.values.BooleanValue;
import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.StringValue;
@@ -32,6 +34,14 @@ public class PrimitiveMethods {
.build();
+ private static final Map<String, PrimitiveMethodGenerator> BOOLEAN_METHODS =
+ ImmutableMap.<String, PrimitiveMethodGenerator>builder()
+
+ .put("negate", (receiver, arguments) ->
+ PythonNotNode.pythonNot(receiver))
+
+ .build();
+
private static final Map<String, PrimitiveMethodGenerator> INT_METHODS;
static {
@@ -76,6 +86,7 @@ public class PrimitiveMethods {
private static final Map<TypeName, Map<String, PrimitiveMethodGenerator>> METHODS =
ImmutableMap.<TypeName, Map<String, PrimitiveMethodGenerator>>builder()
.put(StringValue.REF, STRING_METHODS)
+ .put(BooleanValue.REF, BOOLEAN_METHODS)
.put(IntegerValue.REF, INT_METHODS)
.build();
diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
index 1674e1f..eadb545 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java
@@ -16,6 +16,7 @@ import org.zwobble.couscous.backends.python.ast.PythonImportNode;
import org.zwobble.couscous.backends.python.ast.PythonIntegerLiteralNode;
import org.zwobble.couscous.backends.python.ast.PythonModuleNode;
import org.zwobble.couscous.backends.python.ast.PythonNode;
+import org.zwobble.couscous.backends.python.ast.PythonNotNode;
import org.zwobble.couscous.backends.python.ast.PythonPassNode;
import org.zwobble.couscous.backends.python.ast.PythonReturnNode;
import org.zwobble.couscous.backends.python.ast.PythonStatementNode;
@@ -103,6 +104,13 @@ public class PythonSerializer implements PythonNodeVisitor {
});
writer.writeSymbol("]");
}
+
+ @Override
+ public void visit(PythonNotNode notOperation) {
+ writer.writeKeyword("not");
+ writer.writeSpace();
+ writeParenthesised(notOperation.getOperand());
+ }
@Override
public void visit(PythonReturnNode pythonReturn) {
diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonNotNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonNotNode.java
new file mode 100644
index 0000000..6fe7dc6
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonNotNode.java
@@ -0,0 +1,24 @@
+package org.zwobble.couscous.backends.python.ast;
+
+import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor;
+
+public class PythonNotNode implements PythonExpressionNode {
+ public static PythonExpressionNode pythonNot(PythonExpressionNode operand) {
+ return new PythonNotNode(operand);
+ }
+
+ private final PythonExpressionNode operand;
+
+ private PythonNotNode(PythonExpressionNode operand) {
+ this.operand = operand;
+ }
+
+ public PythonExpressionNode getOperand() {
+ return operand;
+ }
+
+ @Override
+ public void accept(PythonNodeVisitor visitor) {
+ visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
index 7632342..59a1fe9 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonNodeVisitor.java
@@ -11,6 +11,7 @@ import org.zwobble.couscous.backends.python.ast.PythonGetSliceNode;
import org.zwobble.couscous.backends.python.ast.PythonImportNode;
import org.zwobble.couscous.backends.python.ast.PythonIntegerLiteralNode;
import org.zwobble.couscous.backends.python.ast.PythonModuleNode;
+import org.zwobble.couscous.backends.python.ast.PythonNotNode;
import org.zwobble.couscous.backends.python.ast.PythonPassNode;
import org.zwobble.couscous.backends.python.ast.PythonReturnNode;
import org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode;
@@ -25,6 +26,7 @@ public interface PythonNodeVisitor {
void visit(PythonAttributeAccessNode attributeAccess);
void visit(PythonCallNode call);
void visit(PythonGetSliceNode getSlice);
+ void visit(PythonNotNode notOperation);
void visit(PythonReturnNode pythonReturn);
void visit(PythonPassNode pass);