aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/backends/python
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-06 22:11:12 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-06 22:11:12 +0000
commitb81b68e59c6d34ccd109ec9aa517c4ead3c56ebd (patch)
tree09a98bf42ed1be289a6501241322eb6d438f1e5a /src/main/java/org/zwobble/couscous/backends/python
parent45ae597f7751b7e9d12ef00cf394a9cf0155176c (diff)
Implement overloading by argument type in Python backend
Diffstat (limited to 'src/main/java/org/zwobble/couscous/backends/python')
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java14
2 files changed, 15 insertions, 5 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 d2721ae..d2f89ba 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PrimitiveMethods.java
@@ -4,9 +4,11 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
+import com.google.common.collect.ImmutableList;
import org.zwobble.couscous.ast.Operator;
import org.zwobble.couscous.ast.TypeName;
import org.zwobble.couscous.backends.python.ast.PythonBinaryOperation;
+import org.zwobble.couscous.backends.python.ast.PythonCallNode;
import org.zwobble.couscous.backends.python.ast.PythonExpressionNode;
import org.zwobble.couscous.backends.python.ast.PythonNotNode;
import org.zwobble.couscous.values.*;
@@ -47,6 +49,9 @@ public class PrimitiveMethods {
static {
ImmutableMap.Builder<String, PrimitiveMethodGenerator> methods = ImmutableMap.builder();
+
+ methods.put("toString", (receiver, arguments) ->
+ pythonCall(pythonVariableReference("str"), ImmutableList.of(receiver)));
addOperation(methods, Operator.ADD.getMethodName(), "+");
addOperation(methods, Operator.SUBTRACT.getMethodName(), "-");
@@ -91,6 +96,7 @@ public class PrimitiveMethods {
.put(StringValue.REF, STRING_METHODS)
.put(BooleanValue.REF, BOOLEAN_METHODS)
.put(IntegerValue.REF, INT_METHODS)
+ .put(ObjectValues.BOXED_INT, INT_METHODS)
.build();
private static final Map<String, PrimitiveStaticMethodGenerator> INTERNAL_METHODS =
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 95f8b9e..104854c 100644
--- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
+++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java
@@ -1,5 +1,6 @@
package org.zwobble.couscous.backends.python;
+import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -20,6 +21,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Iterators.singletonIterator;
import static java.util.Arrays.asList;
import static org.zwobble.couscous.backends.python.ast.PythonAssignmentNode.pythonAssignment;
@@ -50,7 +52,7 @@ public class PythonCodeGenerator {
PythonFunctionDefinitionNode constructor =
generateConstructor(classNode.getConstructor());
- Iterable<PythonFunctionDefinitionNode> pythonMethods = Iterables.transform(
+ Iterable<PythonFunctionDefinitionNode> pythonMethods = transform(
classNode.getMethods(),
PythonCodeGenerator::generateFunction);
@@ -128,14 +130,14 @@ public class PythonCodeGenerator {
}
private static PythonFunctionDefinitionNode generateConstructor(ConstructorNode constructor) {
- Iterable<String> explicitArgumentNames = Iterables.transform(constructor.getArguments(), argument -> argument.getName());
+ Iterable<String> explicitArgumentNames = transform(constructor.getArguments(), argument -> argument.getName());
Iterable<String> argumentNames = Iterables.concat(asList("self"), explicitArgumentNames);
List<PythonStatementNode> pythonBody = constructor.getBody().stream().map(PythonCodeGenerator::generateStatement).collect(Collectors.toList());
return pythonFunctionDefinition("__init__", ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody));
}
private static PythonFunctionDefinitionNode generateFunction(MethodNode method) {
- Iterable<String> explicitArgumentNames = Iterables.transform(method.getArguments(), argument -> argument.getName());
+ Iterable<String> explicitArgumentNames = transform(method.getArguments(), argument -> argument.getName());
Iterable<String> argumentNames = Iterables.concat(
method.isStatic() ? Collections.<String>emptyList() : asList("self"),
explicitArgumentNames);
@@ -195,7 +197,7 @@ public class PythonCodeGenerator {
}
private static List<PythonExpressionNode> generateExpressions(Iterable<? extends ExpressionNode> expressions) {
- return ImmutableList.copyOf(Iterables.transform(expressions, PythonCodeGenerator::generateExpression));
+ return ImmutableList.copyOf(transform(expressions, PythonCodeGenerator::generateExpression));
}
private static final ExpressionGenerator EXPRESSION_GENERATOR = new ExpressionGenerator();
@@ -294,7 +296,9 @@ public class PythonCodeGenerator {
}
public static String toName(MethodSignature signature) {
- return signature.getName() + "_" + signature.getArguments().size();
+ return Joiner.on("__").join(Iterables.concat(
+ ImmutableList.of(signature.getName()),
+ transform(signature.getArguments(), argument -> argument.getQualifiedName().replace('.', '_'))));
}
private static boolean isPrimitive(ExpressionNode value) {