You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/05/04 18:35:41 UTC

[plc4x] 01/03: Added Python Support?!

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch feature/code-gen
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5b77d5b9b73bb755f867bc03fe0ab8fc383f1a05
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sat May 4 20:13:01 2019 +0200

    Added Python Support?!
---
 .../plc4x/codegen/version2/JavaGenerator.java      |  2 +-
 .../{JavaGenerator.java => PythonGenerator.java}   | 73 ++++++++++------------
 .../codegen/version2/PythonGeneratorTest.java      | 58 +++++++++++++++++
 3 files changed, 93 insertions(+), 40 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
index 899c8fb..4a195be 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
@@ -51,7 +51,7 @@ public class JavaGenerator implements Generator {
     @Override public void writeBlock(Block statements) {
         writer.startBlock();
         for (Node statement : statements.getStatements()) {
-            // Dont to the wrapping for Statemetns
+            // Dont to the wrapping for If Statements
             if (statement instanceof IfStatement) {
                 statement.write(this);
             } else {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java
similarity index 87%
copy from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
copy to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java
index 899c8fb..50c2416 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java
@@ -2,11 +2,11 @@ package org.apache.plc4x.codegen.version2;
 
 import java.util.List;
 
-public class JavaGenerator implements Generator {
+public class PythonGenerator implements Generator {
 
     private final CodeWriter writer;
 
-    public JavaGenerator(CodeWriter writer) {
+    public PythonGenerator(CodeWriter writer) {
         this.writer = writer;
     }
 
@@ -15,17 +15,18 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void generateDeclarationWithInitializer(DeclarationStatement declarationStatement) {
-        declarationStatement.getParameterExpression().getType().write(this);
-        writer.write(" ");
         declarationStatement.getParameterExpression().write(this);
+        writer.write(": ");
+        declarationStatement.getParameterExpression().getType().write(this);
         writer.write(" = ");
         declarationStatement.getInitializer().write(this);
     }
 
     @Override public void generateDeclaration(DeclarationStatement declarationStatement) {
-        declarationStatement.getParameterExpression().getType().write(this);
-        writer.write(" ");
         declarationStatement.getParameterExpression().write(this);
+        writer.write(": ");
+        declarationStatement.getParameterExpression().getType().write(this);
+        writer.write(" = None");
     }
 
     @Override public void generate(ParameterExpression parameterExpression) {
@@ -37,27 +38,25 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void generate(IfStatement ifStatement) {
-        writer.startLine("if (");
+        writer.startLine("if ");
         ifStatement.getCondition().write(this);
-        writer.write(") {\n");
+        writer.write(":\n");
         writeBlock(ifStatement.getBody());
         if (ifStatement.getOrElse() != null) {
-            writer.writeLine("} else {");
+            writer.writeLine("else:");
             writeBlock(ifStatement.getOrElse());
         }
-        writer.writeLine("}");
     }
 
     @Override public void writeBlock(Block statements) {
         writer.startBlock();
         for (Node statement : statements.getStatements()) {
-            // Dont to the wrapping for Statemetns
+            // Dont to the wrapping for If Statements
             if (statement instanceof IfStatement) {
                 statement.write(this);
             } else {
                 writer.startLine("");
                 statement.write(this);
-                writer.write(";");
                 writer.endLine();
             }
         }
@@ -106,7 +105,6 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void generate(NewExpression newExpression) {
-        writer.write("new ");
         newExpression.getType().write(this);
         writer.write("(");
         generateArgumentList(newExpression.getArguments());
@@ -114,13 +112,7 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void generate(MethodDefinition methodDefinition) {
-        writer.startLine("public ");
-        // Special handling of VOID is necessary
-        if (methodDefinition.getResultType() == Primitive.VOID) {
-            writer.write("void");
-        } else {
-            methodDefinition.getResultType().write(this);
-        }
+        writer.startLine("def ");
         writer.write(" ");
         writer.write(methodDefinition.getName());
         writer.write("(");
@@ -132,10 +124,16 @@ public class JavaGenerator implements Generator {
                 writer.write(", ");
             }
         }
-        writer.write(") {");
+        writer.write(") -> ");
+        // Special handling of VOID is necessary
+        if (methodDefinition.getResultType() == Primitive.VOID) {
+            writer.write("None");
+        } else {
+            methodDefinition.getResultType().write(this);
+        }
+        writer.write(":");
         writer.endLine();
         methodDefinition.getBody().write(this);
-        writer.writeLine("}");
     }
 
     @Override public void generateReturn(Expression value) {
@@ -146,18 +144,20 @@ public class JavaGenerator implements Generator {
     @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass) {
         // Add static?!
         // Own File?
-        writer.startLine("public ");
-        if (!mainClass) {
-            writer.write("static ");
-        }
-        writer.write("class ");
+        writer.startLine("class ");
         writer.write(className);
         // TODO extends / implements
-        writer.write(" {");
+        writer.write(":");
         writer.endLine();
         writer.startBlock();
 
+        // Insert a pass if there are no fields or methods
+        if (fields.size() == 0 && methods.size() == 0) {
+            writer.writeLine("pass");
+        }
+
         writer.writeLine("");
+
         // Fields
         for (FieldDeclaration field : fields) {
             field.write(this);
@@ -184,27 +184,23 @@ public class JavaGenerator implements Generator {
         }
 
         writer.endBlock();
-        writer.writeLine("}");
     }
 
     @Override public void generateFieldDeclaration(TypeNode type, String name) {
-        writer.startLine("public ");
-        type.write(this);
-        writer.write(" ");
+        writer.startLine("self.");
         writer.write(name);
-        writer.write(";");
+        writer.write(": ");
+        type.write(this);
         writer.endLine();
     }
 
     @Override public void generateFieldReference(TypeNode type, String name) {
-        writer.write("this.");
+        writer.write("self.");
         writer.write(name);
     }
 
     @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
-        writer.startLine("public ");
-        writer.write(className);
-        writer.write("(");
+        writer.startLine("def __init__(");
         for (int i = 0; i < parameters.size(); i++) {
             parameters.get(i).getType().write(this);
             writer.write(" ");
@@ -213,10 +209,9 @@ public class JavaGenerator implements Generator {
                 writer.write(", ");
             }
         }
-        writer.write(") {");
+        writer.write("):");
         writer.endLine();
         body.write(this);
-        writer.writeLine("}");
     }
 
     @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java
new file mode 100644
index 0000000..53bcc8c
--- /dev/null
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java
@@ -0,0 +1,58 @@
+package org.apache.plc4x.codegen.version2;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import static org.junit.Assert.*;
+
+public class PythonGeneratorTest {
+
+    public Generator generator;
+    public CodeWriter writer;
+
+    @Before
+    public void setUp() throws Exception {
+        this.writer = new CodeWriter(4);
+        this.generator = new PythonGenerator(writer);
+    }
+
+    @Test
+    public void generateCode() {
+        final FieldDeclaration current = new FieldDeclaration(Primitive.DOUBLE, "current");
+
+        final FieldReference currentRef = new FieldReference(Primitive.DOUBLE, "current");
+
+        final ParameterExpression value = new ParameterExpression(Primitive.DOUBLE, "value");
+
+        // Define Inner Class
+        final ClassDefinition innerClass = new ClassDefinition("", "MyInnerClazz", Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null);
+
+        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x",
+            "MyClazz",
+            Arrays.asList(current),
+            Arrays.asList(
+                new ConstructorDeclaration(
+                    Collections.singletonList(value),
+                    new Block(new AssignementExpression(currentRef, value))
+                )
+            ),
+            Collections.emptyList(),
+            Collections.singletonList(innerClass));
+
+        clazz.write(generator);
+        final String code = writer.getCode();
+        assertEquals("class MyClazz:\n" +
+            "    \n" +
+            "    self.current: double\n" +
+            "    \n" +
+            "    def __init__(double value):\n" +
+            "        self.current = value\n" +
+            "    \n" +
+            "    class MyInnerClazz:\n" +
+            "        pass\n" +
+            "        \n", code);
+    }
+}
\ No newline at end of file