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