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 15:47:38 UTC

[plc4x] 02/02: Now even Inner Classes are supported.

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 f0600d054c12924a8b6f00d5e64ca43b7e644ab0
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sat May 4 17:47:26 2019 +0200

    Now even Inner Classes are supported.
---
 .../plc4x/codegen/version2/ClassDefinition.java    | 30 ++++++++++++++-
 .../apache/plc4x/codegen/version2/FileNode.java    | 25 ++++++++++++
 .../apache/plc4x/codegen/version2/Generator.java   |  4 +-
 .../plc4x/codegen/version2/JavaGenerator.java      | 22 +++++++++--
 .../plc4x/codegen/version2/PhpGenerator.java       |  6 ++-
 .../plc4x/codegen/version2/JavaGeneratorTest.java  | 45 ++++++++++++++++++++--
 6 files changed, 121 insertions(+), 11 deletions(-)

diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java
index 76c33a7..ce212a3 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java
@@ -10,13 +10,39 @@ public class ClassDefinition implements Node {
     private final List<FieldDeclaration> fields;
     private final List<ConstructorDeclaration> constructors;
     private final List<MethodDefinition> methods;
+    private final List<ClassDefinition> innerClasses;
 
-    public ClassDefinition(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods) {
+    public ClassDefinition(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses) {
         this.namespace = namespace;
         this.className = className;
         this.fields = fields;
         this.constructors = constructors;
         this.methods = methods;
+        this.innerClasses = innerClasses;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public List<FieldDeclaration> getFields() {
+        return fields;
+    }
+
+    public List<ConstructorDeclaration> getConstructors() {
+        return constructors;
+    }
+
+    public List<MethodDefinition> getMethods() {
+        return methods;
+    }
+
+    public List<ClassDefinition> getInnerClasses() {
+        return innerClasses;
     }
 
     @Override public <T> T accept(NodeVisitor<T> visitor) {
@@ -24,6 +50,6 @@ public class ClassDefinition implements Node {
     }
 
     @Override public void write(Generator writer) {
-        writer.generateClass(this.namespace, this.className, this.fields, this.constructors, this.methods);
+        writer.generateClass(this.namespace, this.className, this.fields, this.constructors, this.methods, innerClasses, true);
     }
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java
new file mode 100644
index 0000000..36cc3a7
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java
@@ -0,0 +1,25 @@
+package org.apache.plc4x.codegen.version2;
+
+import java.util.List;
+
+/**
+ * Defines a File in Java
+ */
+public class FileNode implements Node {
+
+    private final ClassDefinition mainClass;
+    private final List<ClassDefinition> innerClasses;
+
+    public FileNode(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+        this.mainClass = mainClass;
+        this.innerClasses = innerClasses;
+    }
+
+    @Override public <T> T accept(NodeVisitor<T> visitor) {
+        return null;
+    }
+
+    @Override public void write(Generator writer) {
+        writer.generateFile(mainClass, innerClasses);
+    }
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java
index 687164a..5d06f13 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java
@@ -32,11 +32,13 @@ public interface Generator {
 
     void generateReturn(Expression value);
 
-    void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods);
+    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 generateFieldReference(TypeNode type, String name);
 
     void generateConstructor(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/version2/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
index 665500e..899c8fb 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
@@ -143,10 +143,14 @@ public class JavaGenerator implements Generator {
         value.write(this);
     }
 
-    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods) {
+    @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.write("public class ");
+        writer.startLine("public ");
+        if (!mainClass) {
+            writer.write("static ");
+        }
+        writer.write("class ");
         writer.write(className);
         // TODO extends / implements
         writer.write(" {");
@@ -172,9 +176,15 @@ public class JavaGenerator implements Generator {
             writer.writeLine("");
         }
 
+        // If there are inner classes, implement them
+        if (innerClasses != null) {
+            for (ClassDefinition innerClass : innerClasses) {
+                this.generateClass(innerClass.getNamespace(), innerClass.getClassName(), innerClass.getFields(), innerClass.getConstructors(), innerClass.getMethods(), innerClass.getInnerClasses(), false);
+            }
+        }
+
         writer.endBlock();
-        writer.write("}");
-        writer.endLine();
+        writer.writeLine("}");
     }
 
     @Override public void generateFieldDeclaration(TypeNode type, String name) {
@@ -209,6 +219,10 @@ public class JavaGenerator implements Generator {
         writer.writeLine("}");
     }
 
+    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+        generateClass(mainClass.getNamespace(), mainClass.getClassName(), mainClass.getFields(), mainClass.getConstructors(), mainClass.getMethods(), innerClasses, true);
+    }
+
     private String getOperator(BinaryExpression.Operation op) {
         switch (op) {
             case EQ:
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java
index 279a525..c5a71e7 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java
@@ -71,7 +71,7 @@ public class PhpGenerator implements Generator {
 
     }
 
-    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods) {
+    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass) {
 
     }
 
@@ -86,4 +86,8 @@ public class PhpGenerator implements Generator {
     @Override public void generateConstructor(String className, List<ParameterExpression> parameters, Block body) {
 
     }
+
+    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+
+    }
 }
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java
index ae4f312..ad1738a 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java
@@ -159,6 +159,7 @@ public class JavaGeneratorTest {
     @Test
     public void defineClass() {
         final FieldDeclaration current = new FieldDeclaration(Primitive.DOUBLE, "current");
+        final FieldReference currentRef = new FieldReference(Primitive.DOUBLE, "current");
 
         final ParameterExpression a = new ParameterExpression(Primitive.DOUBLE, "a");
         final ParameterExpression b = new ParameterExpression(Primitive.DOUBLE, "b");
@@ -173,7 +174,6 @@ public class JavaGeneratorTest {
                 )
             )
         );
-        final FieldReference currentRef = new FieldReference(Primitive.DOUBLE, "current");
         final MethodDefinition inc = new MethodDefinition("inc", Primitive.VOID,
             Collections.EMPTY_LIST,
             new Block(
@@ -184,7 +184,7 @@ public class JavaGeneratorTest {
             )
         );
 
-        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x", "MyClazz", Arrays.asList(current), Collections.emptyList(), Arrays.asList(inc, decl));
+        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x", "MyClazz", Arrays.asList(current), Collections.emptyList(), Arrays.asList(inc, decl), null);
 
         clazz.write(generator);
         final String code = writer.getCode();
@@ -219,7 +219,43 @@ public class JavaGeneratorTest {
                     new Block(new AssignementExpression(currentRef, value))
                 )
             ),
-            Collections.emptyList());
+            Collections.emptyList(), null);
+
+        clazz.write(generator);
+        final String code = writer.getCode();
+        assertEquals("public class MyClazz {\n" +
+            "    \n" +
+            "    public double current;\n" +
+            "    \n" +
+            "    public MyClazz(double value) {\n" +
+            "        this.current = value;\n" +
+            "    }\n" +
+            "    \n" +
+            "}\n", code);
+    }
+
+    @Test
+    public void defineClassWithInnerClass() {
+        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();
@@ -231,6 +267,9 @@ public class JavaGeneratorTest {
             "        this.current = value;\n" +
             "    }\n" +
             "    \n" +
+            "    public static class MyInnerClazz {\n" +
+            "        \n" +
+            "    }\n" +
             "}\n", code);
     }
 }
\ No newline at end of file