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/05 13:18:32 UTC

[plc4x] branch feature/code-gen updated (77ae145 -> 579b723)

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

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


    from 77ae145  Extended IfStatement.
     new a11f01a  Fixed Enum Factory.
     new 579b723  Added Setters to Pojos, did really awesome stuff.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../java/org/apache/plc4x/codegen/DFDLUtil.java    |  43 ++++++-
 .../plc4x/codegen/ast/ConstructorDeclaration.java  |   5 +
 .../org/apache/plc4x/codegen/ast/EnumFactory.java  | 137 +++++++++++++++++++++
 .../apache/plc4x/codegen/ast/FieldDeclaration.java |  22 +++-
 .../org/apache/plc4x/codegen/ast/Generator.java    |  12 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    |  36 +++++-
 .../apache/plc4x/codegen/ast/MethodDefinition.java |   5 -
 .../org/apache/plc4x/codegen/ast/Modifier.java     |   7 ++
 .../apache/plc4x/codegen/ast/NewExpression.java    |   8 +-
 .../org/apache/plc4x/codegen/ast/PhpGenerator.java | 105 ----------------
 .../org/apache/plc4x/codegen/ast/PojoFactory.java  |  37 ++++--
 .../org/apache/plc4x/codegen/ast/Primitive.java    |   1 +
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |  26 +++-
 .../org/apache/plc4x/codegen/DFDLUtilTest.java     |   2 -
 .../apache/plc4x/codegen/ast/EnumFactoryTest.java  |  70 +++++++++++
 .../apache/plc4x/codegen/ast/PhpGeneratorTest.java |  23 ----
 16 files changed, 374 insertions(+), 165 deletions(-)
 create mode 100644 sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
 create mode 100644 sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java
 delete mode 100644 sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
 create mode 100644 sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
 delete mode 100644 sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java


[plc4x] 01/02: Fixed Enum Factory.

Posted by jf...@apache.org.
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 a11f01a5086c4e9ebbaadbb216c830d32ab1ecab
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 13:58:50 2019 +0200

    Fixed Enum Factory.
---
 .../plc4x/codegen/ast/ConstructorDeclaration.java  |   5 +
 .../org/apache/plc4x/codegen/ast/EnumFactory.java  | 130 +++++++++++++++++++++
 .../apache/plc4x/codegen/ast/FieldDeclaration.java |  22 +++-
 .../org/apache/plc4x/codegen/ast/Generator.java    |  12 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    |  36 +++++-
 .../apache/plc4x/codegen/ast/MethodDefinition.java |   5 -
 .../org/apache/plc4x/codegen/ast/Modifier.java     |   7 ++
 .../apache/plc4x/codegen/ast/NewExpression.java    |   8 +-
 .../org/apache/plc4x/codegen/ast/PhpGenerator.java | 105 -----------------
 .../org/apache/plc4x/codegen/ast/PojoFactory.java  |  12 +-
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |  26 ++++-
 .../apache/plc4x/codegen/ast/EnumFactoryTest.java  |  70 +++++++++++
 .../apache/plc4x/codegen/ast/PhpGeneratorTest.java |  23 ----
 13 files changed, 303 insertions(+), 158 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
index df5b02b..8dab2c8 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
@@ -1,9 +1,14 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class ConstructorDeclaration extends MethodDefinition {
 
+    public ConstructorDeclaration(Set<Modifier> modifiers, List<ParameterExpression> parameters, Block body) {
+        super(modifiers, null, null, parameters, body);
+    }
+
     public ConstructorDeclaration(List<ParameterExpression> parameters, Block body) {
         super(null, null, parameters, body);
     }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
new file mode 100644
index 0000000..b1b422f
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
@@ -0,0 +1,130 @@
+package org.apache.plc4x.codegen.ast;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Creates Enum Like things...
+ */
+public class EnumFactory {
+
+    public ClassDefinition create(PojoDescription desc, List<EnumEntry> enumEntries) {
+        // Create all Fields first
+        final List<Node> constructorStatements = new ArrayList<>();
+        final List<FieldDeclaration> fields = new ArrayList<>();
+        for (Field field1 : desc.fields) {
+            FieldDeclaration fieldDeclaration = new FieldDeclaration(field1.getType(), field1.getName(), Modifier.PRIVATE, Modifier.FINAL);
+            fields.add(fieldDeclaration);
+            constructorStatements.add(new AssignementExpression(
+                new FieldReference(field1.getType(), field1.getName()),
+                new ParameterExpression(field1.getType(), field1.getName())
+            ));
+        }
+
+        // Create the Getters
+        final List<MethodDefinition> getters = desc.fields.stream()
+            .map(field -> getMethodDefinition(field.getName(), field.getType()))
+            .collect(Collectors.toList());
+
+        // Now add all these getters
+        final List<MethodDefinition> methods = new ArrayList<>(getters);
+
+        final ArrayList<FieldDeclaration> finalFields = new ArrayList<>();
+
+        // Now add all these static methods on top
+        for (EnumEntry enumEntry : enumEntries) {
+            final TypeNode clazzType = new TypeNode(desc.getName());
+            final String fieldName = enumEntry.getName().toUpperCase();
+            finalFields.add(new FieldDeclaration(
+                new HashSet<>(Arrays.asList(Modifier.STATIC, Modifier.FINAL)),
+                clazzType,
+                fieldName,
+                new NewExpression(clazzType, enumEntry.getArguments())
+            ));
+        }
+
+        finalFields.addAll(fields);
+
+        // Add constructor
+        final ConstructorDeclaration constructor = new ConstructorDeclaration(Collections.singleton(Modifier.PRIVATE),
+            desc.fields.stream()
+                .map(field -> new ParameterExpression(field.getType(), field.getName())).collect(Collectors.toList()),
+            new Block(constructorStatements));
+
+
+        return new ClassDefinition("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
+    }
+
+    static MethodDefinition getMethodDefinition(String name, TypeNode type) {
+        String getter = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
+        Block body = new Block(new ReturnStatement(new FieldReference(type, name)));
+        return new MethodDefinition(getter, type, Collections.emptyList(), body);
+    }
+
+    public static class EnumEntry {
+
+        private final String name;
+        private final List<Node> arguments;
+
+        public EnumEntry(String name, List<Node> arguments) {
+            this.name = name;
+            this.arguments = arguments;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public List<Node> getArguments() {
+            return arguments;
+        }
+    }
+
+    public static class PojoDescription {
+
+        private final String name;
+        private final List<Field> fields;
+
+        public PojoDescription(String name, Field... fields) {
+            this.name = name;
+            this.fields = Arrays.asList(fields);
+        }
+
+        public PojoDescription(String name, List<Field> fields) {
+            this.name = name;
+            this.fields = fields;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public List<Field> getFields() {
+            return fields;
+        }
+    }
+
+    public static class Field {
+
+        private final TypeNode type;
+        private final String name;
+
+        public Field(TypeNode type, String name) {
+            this.type = type;
+            this.name = name;
+        }
+
+        public TypeNode getType() {
+            return type;
+        }
+
+        public String getName() {
+            return name;
+        }
+    }
+
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
index df13db2..a0fd2ae 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
@@ -1,13 +1,31 @@
 package org.apache.plc4x.codegen.ast;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
 public class FieldDeclaration implements Node {
 
+    private final Set<Modifier> modifiers;
     private final TypeNode type;
     private final String name;
 
-    public FieldDeclaration(TypeNode type, String name) {
+    private final Expression initializer;
+
+    public FieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        this.modifiers = modifiers;
         this.type = type;
         this.name = name;
+        this.initializer = initializer;
+    }
+
+    public FieldDeclaration(TypeNode type, String name) {
+        this(Collections.emptySet(), type, name, null);
+    }
+
+    public FieldDeclaration(TypeNode type, String name, Modifier... modifiers) {
+        this(new HashSet<>(Arrays.asList(modifiers)), type, name, null);
     }
 
     @Override public <T> T accept(NodeVisitor<T> visitor) {
@@ -15,6 +33,6 @@ public class FieldDeclaration implements Node {
     }
 
     @Override public void write(Generator writer) {
-        writer.generateFieldDeclaration(type, name);
+        writer.generateFieldDeclaration(modifiers, type, name, initializer);
     }
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
index 25a34e2..699b8c3 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
@@ -1,9 +1,17 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public interface Generator {
 
+    /**
+     * Do preliminary stuff.
+     * @param root
+     * @return
+     */
+    Node prepare(Node root);
+
     void generate(ConstantNode constantNode);
 
     void generateDeclarationWithInitializer(DeclarationStatement declarationStatement);
@@ -34,11 +42,11 @@ public interface Generator {
 
     void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass);
 
-    void generateFieldDeclaration(TypeNode type, String name);
+    void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer);
 
     void generateFieldReference(TypeNode type, String name);
 
-    void generateConstructor(String className, List<ParameterExpression> parameters, Block body);
+    void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body);
 
     void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses);
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
index 2672e81..47b8171 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
@@ -1,6 +1,7 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class JavaGenerator implements Generator {
 
@@ -10,6 +11,10 @@ public class JavaGenerator implements Generator {
         this.writer = writer;
     }
 
+    @Override public Node prepare(Node root) {
+        return root;
+    }
+
     @Override public void generate(ConstantNode constantNode) {
         writer.write(constantNode.getValue().toString());
     }
@@ -122,7 +127,7 @@ public class JavaGenerator implements Generator {
 
     @Override public void generate(MethodDefinition methodDefinition) {
         writer.startLine("public ");
-        if (methodDefinition.getModifiers().contains(MethodDefinition.Modifier.STATIC)) {
+        if (methodDefinition.getModifiers().contains(Modifier.STATIC)) {
             writer.write("static ");
         }
         // Special handling of VOID is necessary
@@ -177,7 +182,7 @@ public class JavaGenerator implements Generator {
         // Constructors
         if (constructors != null) {
             for (ConstructorDeclaration constructor : constructors) {
-                this.generateConstructor(className, constructor.getParameters(), constructor.getBody());
+                this.generateConstructor(constructor.getModifiers(), className, constructor.getParameters(), constructor.getBody());
                 writer.writeLine("");
             }
         }
@@ -199,11 +204,26 @@ public class JavaGenerator implements Generator {
         writer.writeLine("}");
     }
 
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-        writer.startLine("public ");
+    @Override public void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        if (modifiers.contains(Modifier.PRIVATE)) {
+            writer.startLine("private ");
+        } else {
+            writer.startLine("public ");
+        }
+        if (modifiers.contains(Modifier.STATIC)) {
+            writer.write("static ");
+        }
+        if (modifiers.contains(Modifier.FINAL)) {
+            writer.write("final ");
+        }
         type.write(this);
         writer.write(" ");
         writer.write(name);
+        // If it has an initializer, then do it here...
+        if (initializer != null) {
+            writer.write( " = ");
+            initializer.write(this);
+        }
         writer.write(";");
         writer.endLine();
     }
@@ -213,8 +233,12 @@ public class JavaGenerator implements Generator {
         writer.write(name);
     }
 
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
-        writer.startLine("public ");
+    @Override public void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body) {
+        if (modifiers.contains(Modifier.PRIVATE)) {
+            writer.startLine("private ");
+        } else {
+            writer.startLine("public ");
+        }
         writer.write(className);
         writer.write("(");
         for (int i = 0; i < parameters.size(); i++) {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
index 76f0346..d43fd1f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
@@ -52,9 +52,4 @@ public class MethodDefinition implements Node {
         writer.generate(this);
     }
 
-    public enum Modifier {
-        STATIC,
-        PRIVATE
-    }
-
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java
new file mode 100644
index 0000000..7d97fd0
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Modifier.java
@@ -0,0 +1,7 @@
+package org.apache.plc4x.codegen.ast;
+
+public enum Modifier {
+    STATIC,
+    PRIVATE,
+    FINAL
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
index 012e321..597ea57 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
@@ -7,9 +7,13 @@ public class NewExpression extends Expression {
 
     private List<Node> arguments;
 
-    public NewExpression(TypeNode myClazz, Node... arguments) {
+    public NewExpression(TypeNode myClazz, List<Node> arguments) {
         super(myClazz);
-        this.arguments = Arrays.asList(arguments);
+        this.arguments = arguments;
+    }
+
+    public NewExpression(TypeNode myClazz, Node... arguments) {
+        this(myClazz, Arrays.asList(arguments));
     }
 
     public List<Node> getArguments() {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
deleted file mode 100644
index f0fe64c..0000000
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.apache.plc4x.codegen.ast;
-
-import java.util.List;
-
-public class PhpGenerator implements Generator {
-
-    private final CodeWriter writer;
-
-    public PhpGenerator(CodeWriter writer) {
-        this.writer = writer;
-    }
-
-    @Override public void generate(ConstantNode constantNode) {
-        this.writer.write(constantNode.getValue().toString());
-    }
-
-    @Override public void generateDeclarationWithInitializer(DeclarationStatement declarationStatement) {
-        this.writer.startLine("");
-        this.writer.write("$");
-        this.writer.write(declarationStatement.getParameterExpression().getName());
-        this.writer.write(" = ");
-        declarationStatement.getInitializer().write(this);
-        this.writer.write("\n");
-    }
-
-    @Override public void generateDeclaration(DeclarationStatement declarationStatement) {
-
-    }
-
-    @Override public void generate(ParameterExpression parameterExpression) {
-        // not needed
-    }
-
-    @Override public void generate(Primitive primitive) {
-        // Not needed, php is typeless
-    }
-
-    @Override public void generate(IfStatement ifStatement) {
-
-    }
-
-    @Override public void writeBlock(Block statements) {
-
-    }
-
-    @Override public void generate(BinaryExpression binaryExpression) {
-
-    }
-
-    @Override public void generate(AssignementExpression assignementExpression) {
-
-    }
-
-    @Override public void generateStaticCall(Method method, List<Node> constantNode) {
-
-    }
-
-    @Override public void generateCall(Node target, Method method, List<Node> constantNode) {
-
-    }
-
-    @Override public void generate(NewExpression newExpression) {
-
-    }
-
-    @Override public void generate(MethodDefinition methodDefinition) {
-
-    }
-
-    @Override public void generateReturn(Expression value) {
-
-    }
-
-    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass) {
-
-    }
-
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-
-    }
-
-    @Override public void generateFieldReference(TypeNode type, String name) {
-
-    }
-
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
-
-    }
-
-    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
-
-    }
-
-    @Override public void generateType(String typeString) {
-
-    }
-
-    @Override public void generateComment(String comment) {
-
-    }
-
-    @Override public void generateNoOp() {
-
-    }
-}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
index bfe345f..3f01e99 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
@@ -7,6 +7,8 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static org.apache.plc4x.codegen.ast.EnumFactory.getMethodDefinition;
+
 public class PojoFactory {
 
     public ClassDefinition create(PojoDescription desc) {
@@ -17,13 +19,7 @@ public class PojoFactory {
 
         // Create the Getters
         final List<MethodDefinition> getters = desc.fields.stream()
-            .map(new Function<Field, MethodDefinition>() {
-                @Override public MethodDefinition apply(Field field) {
-                    String getter = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1, field.getName().length());
-                    Block body = new Block(new ReturnStatement(new FieldReference(field.getType(), field.getName())));
-                    return new MethodDefinition(getter, field.getType(), Collections.emptyList(), body);
-                }
-            })
+            .map(field -> getMethodDefinition(field.getName(), field.getType()))
             .collect(Collectors.toList());
 
         final List<MethodDefinition> methods = new ArrayList<>();
@@ -35,7 +31,7 @@ public class PojoFactory {
         ), new Block()));
 
         // Decode Method
-        methods.add(new MethodDefinition(Collections.singleton(MethodDefinition.Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
+        methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
             new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
         ), new Block()));
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
index 5faedfb..cccaf61 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
@@ -1,6 +1,7 @@
 package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
+import java.util.Set;
 
 public class PythonGenerator implements Generator {
 
@@ -10,6 +11,10 @@ public class PythonGenerator implements Generator {
         this.writer = writer;
     }
 
+    @Override public Node prepare(Node root) {
+        return null;
+    }
+
     @Override public void generate(ConstantNode constantNode) {
         writer.write(constantNode.getValue().toString());
     }
@@ -133,12 +138,16 @@ public class PythonGenerator implements Generator {
     }
 
     @Override public void generate(MethodDefinition methodDefinition) {
-        if (methodDefinition.getModifiers().contains(MethodDefinition.Modifier.STATIC)) {
+        if (methodDefinition.getModifiers().contains(Modifier.STATIC)) {
             writer.writeLine("@classmethod");
         }
         writer.startLine("def ");
         writer.write(methodDefinition.getName());
         writer.write("(");
+        writer.write("self");
+        if (!methodDefinition.getParameters().isEmpty()) {
+            writer.write(", ");
+        }
         for (int i = 0; i < methodDefinition.getParameters().size(); i++) {
             methodDefinition.getParameters().get(i).write(this);
             writer.write(": ");
@@ -190,7 +199,7 @@ public class PythonGenerator implements Generator {
         // Constructors
         if (constructors != null) {
             for (ConstructorDeclaration constructor : constructors) {
-                this.generateConstructor(className, constructor.getParameters(), constructor.getBody());
+                this.generateConstructor(constructor.getModifiers(), className, constructor.getParameters(), constructor.getBody());
                 writer.writeLine("");
             }
         }
@@ -211,11 +220,18 @@ public class PythonGenerator implements Generator {
         writer.endBlock();
     }
 
-    @Override public void generateFieldDeclaration(TypeNode type, String name) {
-        writer.startLine("self.");
+    @Override public void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer) {
+        writer.startLine("");
         writer.write(name);
         writer.write(": ");
         type.write(this);
+        // If its static, assign here
+        if (initializer != null) {
+            assert modifiers.contains(Modifier.STATIC);
+            // TODO Python cannot self reference
+            writer.write(" = ");
+            initializer.write(this);
+        }
         writer.endLine();
     }
 
@@ -224,7 +240,7 @@ public class PythonGenerator implements Generator {
         writer.write(name);
     }
 
-    @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
+    @Override public void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body) {
         writer.startLine("def __init__(");
         for (int i = 0; i < parameters.size(); i++) {
             parameters.get(i).getType().write(this);
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
new file mode 100644
index 0000000..df43cd7
--- /dev/null
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
@@ -0,0 +1,70 @@
+package org.apache.plc4x.codegen.ast;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class EnumFactoryTest {
+
+    @Test
+    public void createEnums() {
+        System.out.println("Java:");
+        System.out.println("----------");
+        final ClassDefinition MyEnum = newEnum();
+
+        final CodeWriter writer = new CodeWriter(4);
+        final JavaGenerator generator = new JavaGenerator(writer);
+
+        MyEnum.write(generator);
+
+        System.out.println(writer.getCode());
+    }
+
+    @Test
+    public void createEnumsInPython() {
+        System.out.println("Python:");
+        System.out.println("----------");
+        final ClassDefinition MyEnum = newEnum();
+
+        final CodeWriter writer = new CodeWriter(4);
+        final PythonGenerator generator = new PythonGenerator(writer);
+
+        MyEnum.write(generator);
+
+        System.out.println(writer.getCode());
+    }
+
+    private ClassDefinition newEnum() {
+        final EnumFactory factory = new EnumFactory();
+        final EnumFactory.PojoDescription description = new EnumFactory.PojoDescription("MyPojo",
+            new EnumFactory.Field(Primitive.DOUBLE, "field1"),
+            new EnumFactory.Field(Primitive.DOUBLE, "field2"),
+            new EnumFactory.Field(Primitive.DOUBLE, "field3")
+        );
+        return factory.create(description,
+            Arrays.asList(
+                new EnumFactory.EnumEntry("alternative1", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative2", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative3", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                )),
+                new EnumFactory.EnumEntry("alternative4", Arrays.asList(
+                    new ConstantNode(1.0),
+                    new ConstantNode(2.0),
+                    new ConstantNode(3.0)
+                ))
+            )
+        );
+    }
+
+}
\ No newline at end of file
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
deleted file mode 100644
index f5ba88f..0000000
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.apache.plc4x.codegen.ast;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class PhpGeneratorTest {
-
-    @Test
-    public void createSomeCode() {
-        final CodeWriter writer = new CodeWriter(4);
-
-        final DeclarationStatement stmt = new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(5.0));
-
-        final Generator generator = new PhpGenerator(writer);
-
-        stmt.write(generator);
-
-        final String code = writer.getCode();
-
-        assertEquals("$a = 5.0\n", code);
-    }
-}
\ No newline at end of file


[plc4x] 02/02: Added Setters to Pojos, did really awesome stuff.

Posted by jf...@apache.org.
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 579b723000c0d491afd91b449593c31e11e15f45
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 15:18:20 2019 +0200

    Added Setters to Pojos, did really awesome stuff.
---
 .../java/org/apache/plc4x/codegen/DFDLUtil.java    | 43 +++++++++++++++++++++-
 .../org/apache/plc4x/codegen/ast/EnumFactory.java  | 11 +++++-
 .../org/apache/plc4x/codegen/ast/PojoFactory.java  | 31 +++++++++++++---
 .../org/apache/plc4x/codegen/ast/Primitive.java    |  1 +
 .../org/apache/plc4x/codegen/DFDLUtilTest.java     |  2 -
 5 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
index 08331b3..04e0eb1 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
@@ -1,5 +1,13 @@
 package org.apache.plc4x.codegen;
 
+import org.apache.plc4x.codegen.ast.ClassDefinition;
+import org.apache.plc4x.codegen.ast.CodeWriter;
+import org.apache.plc4x.codegen.ast.Generator;
+import org.apache.plc4x.codegen.ast.JavaGenerator;
+import org.apache.plc4x.codegen.ast.PojoFactory;
+import org.apache.plc4x.codegen.ast.Primitive;
+import org.apache.plc4x.codegen.ast.PythonGenerator;
+import org.apache.plc4x.codegen.ast.TypeNode;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
@@ -8,6 +16,8 @@ import org.dom4j.QName;
 import org.dom4j.io.SAXReader;
 
 import java.io.File;
+import java.sql.SQLOutput;
+import java.util.ArrayList;
 import java.util.Iterator;
 
 /**
@@ -17,22 +27,51 @@ public class DFDLUtil {
 
     private static final Namespace xsNamespace = new Namespace("xs", "http://www.w3.org/2001/XMLSchema");
     private static final QName complexType = new QName("complexType", xsNamespace);
+    private static final QName sequence = new QName("sequence", xsNamespace);
+    private static final QName ELEMENT = new QName("element", xsNamespace);
 
     public void transform(File dfdlSchemaFile, File outputDir) {
         assert outputDir.exists();
         assert outputDir.isDirectory();
 
-
         final Document schema = parseDFDLSchema(dfdlSchemaFile);
 
         final Iterator<Element> iterator = getMainTypes(schema);
 
+        final PojoFactory factory = new PojoFactory();
         while (iterator.hasNext()) {
             final Element element = iterator.next();
-            System.out.println(element);
+            final Iterator<Element> sequenceIterator = element.elementIterator(sequence);
+            final Element sequence = getSequence(sequenceIterator);
+
+            // Now make a POJO with all "elements" as fields
+            final ArrayList<PojoFactory.Field> fields = new ArrayList<>();
+            final Iterator<Element> elementIterator = sequence.elementIterator(ELEMENT);
+            while (elementIterator.hasNext()) {
+                final Element elem = elementIterator.next();
+                fields.add(new PojoFactory.Field(new TypeNode(elem.attributeValue("type")), elem.attributeValue("name")));
+            }
+            final PojoFactory.PojoDescription desc = new PojoFactory.PojoDescription(element.attributeValue("name"), fields);
+            final ClassDefinition classDefinition = factory.create(desc);
+
+            // Now generate the code for that
+            final CodeWriter writer = new CodeWriter(4);
+            final Generator generator = new JavaGenerator(writer);
+            classDefinition.write(generator);
+
+            System.out.println("Class Definition");
+            System.out.println("----------------------------");
+            System.out.println(writer.getCode());
         }
     }
 
+    private Element getSequence(Iterator<Element> sequenceIterator) {
+        assert sequenceIterator.hasNext();
+        final Element sequence = sequenceIterator.next();
+        assert sequenceIterator.hasNext() == false;
+        return sequence;
+    }
+
     private Document parseDFDLSchema(File schemaFile) {
         try {
             SAXReader reader = new SAXReader();
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
index b1b422f..40b2494 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
@@ -27,7 +27,7 @@ public class EnumFactory {
 
         // Create the Getters
         final List<MethodDefinition> getters = desc.fields.stream()
-            .map(field -> getMethodDefinition(field.getName(), field.getType()))
+            .map(field -> getGetterDefinition(field.getName(), field.getType()))
             .collect(Collectors.toList());
 
         // Now add all these getters
@@ -59,12 +59,19 @@ public class EnumFactory {
         return new ClassDefinition("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
     }
 
-    static MethodDefinition getMethodDefinition(String name, TypeNode type) {
+    static MethodDefinition getGetterDefinition(String name, TypeNode type) {
         String getter = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
         Block body = new Block(new ReturnStatement(new FieldReference(type, name)));
         return new MethodDefinition(getter, type, Collections.emptyList(), body);
     }
 
+    static MethodDefinition getSetterDefinition(String name, TypeNode type) {
+        String getter = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
+        final ParameterExpression param = new ParameterExpression(type, name);
+        Block body = new Block(new AssignementExpression(new FieldReference(type, name), param));
+        return new MethodDefinition(getter, type, Collections.singletonList(param), body);
+    }
+
     public static class EnumEntry {
 
         private final String name;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
index 3f01e99..c775a0c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
@@ -4,13 +4,17 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static org.apache.plc4x.codegen.ast.EnumFactory.getMethodDefinition;
+import static org.apache.plc4x.codegen.ast.EnumFactory.getGetterDefinition;
+import static org.apache.plc4x.codegen.ast.EnumFactory.getSetterDefinition;
 
 public class PojoFactory {
 
+    private TypeNode BUFFER_TYPE;
+
+    private Method readByte = new Method(BUFFER_TYPE, "readByte", Primitive.BYTE, Collections.emptyList(), Collections.emptyList());
+
     public ClassDefinition create(PojoDescription desc) {
         // Create all Fields first
         final List<FieldDeclaration> fields = desc.fields.stream()
@@ -19,21 +23,36 @@ public class PojoFactory {
 
         // Create the Getters
         final List<MethodDefinition> getters = desc.fields.stream()
-            .map(field -> getMethodDefinition(field.getName(), field.getType()))
+            .map(field -> getGetterDefinition(field.getName(), field.getType()))
+            .collect(Collectors.toList());
+
+        // Create the Setters
+        final List<MethodDefinition> setters = desc.fields.stream()
+            .map(field -> getSetterDefinition(field.getName(), field.getType()))
             .collect(Collectors.toList());
 
         final List<MethodDefinition> methods = new ArrayList<>();
 
         methods.addAll(getters);
+        methods.addAll(setters);
+
         // Encode Method
         methods.add(new MethodDefinition("encode", Primitive.VOID, Collections.singletonList(
             new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
         ), new Block()));
 
         // Decode Method
-        methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", new TypeNode(desc.getName()), Collections.singletonList(
-            new ParameterExpression(new TypeNode("org.apache.plc4x.api.Buffer"), "buffer")
-        ), new Block()));
+        BUFFER_TYPE = new TypeNode("org.apache.plc4x.api.Buffer");
+        final ParameterExpression buffer = new ParameterExpression(BUFFER_TYPE, "buffer");
+        final TypeNode clazz = new TypeNode(desc.getName());
+        final ParameterExpression instance = new ParameterExpression(clazz, "instance");
+        methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", clazz, Collections.singletonList(
+            buffer
+        ), new Block(
+            new AssignementExpression(instance, new NewExpression(clazz)),
+            new CallExpression(readByte, buffer),
+            new ReturnStatement(instance)
+        )));
 
 
         return new ClassDefinition("", desc.getName(), fields, Arrays.asList(new ConstructorDeclaration(Collections.emptyList(), new Block())), methods, null);
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
index fcfeef9..e820859 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
@@ -4,6 +4,7 @@ public class Primitive extends TypeNode {
 
     public static final TypeNode DOUBLE = new Primitive("double");
     public static final TypeNode VOID = new Primitive("Void");
+    public static final TypeNode BYTE = new Primitive("byte");
 
     public Primitive(String typeString) {
         super(typeString);
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
index df89b0c..e424681 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
@@ -4,8 +4,6 @@ import org.junit.Test;
 
 import java.io.File;
 
-import static org.junit.Assert.*;
-
 public class DFDLUtilTest {
 
     @Test