diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-06 22:11:12 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-06 22:11:12 +0000 |
| commit | b81b68e59c6d34ccd109ec9aa517c4ead3c56ebd (patch) | |
| tree | 09a98bf42ed1be289a6501241322eb6d438f1e5a /src/main/java/org/zwobble/couscous/backends/python | |
| parent | 45ae597f7751b7e9d12ef00cf394a9cf0155176c (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.java | 6 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java | 14 |
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) { |
