aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/backends/python
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-06 13:44:18 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-06 13:44:18 +0100
commit7324dc0bd7c70c0be4a28ca2bba5522cceaf277f (patch)
tree14d3df885c13346cd1c9d1cbfa63ffe27a2a01e4 /src/main/java/org/zwobble/couscous/backends/python
parentba5bf4a7c4f9097d540352afa1e895d2f1019328 (diff)
Add basic implementation of instance methods
Diffstat (limited to 'src/main/java/org/zwobble/couscous/backends/python')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java38
1 files changed, 32 insertions, 6 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 8b26b10..be24996 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -7,6 +7,7 @@ import java.util.stream.Stream;
import org.zwobble.couscous.ast.AssignmentNode;
import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.ast.ConstructorCallNode;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.ExpressionStatementNode;
import org.zwobble.couscous.ast.LiteralNode;
@@ -39,6 +40,7 @@ import org.zwobble.couscous.values.UnitValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
import static com.google.common.collect.Iterators.singletonIterator;
@@ -91,6 +93,11 @@ public class PythonCodeGenerator {
public void visit(StaticMethodCallNode staticMethodCall) {
imports.add(staticMethodCall.getClassName());
}
+
+ @Override
+ public void visit(ConstructorCallNode call) {
+ imports.add(call.getType());
+ }
});
return imports.build();
}
@@ -120,16 +127,23 @@ public class PythonCodeGenerator {
}
private static PythonFunctionDefinitionNode generateFunction(MethodNode method) {
- val argumentNames = method.getArguments().stream()
- .map(argument -> argument.getName())
- .collect(Collectors.toList());
-
+ val explicitArgumentNames = Iterables.transform(
+ method.getArguments(),
+ argument -> argument.getName());
+
+ val argumentNames = Iterables.concat(
+ method.isStatic() ? asList() : asList("self"),
+ explicitArgumentNames);
+
val pythonBody = method.getBody()
.stream()
.map(PythonCodeGenerator::generateStatement)
.collect(Collectors.toList());
- return pythonFunctionDefinition(method.getName(), argumentNames, new PythonBlock(pythonBody));
+ return pythonFunctionDefinition(
+ method.getName(),
+ ImmutableList.copyOf(argumentNames),
+ new PythonBlock(pythonBody));
}
private static PythonStatementNode generateStatement(StatementNode statement) {
@@ -219,11 +233,23 @@ public class PythonCodeGenerator {
val arguments = staticMethodCall.getArguments().stream()
.map(PythonCodeGenerator::generateExpression)
- .collect(Collectors.toList());;
+ .collect(Collectors.toList());
return pythonCall(methodReference, arguments);
}
+ @Override
+ public PythonExpressionNode visit(ConstructorCallNode call) {
+ val className = call.getType();
+ val classReference = pythonVariableReference(className.getSimpleName());
+
+ val arguments = call.getArguments().stream()
+ .map(PythonCodeGenerator::generateExpression)
+ .collect(Collectors.toList());
+
+ return pythonCall(classReference, arguments);
+ }
+
private List<PythonExpressionNode> generateArguments(MethodCallNode methodCall) {
return methodCall.getArguments().stream()
.map(PythonCodeGenerator::generateExpression)