diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-28 14:37:24 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-28 14:37:24 +0000 |
| commit | 5c27e1f6baafb4aeb446674d20ab2c423c80aa70 (patch) | |
| tree | d117980a5b9f7d6c96048e739aba6158d5354416 | |
| parent | d49313c470404851b818db2d83def27407cf2cca (diff) | |
Python backend: support interfaces
3 files changed, 16 insertions, 17 deletions
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<PythonImportNode> imports = generateImports(typeNode).iterator(); PythonImportNode internalsImport = pythonImport( importPathToRoot(typeNode), list(pythonImportAlias("_couscous"))); - PythonFunctionDefinitionNode constructor = - generateConstructor(classNode.getConstructor()); + Optional<ClassNode> classNode = tryCast(ClassNode.class, typeNode); + List<? extends PythonStatementNode> constructor = classNode + .map(node -> list(generateConstructor(node.getConstructor()))) + .orElse(list()); + + List<PythonStatementNode> staticConstructor = classNode + .map(node -> generateStatements(node.getStaticConstructor())) + .orElse(list()); Iterable<PythonFunctionDefinitionNode> 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<PythonStatementNode> staticConstructor = - generateStatements(classNode.getStaticConstructor()); + ImmutableList.copyOf(Iterables.concat(constructor, pythonMethods))); return pythonModule(ImmutableList.copyOf(Iterators.concat( singletonIterator(pythonClass), diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java index ed66c77..6b9f6ed 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java @@ -1,7 +1,5 @@ package org.zwobble.couscous.tests; -import org.junit.Ignore; -import org.junit.Test; import org.zwobble.couscous.CouscousCompiler; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.backends.python.PythonBackend; @@ -18,12 +16,6 @@ import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; import static org.zwobble.couscous.util.ExtraLists.list; public class JavaToPythonTests extends CompilerTests { - @Test - @Ignore("WIP") - public void canImplementUserDefinedInterface() { - - } - protected PrimitiveValue execProgram( Path directory, TypeName type, |
