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 14:44:14 UTC

[plc4x] branch feature/code-gen updated: Some Documentation... adding Facade Factory.

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


The following commit(s) were added to refs/heads/feature/code-gen by this push:
     new 1df8c8d  Some Documentation... adding Facade Factory.
1df8c8d is described below

commit 1df8c8dfc7d9c2357ed68aee08b5f0d7f9b818b8
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 16:42:53 2019 +0200

    Some Documentation... adding Facade Factory.
---
 .../org/apache/plc4x/codegen/ast/Expressions.java  | 87 ++++++++++++++++++++++
 .../org/apache/plc4x/codegen/ast/Generator.java    |  2 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    | 45 ++++++++---
 .../java/org/apache/plc4x/codegen/ast/Method.java  |  2 +
 .../org/apache/plc4x/codegen/ast/Primitive.java    | 32 ++++++--
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |  2 +-
 .../plc4x/codegen/{ast => util}/EnumFactory.java   |  0
 .../plc4x/codegen/{ast => util}/PojoFactory.java   |  0
 .../apache/plc4x/codegen/ast/EnumFactoryTest.java  |  1 +
 .../apache/plc4x/codegen/ast/PojoFactoryTest.java  |  1 +
 10 files changed, 153 insertions(+), 19 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expressions.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expressions.java
new file mode 100644
index 0000000..728021a
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expressions.java
@@ -0,0 +1,87 @@
+package org.apache.plc4x.codegen.ast;
+
+/**
+ * General Factory method to use.
+ */
+public class Expressions {
+
+    /**
+     * Assign a value to a target (field or parameter)
+     * @param target Where the value is assigned
+     * @param value What to assign
+     * @return Assignment Expression
+     */
+    public static Expression assignment(Expression target, Node value) {
+        return new AssignementExpression(target, value);
+    }
+
+    /**
+     * Base for all Binary Expression, i.e., Expressions which take
+     * two inputs and return one Output.
+     * Examples are Comparators, Math, ... .
+     * @param type Type of the returned expression
+     * @param left
+     * @param right
+     * @param op
+     * @return
+     */
+    public static Expression binaryExpression(TypeNode type, Node left, Node right, Operation op) {
+        return new BinaryExpression(type, left, right, op);
+    }
+
+    /**
+     * A Block of code.
+     * @param statements
+     * @return
+     */
+    public static Statement block(List<Node> statements) {
+        return new Block(statements);
+    }
+
+    /**
+     * A block of code.
+     * @param statements
+     * @return
+     */
+    public static Statement block(Node... statements) {
+        return new Block(statements);
+    }
+
+    /**
+     * Regular (dynamic) call.
+     * @param instance
+     * @param method
+     * @param arguments
+     */
+    public static Expression call(Node instance, Method method, Arguments... arguments) {
+        return new CallExpression(method, target, arguments);
+    }
+
+    /**
+     * Static call (call to a static method)
+     * 
+     * TODO check if Method is static
+     * 
+     * @param method
+     * @param arguments
+     */
+    public static Expression staticCall(Method method, Arguments... arguments) {
+        return new CallExpression(method, null, arguments);
+    }
+
+    /**
+     * Conditional Statement of the form
+     * <code>
+     * if (cond1) {
+     *  ...
+     * } else if (cond2) {
+     *  ...
+     * } else {
+     *  ...
+     * }
+     * </code>
+     */
+    public static Statement conditionalStatement(List<Expression> condition, List<Block> blocks) {
+        return new IfStatement(condition, blocks);
+    }
+}
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 3e3d323..6179060 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
@@ -38,7 +38,7 @@ public interface Generator {
 
     void generate(ParameterExpression parameterExpression);
 
-    void generate(Primitive primitive);
+    void generatePrimitive(Primitive.DataType primitive);
 
     void generate(IfStatement ifStatement);
 
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 bfaebb1..d9a14c9 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
@@ -23,6 +23,8 @@ import java.util.Set;
 
 public class JavaGenerator implements Generator {
 
+    public static final String PUBLIC_ = "public ";
+    public static final String STATIC_ = "static ";
     private final CodeWriter writer;
 
     public JavaGenerator(CodeWriter writer) {
@@ -55,8 +57,29 @@ public class JavaGenerator implements Generator {
         writer.write(parameterExpression.getName());
     }
 
-    @Override public void generate(Primitive primitive) {
-        writer.write(primitive.getTypeString());
+    @Override public void generatePrimitive(Primitive.DataType primitive) {
+        switch (primitive) {
+            case STRING:
+                writer.write("String");
+                break;
+            case DOUBLE:
+                writer.write("Double");
+                break;
+            case LONG:
+                writer.write("Long");
+                break;
+            case INTEGER:
+                writer.write("Integer");
+                break;
+            case BOOLEAN:
+                writer.write("Boolean");
+                break;
+            case VOID:
+                writer.write("Void");
+                break;
+            default:
+                throw new UnsupportedOperationException("The primitive type " + primitive + " is not implemented!");
+        }
     }
 
     @Override public void generate(IfStatement ifStatement) {
@@ -144,12 +167,12 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void generate(MethodDefinition methodDefinition) {
-        writer.startLine("public ");
+        writer.startLine(PUBLIC_);
         if (methodDefinition.getModifiers().contains(Modifier.STATIC)) {
-            writer.write("static ");
+            writer.write(STATIC_);
         }
-        // Special handling of VOID is necessary
-        if (methodDefinition.getResultType() == Primitive.VOID) {
+        // Special handling of VOID is necessary, in fact... is it?
+        if ("Void".equals(methodDefinition.getResultType().toString())) {
             writer.write("void");
         } else {
             methodDefinition.getResultType().write(this);
@@ -179,9 +202,9 @@ 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 ");
+        writer.startLine(PUBLIC_);
         if (!mainClass) {
-            writer.write("static ");
+            writer.write(STATIC_);
         }
         writer.write("class ");
         writer.write(className);
@@ -226,10 +249,10 @@ public class JavaGenerator implements Generator {
         if (modifiers.contains(Modifier.PRIVATE)) {
             writer.startLine("private ");
         } else {
-            writer.startLine("public ");
+            writer.startLine(PUBLIC_);
         }
         if (modifiers.contains(Modifier.STATIC)) {
-            writer.write("static ");
+            writer.write(STATIC_);
         }
         if (modifiers.contains(Modifier.FINAL)) {
             writer.write("final ");
@@ -255,7 +278,7 @@ public class JavaGenerator implements Generator {
         if (modifiers.contains(Modifier.PRIVATE)) {
             writer.startLine("private ");
         } else {
-            writer.startLine("public ");
+            writer.startLine(PUBLIC_);
         }
         writer.write(className);
         writer.write("(");
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
index a3698d6..89b5491 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
@@ -22,6 +22,8 @@ import java.util.List;
 
 /**
  * Method Declaration
+ * 
+ * TODO is this duplicate to something???
  */
 public class Method implements Node {
 
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 fcdd625..61e7ce3 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
@@ -20,12 +20,23 @@ package org.apache.plc4x.codegen.ast;
 
 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");
+    // Shorthands
+    public static final Primitive VOID = new Primitive(DataType.VOID);
+    public static final Primitive BOOLEAN = new Primitive(DataType.BOOLEAN);
+    public static final Primitive INTEGER = new Primitive(DataType.INTEGER);
+    public static final Primitive LONG = new Primitive(DataType.LONG);
+    public static final Primitive DOUBLE = new Primitive(DataType.DOUBLE);
+    public static final Primitive STRING = new Primitive(DataType.STRING);
 
-    public Primitive(String typeString) {
-        super(typeString);
+    private final DataType type;
+
+    public Primitive(DataType dataType) {
+        super(dataType.toString());
+        this.type = dataType;
+    }
+
+    public DataType getType() {
+        return type;
     }
 
     @Override public <T> T accept(NodeVisitor<T> visitor) {
@@ -33,6 +44,15 @@ public class Primitive extends TypeNode {
     }
 
     @Override public void write(Generator generator) {
-        generator.generate(this);
+        generator.generatePrimitive(this.getType());
+    }
+
+    public enum DataType {
+        VOID,
+        BOOLEAN,
+        INTEGER,
+        LONG,
+        DOUBLE,
+        STRING
     }
 }
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 d39a12c..31087b5 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
@@ -56,7 +56,7 @@ public class PythonGenerator implements Generator {
         writer.write(parameterExpression.getName());
     }
 
-    @Override public void generate(Primitive primitive) {
+    @Override public void generatePrimitive(Primitive.DataType primitive) {
         writer.write(primitive.getTypeString());
     }
 
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/util/EnumFactory.java
similarity index 100%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/EnumFactory.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/EnumFactory.java
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/util/PojoFactory.java
similarity index 100%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/PojoFactory.java
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
index 22fdfff..798de27 100644
--- 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
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.codegen.ast;
 
+import org.apache.plc4x.codegen.util.EnumFactory;
 import org.junit.Test;
 
 import java.util.Arrays;
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
index 23af1a8..2035b77 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.codegen.ast;
 
+import org.apache.plc4x.codegen.util.PojoFactory;
 import org.junit.Test;
 
 public class PojoFactoryTest {