diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-06 11:13:43 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-06 11:13:43 +0100 |
| commit | fda9d33c0d630906baad5c60e75db5cd8502bfe8 (patch) | |
| tree | 07997752474ccceac5d77ebe61174eee6aa01d0a /src/main | |
| parent | 8896693ff24eba937466f9014f05f211c7fd10cd (diff) | |
Python backend: import class into module
Diffstat (limited to 'src/main')
5 files changed, 36 insertions, 20 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/TypeName.java b/src/main/java/org/zwobble/couscous/ast/TypeName.java index ce80f82..cbc0fe0 100644 --- a/src/main/java/org/zwobble/couscous/ast/TypeName.java +++ b/src/main/java/org/zwobble/couscous/ast/TypeName.java @@ -8,11 +8,12 @@ import lombok.Value; @AllArgsConstructor(access=AccessLevel.PRIVATE) public class TypeName { public static TypeName of(String qualifiedName) { - return new TypeName( - qualifiedName, - qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1)); + return new TypeName(qualifiedName); } String qualifiedName; - String simpleName; + + public String getSimpleName() { + return qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1); + } } 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 4f54d45..8b26b10 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -2,12 +2,10 @@ package org.zwobble.couscous.backends.python; import java.util.List; import java.util.Set; -import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; import org.zwobble.couscous.ast.AssignmentNode; -import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.ExpressionStatementNode; @@ -19,6 +17,7 @@ import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.ast.StatementNode; import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; +import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.ast.VariableReferenceNode; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.ast.visitors.NodeVisitorWithEmptyDefaults; @@ -51,13 +50,13 @@ import static org.zwobble.couscous.backends.python.ast.PythonCallNode.pythonCall import static org.zwobble.couscous.backends.python.ast.PythonClassNode.pythonClass; import static org.zwobble.couscous.backends.python.ast.PythonConditionalExpressionNode.pythonConditionalExpression; import static org.zwobble.couscous.backends.python.ast.PythonFunctionDefinitionNode.pythonFunctionDefinition; +import static org.zwobble.couscous.backends.python.ast.PythonImportAliasNode.pythonImportAlias; import static org.zwobble.couscous.backends.python.ast.PythonImportNode.pythonImport; import static org.zwobble.couscous.backends.python.ast.PythonIntegerLiteralNode.pythonIntegerLiteral; import static org.zwobble.couscous.backends.python.ast.PythonModuleNode.pythonModule; import static org.zwobble.couscous.backends.python.ast.PythonReturnNode.pythonReturn; 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.util.ExtraLists.foldLeft; import lombok.val; @@ -80,7 +79,9 @@ public class PythonCodeGenerator { private static Stream<PythonImportNode> generateImports(ClassNode classNode) { val classes = findReferencedClasses(classNode); return classes.stream() - .map(name -> pythonImport(name.getQualifiedName())); + .map(name -> pythonImport( + name.getQualifiedName(), + asList(pythonImportAlias(name.getSimpleName())))); } private static Set<TypeName> findReferencedClasses(ClassNode classNode) { @@ -210,16 +211,7 @@ public class PythonCodeGenerator { @Override public PythonExpressionNode visit(StaticMethodCallNode staticMethodCall) { val className = staticMethodCall.getClassName(); - val moduleParts = asList(className.getQualifiedName().split(Pattern.quote("."))); - - val module = foldLeft( - moduleParts, - part -> (PythonExpressionNode)pythonVariableReference(part), - (parent, part) -> pythonAttributeAccess(parent, part)); - - val classReference = pythonAttributeAccess( - module, - className.getSimpleName()); + val classReference = pythonVariableReference(className.getSimpleName()); val methodReference = pythonAttributeAccess( classReference, diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java index 9c82b5d..249d9fa 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java @@ -164,9 +164,21 @@ public class PythonSerializer implements PythonNodeVisitor { @Override public void visit(PythonImportNode importNode) { writer.writeStatement(() -> { + writer.writeKeyword("from"); + writer.writeSpace(); + writer.writeIdentifier(importNode.getModuleName()); + writer.writeSpace(); writer.writeKeyword("import"); writer.writeSpace(); - writer.writeIdentifier(importNode.getName()); + writeWithSeparator( + importNode.getAliases(), + alias -> { + writer.writeIdentifier(alias.getName()); + }, + () -> { + writer.writeSymbol(","); + writer.writeSpace(); + }); }); } diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java new file mode 100644 index 0000000..9fb531a --- /dev/null +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java @@ -0,0 +1,8 @@ +package org.zwobble.couscous.backends.python.ast; + +import lombok.Value; + +@Value(staticConstructor="pythonImportAlias") +public class PythonImportAliasNode { + String name; +} diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java index 2d38004..c639829 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java @@ -1,12 +1,15 @@ package org.zwobble.couscous.backends.python.ast; +import java.util.List; + import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; import lombok.Value; @Value(staticConstructor="pythonImport") public class PythonImportNode implements PythonStatementNode { - String name; + String moduleName; + List<PythonImportAliasNode> aliases; @Override public void accept(PythonNodeVisitor visitor) { |
