From 4921990578830926ecc294604c43ec28c851fe8d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 5 Oct 2015 13:32:56 +0100 Subject: Support local variable declarations in Python backend --- .../couscous/backends/python/PythonCodeGenerator.java | 6 ++++-- src/test/java/org/zwobble/couscous/tests/BackendTests.java | 13 +++++++++++++ .../couscous/tests/interpreter/InterpreterTests.java | 12 ------------ 3 files changed, 17 insertions(+), 14 deletions(-) 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 c4b1f49..b1947a8 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -113,8 +113,10 @@ public class PythonCodeGenerator { } @Override - public PythonStatementNode visit(LocalVariableDeclarationNode localVariableDeclaration) { - throw new UnsupportedOperationException(); + public PythonStatementNode visit(LocalVariableDeclarationNode declaration) { + return pythonAssignment( + pythonVariableReference(declaration.getDeclaration().getName()), + generateExpression(declaration.getInitialValue())); } } diff --git a/src/test/java/org/zwobble/couscous/tests/BackendTests.java b/src/test/java/org/zwobble/couscous/tests/BackendTests.java index 0f3956d..f9566d7 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendTests.java @@ -15,6 +15,7 @@ import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.LiteralNode.literal; +import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.MethodNode.staticMethod; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; @@ -61,6 +62,18 @@ public abstract class BackendTests { assertEquals(value("[updated value]"), result); } + + @Test + public void canDeclareVariable() { + val localVariableDeclaration = localVariableDeclaration( + 42, "x", StringValue.REF, LiteralNode.literal("[initial value]")); + val method = staticMethod("hello") + .statement(localVariableDeclaration) + .statement(new ReturnNode(reference(localVariableDeclaration))); + val result = runMethod(method); + + assertEquals(value("[initial value]"), result); + } protected PrimitiveValue runMethod(MethodNode.MethodNodeBuilder methodBuilder, PrimitiveValue... arguments) { val method = methodBuilder.build(); diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java index a54f150..d5a7617 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java @@ -61,18 +61,6 @@ public class InterpreterTests extends BackendTests { assertEquals(new UnexpectedValueType(StringValue.REF, IntegerValue.REF), exception); } - @Test - public void canDeclareVariable() { - val localVariableDeclaration = localVariableDeclaration( - 42, "x", StringValue.REF, LiteralNode.literal("[initial value]")); - val method = staticMethod("hello") - .statement(localVariableDeclaration) - .statement(new ReturnNode(reference(localVariableDeclaration))); - val result = runMethod(method); - - assertEquals(value("[initial value]"), result); - } - @Test public void canDeclareVariableAndThenAssignValues() { val localVariableDeclaration = localVariableDeclaration( -- cgit v1.2.3