From a063cdcec0ecfe449a22f0134dc559a40583fc09 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 6 Feb 2016 17:11:19 +0000 Subject: Move naming code out of Python backend --- src/main/java/org/zwobble/couscous/backends/Names.java | 16 ++++++++++++++++ .../couscous/backends/csharp/CsharpCodeGenerator.java | 4 ++-- .../couscous/backends/python/PythonCodeGenerator.java | 12 +++--------- .../tests/backends/csharp/CsharpMethodRunner.java | 7 ++++--- .../tests/backends/python/PythonMethodRunner.java | 6 ++++-- 5 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/zwobble/couscous/backends/Names.java (limited to 'src') diff --git a/src/main/java/org/zwobble/couscous/backends/Names.java b/src/main/java/org/zwobble/couscous/backends/Names.java new file mode 100644 index 0000000..fc8072f --- /dev/null +++ b/src/main/java/org/zwobble/couscous/backends/Names.java @@ -0,0 +1,16 @@ +package org.zwobble.couscous.backends; + +import com.google.common.base.Joiner; +import com.google.common.collect.Iterables; +import org.zwobble.couscous.ast.MethodSignature; + +import static com.google.common.collect.Iterables.transform; +import static org.zwobble.couscous.util.ExtraLists.list; + +public class Names { + public static String toUniqueName(MethodSignature signature) { + return Joiner.on("__").join(Iterables.concat( + list(signature.getName()), + transform(signature.getArguments(), argument -> argument.getQualifiedName().replace('.', '_')))); + } +} diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java index 3ac7363..5a90dc7 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java @@ -3,7 +3,7 @@ package org.zwobble.couscous.backends.csharp; import com.google.common.collect.ImmutableMap; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.NodeTransformer; -import org.zwobble.couscous.backends.python.PythonCodeGenerator; +import org.zwobble.couscous.backends.Names; import org.zwobble.couscous.values.*; import java.util.Map; @@ -49,7 +49,7 @@ public class CsharpCodeGenerator { } private String transformMethodName(MethodSignature signature) { - return PythonCodeGenerator.toName(signature); + return Names.toUniqueName(signature); } private Optional transformExpression(ExpressionNode expression) { 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 086b3a0..d7e56aa 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -1,6 +1,5 @@ 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; @@ -10,6 +9,7 @@ import org.zwobble.couscous.ast.structure.NodeStructure; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeMapperWithDefault; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; +import org.zwobble.couscous.backends.Names; import org.zwobble.couscous.backends.python.ast.*; import org.zwobble.couscous.values.*; @@ -161,7 +161,7 @@ public class PythonCodeGenerator { method.isStatic() ? Collections.emptyList() : list("self"), explicitArgumentNames); List pythonBody = generateStatements(method.getBody()); - return pythonFunctionDefinition(toName(method.signature()), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody)); + return pythonFunctionDefinition(Names.toUniqueName(method.signature()), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody)); } private static List generateStatements(List statements) { @@ -252,7 +252,7 @@ public class PythonCodeGenerator { List arguments = generateExpressions(methodCall.getArguments()); return getPrimitiveMethod(methodCall, receiver, arguments) - .orElseGet(() -> pythonCall(pythonAttributeAccess(receiver, toName(methodCall.signature())), arguments)); + .orElseGet(() -> pythonCall(pythonAttributeAccess(receiver, Names.toUniqueName(methodCall.signature())), arguments)); } private Optional getPrimitiveMethod( @@ -346,10 +346,4 @@ public class PythonCodeGenerator { private static PythonVariableReferenceNode typeReference(TypeName className) { return pythonVariableReference(className.getSimpleName()); } - - public static String toName(MethodSignature signature) { - return Joiner.on("__").join(Iterables.concat( - list(signature.getName()), - transform(signature.getArguments(), argument -> argument.getQualifiedName().replace('.', '_')))); - } } \ No newline at end of file diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java index 651e50b..d293f84 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java @@ -9,9 +9,9 @@ import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodSignature; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.backends.Names; import org.zwobble.couscous.backends.csharp.CsharpBackend; import org.zwobble.couscous.backends.csharp.CsharpSerializer; -import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.tests.backends.Processes; import org.zwobble.couscous.util.ExtraLists; @@ -61,9 +61,10 @@ public class CsharpMethodRunner implements MethodRunner { boolean isVoid) throws IOException, InterruptedException { - String csharpMethodName = PythonCodeGenerator.toName(new MethodSignature( + MethodSignature signature = new MethodSignature( methodName, - eagerMap(arguments, argument -> argument.getType()))); + eagerMap(arguments, argument -> argument.getType())); + String csharpMethodName = Names.toUniqueName(signature); String value = CsharpSerializer.serialize( staticMethodCall( TypeName.of(NAMESPACE + "." + className.getQualifiedName()), diff --git a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java index 14fcf80..e541459 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java @@ -5,6 +5,7 @@ import org.hamcrest.Matchers; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.MethodSignature; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.backends.Names; import org.zwobble.couscous.backends.python.PythonBackend; import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.backends.python.PythonSerializer; @@ -50,9 +51,10 @@ public class PythonMethodRunner implements MethodRunner { throws IOException, InterruptedException { String argumentsString = Joiner.on(", ").join(arguments.stream().map(PythonCodeGenerator::generateCode).map(PythonSerializer::serialize).iterator()); - String pythonMethodName = PythonCodeGenerator.toName(new MethodSignature( + MethodSignature signature = new MethodSignature( methodName, - eagerMap(arguments, argument -> argument.getType()))); + eagerMap(arguments, argument -> argument.getType())); + String pythonMethodName = Names.toUniqueName(signature); String program = "from couscous." + className.getQualifiedName() + " import " + className.getSimpleName() + ";" + "value = " + className.getSimpleName() + "." + pythonMethodName + "(" + argumentsString + ");" + "print(type(value)); print(value)"; -- cgit v1.2.3