From cea82209e5aa312f4a513308c148d3e944004cb4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 17 Mar 2016 22:33:15 +0000 Subject: Improve support for generics --- .../backends/python/PythonCodeGenerator.java | 5 +++-- .../couscous/backends/python/PythonSerializer.java | 10 ++++++++- .../ast/visitors/PythonExpressionStatement.java | 25 ++++++++++++++++++++++ .../python/ast/visitors/PythonNodeVisitor.java | 4 ++-- 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonExpressionStatement.java (limited to 'src/main/java/org/zwobble/couscous/backends/python') diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index 49e7b80..fc3aa98 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -39,6 +39,7 @@ import static org.zwobble.couscous.backends.python.ast.PythonReturnNode.pythonRe import static org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode.pythonStringLiteral; import static org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode.pythonVariableReference; import static org.zwobble.couscous.backends.python.ast.PythonWhileNode.pythonWhile; +import static org.zwobble.couscous.backends.python.ast.visitors.PythonExpressionStatement.pythonExpressionStatement; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.list; @@ -195,10 +196,10 @@ public class PythonCodeGenerator { @Override public PythonStatementNode visit(ExpressionStatementNode expressionStatement) { if (expressionStatement.getExpression() instanceof AssignmentNode) { - final org.zwobble.couscous.ast.AssignmentNode assignment = (AssignmentNode)expressionStatement.getExpression(); + AssignmentNode assignment = (AssignmentNode)expressionStatement.getExpression(); return pythonAssignment(assignment.getTarget().accept(EXPRESSION_GENERATOR), generateExpression(assignment.getValue())); } else { - throw new UnsupportedOperationException(); + return pythonExpressionStatement(generateExpression(expressionStatement.getExpression())); } } 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 d3771d3..7732a87 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java @@ -2,6 +2,7 @@ package org.zwobble.couscous.backends.python; import org.zwobble.couscous.backends.SourceCodeWriter; import org.zwobble.couscous.backends.python.ast.*; +import org.zwobble.couscous.backends.python.ast.visitors.PythonExpressionStatement; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; public class PythonSerializer implements PythonNodeVisitor { @@ -101,7 +102,14 @@ public class PythonSerializer implements PythonNodeVisitor { writer.writeSpace(); writeParenthesised(operation.getRight(), operation); } - + + @Override + public void visit(PythonExpressionStatement statement) { + writer.writeStatement(() -> { + write(statement.getExpression()); + }); + } + @Override public void visit(PythonReturnNode pythonReturn) { writer.writeStatement(() -> { diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonExpressionStatement.java b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonExpressionStatement.java new file mode 100644 index 0000000..0ba1c38 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/visitors/PythonExpressionStatement.java @@ -0,0 +1,25 @@ +package org.zwobble.couscous.backends.python.ast.visitors; + +import org.zwobble.couscous.backends.python.ast.PythonExpressionNode; +import org.zwobble.couscous.backends.python.ast.PythonStatementNode; + +public class PythonExpressionStatement implements PythonStatementNode { + public static PythonExpressionStatement pythonExpressionStatement(PythonExpressionNode expression) { + return new PythonExpressionStatement(expression); + } + + private final PythonExpressionNode expression; + + public PythonExpressionStatement(PythonExpressionNode expression) { + this.expression = expression; + } + + public PythonExpressionNode getExpression() { + return expression; + } + + @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 8f04787..d43691d 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 @@ -13,7 +13,8 @@ public interface PythonNodeVisitor { void visit(PythonGetSliceNode getSlice); void visit(PythonNotNode notOperation); void visit(PythonBinaryOperation operation); - + + void visit(PythonExpressionStatement statement); void visit(PythonReturnNode pythonReturn); void visit(PythonPassNode pass); void visit(PythonClassNode pythonClass); @@ -24,5 +25,4 @@ public interface PythonNodeVisitor { void visit(PythonWhileNode whileLoop); void visit(PythonModuleNode module); - } -- cgit v1.2.3