From 5c27e1f6baafb4aeb446674d20ab2c423c80aa70 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 28 Feb 2016 14:37:24 +0000 Subject: Python backend: support interfaces --- .../java/org/zwobble/couscous/ast/MethodNode.java | 4 ++++ .../backends/python/PythonCodeGenerator.java | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java index c201047..4909093 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -144,6 +144,10 @@ public class MethodNode implements Node { return body; } + public boolean isAbstract() { + return !body.isPresent(); + } + public MethodSignature signature() { return new MethodSignature( name, 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 08ecba4..7d134ef 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -17,6 +17,7 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Iterators.singletonIterator; import static org.zwobble.couscous.backends.python.ast.PythonAssignmentNode.pythonAssignment; @@ -35,31 +36,33 @@ import static org.zwobble.couscous.backends.python.ast.PythonReturnNode.pythonRe import static org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode.pythonStringLiteral; import static org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode.pythonVariableReference; import static org.zwobble.couscous.backends.python.ast.PythonWhileNode.pythonWhile; +import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.list; public class PythonCodeGenerator { public static PythonModuleNode generateCode(TypeNode typeNode) { - ClassNode classNode = (ClassNode) typeNode; - Iterator imports = generateImports(typeNode).iterator(); PythonImportNode internalsImport = pythonImport( importPathToRoot(typeNode), list(pythonImportAlias("_couscous"))); - PythonFunctionDefinitionNode constructor = - generateConstructor(classNode.getConstructor()); + Optional classNode = tryCast(ClassNode.class, typeNode); + List constructor = classNode + .map(node -> list(generateConstructor(node.getConstructor()))) + .orElse(list()); + + List staticConstructor = classNode + .map(node -> generateStatements(node.getStaticConstructor())) + .orElse(list()); Iterable pythonMethods = transform( - typeNode.getMethods(), + filter(typeNode.getMethods(), method -> !method.isAbstract()), PythonCodeGenerator::generateFunction); PythonClassNode pythonClass = pythonClass( typeNode.getName().getSimpleName(), - ImmutableList.copyOf(Iterables.concat(list(constructor), pythonMethods))); - - List staticConstructor = - generateStatements(classNode.getStaticConstructor()); + ImmutableList.copyOf(Iterables.concat(constructor, pythonMethods))); return pythonModule(ImmutableList.copyOf(Iterators.concat( singletonIterator(pythonClass), -- cgit v1.2.3