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