You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by tm...@apache.org on 2019/05/05 16:38:57 UTC

[plc4x] 01/04: Next step in the Refactoring, class structure is way cleaner now.

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

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

commit b80c6039991e62c1c5cbf83fbadeb17497baa590
Author: julian <j....@pragmaticminds.de>
AuthorDate: Sun May 5 17:51:43 2019 +0200

    Next step in the Refactoring, class structure is way cleaner now.
---
 .../java/org/apache/plc4x/codegen/DFDLUtil.java    |   5 +-
 ...{ClassDefinition.java => ClassDeclaration.java} |   8 +-
 .../{ConstantNode.java => ConstantExpression.java} |  10 +-
 .../{FieldReference.java => ExceptionType.java}    |  18 ++--
 .../org/apache/plc4x/codegen/ast/Expressions.java  | 119 ++++++++++++++++++++-
 .../apache/plc4x/codegen/ast/FieldReference.java   |  12 ++-
 .../org/apache/plc4x/codegen/ast/FileNode.java     |   6 +-
 .../org/apache/plc4x/codegen/ast/Generator.java    |   6 +-
 .../org/apache/plc4x/codegen/ast/IfStatement.java  |   7 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    |  13 ++-
 .../java/org/apache/plc4x/codegen/ast/Method.java  |   6 +-
 .../apache/plc4x/codegen/ast/MethodDefinition.java |   2 +-
 .../org/apache/plc4x/codegen/ast/NodeVisitor.java  |   2 +-
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |  29 +++--
 .../ast/{ConstantNode.java => UnknownType.java}    |  28 ++---
 .../org/apache/plc4x/codegen/util/EnumFactory.java |  12 ++-
 .../org/apache/plc4x/codegen/util/PojoFactory.java |  16 +--
 .../plc4x/codegen/ast/JavaGeneratorTest.java       |  70 ++++++------
 .../plc4x/codegen/ast/PythonGeneratorTest.java     |  12 +--
 .../codegen/{ast => util}/EnumFactoryTest.java     |  33 +++---
 .../codegen/{ast => util}/PojoFactoryTest.java     |  11 +-
 21 files changed, 296 insertions(+), 129 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 eae3e45..7a97ae1 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
@@ -19,6 +19,7 @@ under the License.
 package org.apache.plc4x.codegen;
 
 import org.apache.plc4x.codegen.ast.*;
+import org.apache.plc4x.codegen.util.PojoFactory;
 import org.dom4j.*;
 import org.dom4j.io.SAXReader;
 
@@ -58,12 +59,12 @@ public class DFDLUtil {
                 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);
+            final ClassDeclaration classDeclaration = factory.create(desc);
 
             // Now generate the code for that
             final CodeWriter writer = new CodeWriter(4);
             final Generator generator = new JavaGenerator(writer);
-            classDefinition.write(generator);
+            classDeclaration.write(generator);
 
             System.out.println("Class Definition");
             System.out.println("----------------------------");
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDeclaration.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDeclaration.java
index 87828fb..8c10a75 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDeclaration.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
-public class ClassDefinition implements Node {
+public class ClassDeclaration implements Node {
 
     private final String namespace;
     private final String className;
@@ -28,9 +28,9 @@ 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;
+    private final List<ClassDeclaration> innerClasses;
 
-    public ClassDefinition(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses) {
+    public ClassDeclaration(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDeclaration> innerClasses) {
         this.namespace = namespace;
         this.className = className;
         this.fields = fields;
@@ -59,7 +59,7 @@ public class ClassDefinition implements Node {
         return methods;
     }
 
-    public List<ClassDefinition> getInnerClasses() {
+    public List<ClassDeclaration> getInnerClasses() {
         return innerClasses;
     }
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantExpression.java
similarity index 82%
copy from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
copy to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantExpression.java
index 6b4e52a..83b71e1 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantExpression.java
@@ -18,15 +18,19 @@ under the License.
 */
 package org.apache.plc4x.codegen.ast;
 
-public class ConstantNode extends Expression {
+public class ConstantExpression extends Expression {
 
     private Object value;
 
-    public ConstantNode(Object value) {
-        super(TypeUtil.infer(value));
+    public ConstantExpression(TypeNode type, Object value) {
+        super(type);
         this.value = value;
     }
 
+    public ConstantExpression(Object value) {
+        this(TypeUtil.infer(value), value);
+    }
+
     public Object getValue() {
         return value;
     }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ExceptionType.java
similarity index 73%
copy from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
copy to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ExceptionType.java
index f85e129..9e165c8 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ExceptionType.java
@@ -18,17 +18,23 @@ under the License.
 */
 package org.apache.plc4x.codegen.ast;
 
-public class FieldReference extends ParameterExpression {
+/**
+ * Defines an Exception-Type.
+ */
+public class ExceptionType extends TypeNode {
 
-    public FieldReference(TypeNode type, String name) {
-        super(type, name);
+    public ExceptionType(String typeString) {
+        super(typeString);
     }
 
-    @Override public <T> T accept(NodeVisitor<T> visitor) {
+    @Override
+    public <T> T accept(NodeVisitor<T> visitor) {
         return null;
     }
 
-    @Override public void write(Generator writer) {
-        writer.generateFieldReference(type, getName());
+    @Override
+    public void write(Generator writer) {
+
     }
+
 }
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
index 728021a..6f7008a 100644
--- 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
@@ -1,10 +1,35 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
 package org.apache.plc4x.codegen.ast;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * General Factory method to use.
  */
 public class Expressions {
 
+    private Expressions() {
+        // do not instantiate
+    }
+
     /**
      * Assign a value to a target (field or parameter)
      * @param target Where the value is assigned
@@ -25,7 +50,7 @@ public class Expressions {
      * @param op
      * @return
      */
-    public static Expression binaryExpression(TypeNode type, Node left, Node right, Operation op) {
+    public static Expression binaryExpression(TypeNode type, Node left, Node right, BinaryExpression.Operation op) {
         return new BinaryExpression(type, left, right, op);
     }
 
@@ -53,8 +78,8 @@ public class Expressions {
      * @param method
      * @param arguments
      */
-    public static Expression call(Node instance, Method method, Arguments... arguments) {
-        return new CallExpression(method, target, arguments);
+    public static Expression call(Node instance, Method method, Node... arguments) {
+        return new CallExpression(method, instance, arguments);
     }
 
     /**
@@ -65,11 +90,19 @@ public class Expressions {
      * @param method
      * @param arguments
      */
-    public static Expression staticCall(Method method, Arguments... arguments) {
+    public static Expression staticCall(Method method, Node... arguments) {
         return new CallExpression(method, null, arguments);
     }
 
     /**
+     * Simple if-then-else.
+     * If no else is needed, orElse can be null.
+     */
+    public static Statement ifElse(Expression condition, Block then, Block orElse) {
+        return new IfStatement(condition, then, orElse);
+    }
+
+    /**
      * Conditional Statement of the form
      * <code>
      * if (cond1) {
@@ -84,4 +117,82 @@ public class Expressions {
     public static Statement conditionalStatement(List<Expression> condition, List<Block> blocks) {
         return new IfStatement(condition, blocks);
     }
+
+    /**
+     * Defines a compile time constant and infers the type based on what java would do.
+     */
+    public static Expression constant(Object value) {
+        return new ConstantExpression(value);
+    }
+
+    /**
+     * Define a compile time constant and also passes
+     * the expected type for usage in the code generation later.
+     */
+    public static Expression constant(TypeNode type, Object value) {
+        return new ConstantExpression(value);
+    }
+
+    /**
+     * Declares a constant (no field).
+     * Variable type is infered from the initializing expression.
+     */
+    public static Statement declaration(String variable, Expression initializer) {
+        return new DeclarationStatement(parameter(variable, initializer.getType()), initializer);
+    }
+
+    /**
+     * Declares a constant (no field), which is not initialized.
+     */
+    public static Statement declaration(String variable, TypeNode type) {
+        return new DeclarationStatement(parameter(variable, type), null);
+    }
+
+    /**
+     * Reference to a field in the surrounding class.
+     */
+    public static Expression field(String name) {
+        return new FieldReference(new UnknownType(), name);
+    }
+
+    /**
+     * Reference to a field on the given target
+     */
+    public static Expression field(Node target, String name) {
+        return new FieldReference(new UnknownType(), name, target);
+    }
+
+    /**
+     * Adds a line of comment.
+     */
+    public static Node comment(String comment) {
+        return new LineComment(comment);
+    }
+
+    /**
+     * Simple call to a method which throws no exception and that stuff.
+     */
+    public static Expression call(Node target, String methodName, Node... arguments) {
+        return new CallExpression(
+            new Method(UnknownType.INSTANCE, methodName, UnknownType.INSTANCE,
+                Collections.<TypeNode>emptyList(), Collections.<ExceptionType>emptyList()),
+            target,
+            arguments
+        );
+    }
+
+    /**
+     * Reference to a Method, similar than field-reference
+     * @return
+     */
+    public static Method method(TypeNode definingClass, String name, TypeNode returnType, List<TypeNode> parameterTypes, List<ExceptionType> exceptions) {
+        return new Method(definingClass, name, returnType, parameterTypes, exceptions);
+    }
+
+    /**
+     * Declares a variable.
+     */
+    public static ParameterExpression parameter(String name, TypeNode type) {
+        return new ParameterExpression(type, name);
+    }
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
index f85e129..aa9f14d 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
@@ -20,8 +20,18 @@ package org.apache.plc4x.codegen.ast;
 
 public class FieldReference extends ParameterExpression {
 
-    public FieldReference(TypeNode type, String name) {
+    private final Node target;
+
+    /**
+     * if target == null, reference on a field in the surrounding class ("this")
+     */
+    public FieldReference(TypeNode type, String name, Node target) {
         super(type, name);
+        this.target = target;
+    }
+
+    public FieldReference(TypeNode type, String name) {
+        this(type, name, null);
     }
 
     @Override public <T> T accept(NodeVisitor<T> visitor) {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
index df67708..3906979 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
@@ -25,10 +25,10 @@ import java.util.List;
  */
 public class FileNode implements Node {
 
-    private final ClassDefinition mainClass;
-    private final List<ClassDefinition> innerClasses;
+    private final ClassDeclaration mainClass;
+    private final List<ClassDeclaration> innerClasses;
 
-    public FileNode(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+    public FileNode(ClassDeclaration mainClass, List<ClassDeclaration> innerClasses) {
         this.mainClass = mainClass;
         this.innerClasses = innerClasses;
     }
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 6179060..4fdf6c3 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
@@ -30,7 +30,7 @@ public interface Generator {
      */
     Node prepare(Node root);
 
-    void generate(ConstantNode constantNode);
+    void generate(ConstantExpression constantExpression);
 
     void generateDeclarationWithInitializer(DeclarationStatement declarationStatement);
 
@@ -58,7 +58,7 @@ public interface Generator {
 
     void generateReturn(Expression value);
 
-    void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDefinition> innerClasses, boolean mainClass);
+    void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDeclaration> innerClasses, boolean mainClass);
 
     void generateFieldDeclaration(Set<Modifier> modifiers, TypeNode type, String name, Expression initializer);
 
@@ -66,7 +66,7 @@ public interface Generator {
 
     void generateConstructor(Set<Modifier> modifiers, String className, List<ParameterExpression> parameters, Block body);
 
-    void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses);
+    void generateFile(ClassDeclaration mainClass, List<ClassDeclaration> innerClasses);
 
     void generateType(String typeString);
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
index f8f30ca..14aa327 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
@@ -27,7 +27,12 @@ public class IfStatement extends Statement {
     private List<Block> blocks;
 
     public IfStatement(Expression condition, Block body, Block orElse) {
-        this(Arrays.asList(condition), Arrays.asList(body, orElse));
+        this.condition = Arrays.asList(condition);
+        if (orElse == null) {
+            this.blocks = Arrays.asList(body);
+        } else {
+            this.blocks = Arrays.asList(body, orElse);
+        }
     }
 
     public IfStatement(List<Expression> condition, List<Block> blocks) {
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 d9a14c9..f46a039 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
@@ -35,8 +35,8 @@ public class JavaGenerator implements Generator {
         return root;
     }
 
-    @Override public void generate(ConstantNode constantNode) {
-        writer.write(constantNode.getValue().toString());
+    @Override public void generate(ConstantExpression constantExpression) {
+        writer.write(constantExpression.getValue().toString());
     }
 
     @Override public void generateDeclarationWithInitializer(DeclarationStatement declarationStatement) {
@@ -102,6 +102,9 @@ public class JavaGenerator implements Generator {
     }
 
     @Override public void writeBlock(Block statements) {
+        if (statements == null) {
+            return;
+        }
         writer.startBlock();
         for (Node statement : statements.getStatements()) {
             // Dont to the wrapping for If Statements
@@ -199,7 +202,7 @@ 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, List<ClassDefinition> innerClasses, boolean mainClass) {
+    @Override public void generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDeclaration> innerClasses, boolean mainClass) {
         // Add static?!
         // Own File?
         writer.startLine(PUBLIC_);
@@ -236,7 +239,7 @@ public class JavaGenerator implements Generator {
 
         // If there are inner classes, implement them
         if (innerClasses != null) {
-            for (ClassDefinition innerClass : innerClasses) {
+            for (ClassDeclaration innerClass : innerClasses) {
                 this.generateClass(innerClass.getNamespace(), innerClass.getClassName(), innerClass.getFields(), innerClass.getConstructors(), innerClass.getMethods(), innerClass.getInnerClasses(), false);
             }
         }
@@ -296,7 +299,7 @@ public class JavaGenerator implements Generator {
         writer.writeLine("}");
     }
 
-    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+    @Override public void generateFile(ClassDeclaration mainClass, List<ClassDeclaration> innerClasses) {
         generateClass(mainClass.getNamespace(), mainClass.getClassName(), mainClass.getFields(), mainClass.getConstructors(), mainClass.getMethods(), innerClasses, true);
     }
 
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 89b5491..b3555ed 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
@@ -31,9 +31,9 @@ public class Method implements Node {
     private final String name;
     private final TypeNode returnType;
     private final List<TypeNode> parameterTypes;
-    private final List<TypeNode> expressionTypes;
+    private final List<ExceptionType> expressionTypes;
 
-    public Method(TypeNode type, String name, TypeNode returnType, List<TypeNode> parameterTypes, List<TypeNode> expressionTypes) {
+    public Method(TypeNode type, String name, TypeNode returnType, List<TypeNode> parameterTypes, List<ExceptionType> expressionTypes) {
         this.type = type;
         this.name = name;
         this.returnType = returnType;
@@ -57,7 +57,7 @@ public class Method implements Node {
         return parameterTypes;
     }
 
-    public List<TypeNode> getExpressionTypes() {
+    public List<ExceptionType> getExpressionTypes() {
         return expressionTypes;
     }
 
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 fc41598..3e71599 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
@@ -39,7 +39,7 @@ public class MethodDefinition implements Node {
     }
 
     public MethodDefinition(String name, TypeNode resultType, List<ParameterExpression> parameters, Block body) {
-        this(Collections.emptySet(), name, resultType, parameters, body);
+        this(Collections.<Modifier>emptySet(), name, resultType, parameters, body);
     }
 
     public Set<Modifier> getModifiers() {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
index 76737c6..508a1a2 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.codegen.ast;
 
 public interface NodeVisitor<T> {
 
-    T visit(ConstantNode constantNode);
+    T visit(ConstantExpression constantExpression);
 
     T visit(DeclarationStatement declarationStatement);
 
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 31087b5..6eb9314 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
@@ -33,8 +33,8 @@ public class PythonGenerator implements Generator {
         return null;
     }
 
-    @Override public void generate(ConstantNode constantNode) {
-        writer.write(constantNode.getValue().toString());
+    @Override public void generate(ConstantExpression constantExpression) {
+        writer.write(constantExpression.getValue().toString());
     }
 
     @Override public void generateDeclarationWithInitializer(DeclarationStatement declarationStatement) {
@@ -57,7 +57,24 @@ public class PythonGenerator implements Generator {
     }
 
     @Override public void generatePrimitive(Primitive.DataType primitive) {
-        writer.write(primitive.getTypeString());
+        switch (primitive) {
+            case STRING:
+                writer.write("string");
+                break;
+            case LONG:
+            case INTEGER:
+                writer.write("long");
+                break;
+            case DOUBLE:
+                writer.write("float");
+                break;
+            case BOOLEAN:
+                writer.write("bool");
+                break;
+            case VOID:
+                default:
+                    throw new UnsupportedOperationException("Primitive type " + primitive + " is not implemented!");
+        }
     }
 
     @Override public void generate(IfStatement ifStatement) {
@@ -191,7 +208,7 @@ public class PythonGenerator implements Generator {
         value.write(this);
     }
 
-    @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 generateClass(String namespace, String className, List<FieldDeclaration> fields, List<ConstructorDeclaration> constructors, List<MethodDefinition> methods, List<ClassDeclaration> innerClasses, boolean mainClass) {
         // Add static?!
         // Own File?
         writer.startLine("class ");
@@ -230,7 +247,7 @@ public class PythonGenerator implements Generator {
 
         // If there are inner classes, implement them
         if (innerClasses != null) {
-            for (ClassDefinition innerClass : innerClasses) {
+            for (ClassDeclaration innerClass : innerClasses) {
                 this.generateClass(innerClass.getNamespace(), innerClass.getClassName(), innerClass.getFields(), innerClass.getConstructors(), innerClass.getMethods(), innerClass.getInnerClasses(), false);
             }
         }
@@ -273,7 +290,7 @@ public class PythonGenerator implements Generator {
         body.write(this);
     }
 
-    @Override public void generateFile(ClassDefinition mainClass, List<ClassDefinition> innerClasses) {
+    @Override public void generateFile(ClassDeclaration mainClass, List<ClassDeclaration> innerClasses) {
         generateClass(mainClass.getNamespace(), mainClass.getClassName(), mainClass.getFields(), mainClass.getConstructors(), mainClass.getMethods(), innerClasses, true);
     }
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/UnknownType.java
similarity index 61%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/UnknownType.java
index 6b4e52a..0fd9508 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/UnknownType.java
@@ -18,25 +18,29 @@ under the License.
 */
 package org.apache.plc4x.codegen.ast;
 
-public class ConstantNode extends Expression {
+/**
+ * Represents an Unknown Type.
+ */
+public class UnknownType extends TypeNode {
 
-    private Object value;
+    public static final UnknownType INSTANCE = new UnknownType();
 
-    public ConstantNode(Object value) {
-        super(TypeUtil.infer(value));
-        this.value = value;
+    public UnknownType() {
+        super("");
     }
 
-    public Object getValue() {
-        return value;
+    @Override
+    String getTypeString() {
+        throw new UnsupportedOperationException();
     }
 
-    @Override public <T> T accept(NodeVisitor<T> visitor) {
-        return visitor.visit(this);
+    @Override
+    public <T> T accept(NodeVisitor<T> visitor) {
+        throw new UnsupportedOperationException();
     }
 
-    @Override public void write(Generator generator) {
-        generator.generate(this);
+    @Override
+    public void write(Generator writer) {
+        throw new UnsupportedOperationException();
     }
-
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/EnumFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/EnumFactory.java
index faef7b1..d64bd02 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/EnumFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/EnumFactory.java
@@ -16,7 +16,9 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.codegen.ast;
+package org.apache.plc4x.codegen.util;
+
+import org.apache.plc4x.codegen.ast.*;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -26,14 +28,14 @@ import java.util.stream.Collectors;
  */
 public class EnumFactory {
 
-    public ClassDefinition create(PojoDescription desc, List<EnumEntry> enumEntries) {
+    public ClassDeclaration 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(
+            constructorStatements.add(Expressions.assignment(
                 new FieldReference(field1.getType(), field1.getName()),
                 new ParameterExpression(field1.getType(), field1.getName())
             ));
@@ -70,7 +72,7 @@ public class EnumFactory {
             new Block(constructorStatements));
 
 
-        return new ClassDefinition("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
+        return new ClassDeclaration("", desc.getName(), finalFields, Arrays.asList(constructor), methods, null);
     }
 
     static MethodDefinition getGetterDefinition(String name, TypeNode type) {
@@ -82,7 +84,7 @@ public class EnumFactory {
     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));
+        Block body = new Block(Expressions.assignment(new FieldReference(type, name), param));
         return new MethodDefinition(getter, type, Collections.singletonList(param), body);
     }
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/PojoFactory.java
index 085bf5a..3370746 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/util/PojoFactory.java
@@ -16,7 +16,9 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.codegen.ast;
+package org.apache.plc4x.codegen.util;
+
+import org.apache.plc4x.codegen.ast.*;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -24,16 +26,16 @@ import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static org.apache.plc4x.codegen.ast.EnumFactory.getGetterDefinition;
-import static org.apache.plc4x.codegen.ast.EnumFactory.getSetterDefinition;
+import static org.apache.plc4x.codegen.util.EnumFactory.getGetterDefinition;
+import static org.apache.plc4x.codegen.util.EnumFactory.getSetterDefinition;
 
 public class PojoFactory {
 
     private TypeNode BUFFER_TYPE;
 
-    private Method readByte = new Method(BUFFER_TYPE, "readByte", Primitive.BYTE, Collections.emptyList(), Collections.emptyList());
+    private Method readByte = new Method(BUFFER_TYPE, "readByte", Primitive.INTEGER, Collections.emptyList(), Collections.emptyList());
 
-    public ClassDefinition create(PojoDescription desc) {
+    public ClassDeclaration create(PojoDescription desc) {
         // Create all Fields first
         final List<FieldDeclaration> fields = desc.fields.stream()
             .map(field -> new FieldDeclaration(field.getType(), field.getName()))
@@ -67,13 +69,13 @@ public class PojoFactory {
         methods.add(new MethodDefinition(Collections.singleton(Modifier.STATIC), "decode", clazz, Collections.singletonList(
             buffer
         ), new Block(
-            new AssignementExpression(instance, new NewExpression(clazz)),
+            Expressions.assignment(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);
+        return new ClassDeclaration("", desc.getName(), fields, Arrays.asList(new ConstructorDeclaration(Collections.emptyList(), new Block())), methods, null);
     }
 
     public static class PojoDescription {
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
index 4f83b98..c214c14 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
@@ -39,22 +39,22 @@ public class JavaGeneratorTest {
 
     @Test
     public void writeDeclaration() {
-        final DeclarationStatement stmt = new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(5.0));
+        final DeclarationStatement stmt = new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantExpression(5.0));
         stmt.write(generator);
 
         final String code = writer.getCode();
 
-        assertEquals("double a = 5.0", code);
+        assertEquals("Double a = 5.0", code);
     }
 
     @Test
     public void ifStatement() {
         final Statement stmt = new IfStatement(
             new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"),
-                new ConstantNode(10.0),
+                new ConstantExpression(10.0),
                 BinaryExpression.Operation.EQ),
-            new Block(new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "b"), new ConstantNode(5.0))),
-            new Block(new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "b"), new ConstantNode(3.0)))
+            new Block(new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "b"), new ConstantExpression(5.0))),
+            new Block(new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "b"), new ConstantExpression(3.0)))
         );
 
         stmt.write(generator);
@@ -62,9 +62,9 @@ public class JavaGeneratorTest {
         final String code = writer.getCode();
 
         assertEquals("if (a == 10.0) {\n" +
-            "    double b = 5.0;\n" +
+            "    Double b = 5.0;\n" +
             "} else {\n" +
-            "    double b = 3.0;\n" +
+            "    Double b = 3.0;\n" +
             "}\n", code);
     }
 
@@ -74,16 +74,16 @@ public class JavaGeneratorTest {
             new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "c"), null),
             new IfStatement(
                 new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"),
-                    new ConstantNode(10.0),
+                    new ConstantExpression(10.0),
                     BinaryExpression.Operation.EQ),
                 new Block(
                     new IfStatement(
                         new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "b"),
-                            new ConstantNode(10.0),
+                            new ConstantExpression(10.0),
                             BinaryExpression.Operation.EQ),
                         new Block(
-                            new AssignementExpression(new ParameterExpression(Primitive.DOUBLE, "c"), new ConstantNode(5.0)),
-                            new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "d"), new ConstantNode(100.0))
+                            new AssignementExpression(new ParameterExpression(Primitive.DOUBLE, "c"), new ConstantExpression(5.0)),
+                            new DeclarationStatement(new ParameterExpression(Primitive.DOUBLE, "d"), new ConstantExpression(100.0))
                         ),
                         null
                     )
@@ -95,19 +95,19 @@ public class JavaGeneratorTest {
 
         final String code = writer.getCode();
 
-        assertEquals("    double c;\n" +
+        assertEquals("    Double c;\n" +
             "    if (a == 10.0) {\n" +
             "        if (b == 10.0) {\n" +
             "            c = 5.0;\n" +
-            "            double d = 100.0;\n" +
+            "            Double d = 100.0;\n" +
             "        }\n" +
             "    }\n", code);
     }
 
     @Test
     public void callStaticMethod() {
-        final TypeNode myClazz = new Primitive("MyClazz");
-        Expression expr = new CallExpression(new Method(myClazz, "toString", Primitive.VOID, Collections.singletonList(Primitive.DOUBLE), Collections.EMPTY_LIST), null, new ConstantNode(5.0));
+        final TypeNode myClazz = new TypeNode("MyClazz");
+        Expression expr = new CallExpression(new Method(myClazz, "toString", Primitive.VOID, Collections.singletonList(Primitive.DOUBLE), Collections.EMPTY_LIST), null, new ConstantExpression(5.0));
 
         expr.write(generator);
 
@@ -118,8 +118,8 @@ public class JavaGeneratorTest {
 
     @Test
     public void callMethod() {
-        final TypeNode myClazz = new Primitive("MyClazz");
-        Expression expr = new CallExpression(new Method(myClazz, "toString", Primitive.VOID, Collections.singletonList(Primitive.DOUBLE), Collections.EMPTY_LIST), new ParameterExpression(myClazz, "a"), new ConstantNode(5.0));
+        final TypeNode myClazz = new TypeNode("MyClazz");
+        Expression expr = new CallExpression(new Method(myClazz, "toString", Primitive.VOID, Collections.singletonList(Primitive.DOUBLE), Collections.EMPTY_LIST), new ParameterExpression(myClazz, "a"), new ConstantExpression(5.0));
 
         expr.write(generator);
 
@@ -130,7 +130,7 @@ public class JavaGeneratorTest {
 
     @Test
     public void complexCallAssignment() {
-        final TypeNode myClazz = new Primitive("MyClazz");
+        final TypeNode myClazz = new TypeNode("MyClazz");
         final ParameterExpression instance = new ParameterExpression(myClazz, "instance");
         final Method getNumberMethod = new Method(myClazz, "getNumber", Primitive.DOUBLE, Collections.emptyList(), Collections.emptyList());
         final Method staticMethod = new Method(myClazz, "staticMethod", Primitive.DOUBLE, Collections.emptyList(), Collections.emptyList());
@@ -147,8 +147,8 @@ public class JavaGeneratorTest {
         assertEquals("    MyClazz instance;\n" +
             "    instance = new MyClazz();\n" +
             "    instance = new MyClazz(new MyClazz());\n" +
-            "    double a = instance.getNumber();\n" +
-            "    double b = MyClazz.staticMethod();\n", code);
+            "    Double a = instance.getNumber();\n" +
+            "    Double b = MyClazz.staticMethod();\n", code);
     }
 
     @Test
@@ -169,7 +169,7 @@ public class JavaGeneratorTest {
 
         decl.write(generator);
         final String code = writer.getCode();
-        assertEquals("public double add(double a, double b) {\n" +
+        assertEquals("public Double add(Double a, Double b) {\n" +
             "    return a + b;\n" +
             "}\n", code);
     }
@@ -197,24 +197,24 @@ public class JavaGeneratorTest {
             new Block(
                 new AssignementExpression(
                     currentRef,
-                    new BinaryExpression(currentRef.getType(), currentRef, new ConstantNode(1.0), BinaryExpression.Operation.PLUS)
+                    new BinaryExpression(currentRef.getType(), currentRef, new ConstantExpression(1.0), BinaryExpression.Operation.PLUS)
                 )
             )
         );
 
-        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x", "MyClazz", Arrays.asList(current), Collections.emptyList(), Arrays.asList(inc, decl), null);
+        final ClassDeclaration clazz = new ClassDeclaration("org.apache.plc4x", "MyClazz", Arrays.asList(current), Collections.emptyList(), Arrays.asList(inc, decl), null);
 
         clazz.write(generator);
         final String code = writer.getCode();
         assertEquals("public class MyClazz {\n" +
             "    \n" +
-            "    public double current;\n" +
+            "    public Double current;\n" +
             "    \n" +
-            "    public void inc() {\n" +
+            "    public Void inc() {\n" +
             "        this.current = this.current + 1.0;\n" +
             "    }\n" +
             "    \n" +
-            "    public double add(double a, double b) {\n" +
+            "    public Double add(Double a, Double b) {\n" +
             "        return a + b;\n" +
             "    }\n" +
             "    \n" +
@@ -228,7 +228,7 @@ public class JavaGeneratorTest {
         final FieldReference currentRef = new FieldReference(Primitive.DOUBLE, "current");
 
         final ParameterExpression value = new ParameterExpression(Primitive.DOUBLE, "value");
-        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x",
+        final ClassDeclaration clazz = new ClassDeclaration("org.apache.plc4x",
             "MyClazz",
             Arrays.asList(current),
             Arrays.asList(
@@ -243,9 +243,9 @@ public class JavaGeneratorTest {
         final String code = writer.getCode();
         assertEquals("public class MyClazz {\n" +
             "    \n" +
-            "    public double current;\n" +
+            "    public Double current;\n" +
             "    \n" +
-            "    public MyClazz(double value) {\n" +
+            "    public MyClazz(Double value) {\n" +
             "        this.current = value;\n" +
             "    }\n" +
             "    \n" +
@@ -261,9 +261,9 @@ public class JavaGeneratorTest {
         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 ClassDeclaration innerClass = new ClassDeclaration("", "MyInnerClazz", Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null);
 
-        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x",
+        final ClassDeclaration clazz = new ClassDeclaration("org.apache.plc4x",
             "MyClazz",
             Arrays.asList(current),
             Arrays.asList(
@@ -279,9 +279,9 @@ public class JavaGeneratorTest {
         final String code = writer.getCode();
         assertEquals("public class MyClazz {\n" +
             "    \n" +
-            "    public double current;\n" +
+            "    public Double current;\n" +
             "    \n" +
-            "    public MyClazz(double value) {\n" +
+            "    public MyClazz(Double value) {\n" +
             "        this.current = value;\n" +
             "    }\n" +
             "    \n" +
@@ -295,8 +295,8 @@ public class JavaGeneratorTest {
     public void ifMultipleElse() {
         final IfStatement stmt = new IfStatement(
             Arrays.asList(
-                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(10.0), BinaryExpression.Operation.EQ),
-                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(5.0), BinaryExpression.Operation.EQ)
+                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantExpression(10.0), BinaryExpression.Operation.EQ),
+                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantExpression(5.0), BinaryExpression.Operation.EQ)
             ),
             Arrays.asList(
                 new Block(),
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
index 741a6ff..c66b934 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
@@ -46,9 +46,9 @@ public class PythonGeneratorTest {
         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 ClassDeclaration innerClass = new ClassDeclaration("", "MyInnerClazz", Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), null);
 
-        final ClassDefinition clazz = new ClassDefinition("org.apache.plc4x",
+        final ClassDeclaration clazz = new ClassDeclaration("org.apache.plc4x",
             "MyClazz",
             Arrays.asList(current),
             Arrays.asList(
@@ -64,9 +64,9 @@ public class PythonGeneratorTest {
         final String code = writer.getCode();
         assertEquals("class MyClazz:\n" +
             "    \n" +
-            "    self.current: double\n" +
+            "    current: float\n" +
             "    \n" +
-            "    def __init__(double value):\n" +
+            "    def __init__(float value):\n" +
             "        self.current = value\n" +
             "    \n" +
             "    class MyInnerClazz:\n" +
@@ -78,8 +78,8 @@ public class PythonGeneratorTest {
     public void ifMultipleElse() {
         final IfStatement stmt = new IfStatement(
             Arrays.asList(
-                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(10.0), BinaryExpression.Operation.EQ),
-                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantNode(5.0), BinaryExpression.Operation.EQ)
+                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantExpression(10.0), BinaryExpression.Operation.EQ),
+                new BinaryExpression(Primitive.DOUBLE, new ParameterExpression(Primitive.DOUBLE, "a"), new ConstantExpression(5.0), BinaryExpression.Operation.EQ)
             ),
             Arrays.asList(
                 new Block(),
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/util/EnumFactoryTest.java
similarity index 74%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/EnumFactoryTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/util/EnumFactoryTest.java
index 798de27..245438d 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/util/EnumFactoryTest.java
@@ -16,8 +16,9 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.codegen.ast;
+package org.apache.plc4x.codegen.util;
 
+import org.apache.plc4x.codegen.ast.*;
 import org.apache.plc4x.codegen.util.EnumFactory;
 import org.junit.Test;
 
@@ -29,7 +30,7 @@ public class EnumFactoryTest {
     public void createEnums() {
         System.out.println("Java:");
         System.out.println("----------");
-        final ClassDefinition MyEnum = newEnum();
+        final ClassDeclaration MyEnum = newEnum();
 
         final CodeWriter writer = new CodeWriter(4);
         final JavaGenerator generator = new JavaGenerator(writer);
@@ -43,7 +44,7 @@ public class EnumFactoryTest {
     public void createEnumsInPython() {
         System.out.println("Python:");
         System.out.println("----------");
-        final ClassDefinition MyEnum = newEnum();
+        final ClassDeclaration MyEnum = newEnum();
 
         final CodeWriter writer = new CodeWriter(4);
         final PythonGenerator generator = new PythonGenerator(writer);
@@ -53,7 +54,7 @@ public class EnumFactoryTest {
         System.out.println(writer.getCode());
     }
 
-    private ClassDefinition newEnum() {
+    private ClassDeclaration newEnum() {
         final EnumFactory factory = new EnumFactory();
         final EnumFactory.PojoDescription description = new EnumFactory.PojoDescription("MyPojo",
             new EnumFactory.Field(Primitive.DOUBLE, "field1"),
@@ -63,24 +64,24 @@ public class EnumFactoryTest {
         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 ConstantExpression(1.0),
+                    new ConstantExpression(2.0),
+                    new ConstantExpression(3.0)
                 )),
                 new EnumFactory.EnumEntry("alternative2", Arrays.asList(
-                    new ConstantNode(1.0),
-                    new ConstantNode(2.0),
-                    new ConstantNode(3.0)
+                    new ConstantExpression(1.0),
+                    new ConstantExpression(2.0),
+                    new ConstantExpression(3.0)
                 )),
                 new EnumFactory.EnumEntry("alternative3", Arrays.asList(
-                    new ConstantNode(1.0),
-                    new ConstantNode(2.0),
-                    new ConstantNode(3.0)
+                    new ConstantExpression(1.0),
+                    new ConstantExpression(2.0),
+                    new ConstantExpression(3.0)
                 )),
                 new EnumFactory.EnumEntry("alternative4", Arrays.asList(
-                    new ConstantNode(1.0),
-                    new ConstantNode(2.0),
-                    new ConstantNode(3.0)
+                    new ConstantExpression(1.0),
+                    new ConstantExpression(2.0),
+                    new ConstantExpression(3.0)
                 ))
             )
         );
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/util/PojoFactoryTest.java
similarity index 89%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/util/PojoFactoryTest.java
index 2035b77..b04ae77 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/util/PojoFactoryTest.java
@@ -16,9 +16,10 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.codegen.ast;
+package org.apache.plc4x.codegen.util;
+
+import org.apache.plc4x.codegen.ast.*;
 
-import org.apache.plc4x.codegen.util.PojoFactory;
 import org.junit.Test;
 
 public class PojoFactoryTest {
@@ -27,7 +28,7 @@ public class PojoFactoryTest {
     public void createPojoJava() {
         System.out.println("Java:");
         System.out.println("----------");
-        final ClassDefinition pojo = newPojo();
+        final ClassDeclaration pojo = newPojo();
 
         final CodeWriter writer = new CodeWriter(4);
         final JavaGenerator generator = new JavaGenerator(writer);
@@ -41,7 +42,7 @@ public class PojoFactoryTest {
     public void createPojoPython() {
         System.out.println("Python:");
         System.out.println("----------");
-        final ClassDefinition pojo = newPojo();
+        final ClassDeclaration pojo = newPojo();
 
         final CodeWriter writer = new CodeWriter(4);
         final PythonGenerator generator = new PythonGenerator(writer);
@@ -51,7 +52,7 @@ public class PojoFactoryTest {
         System.out.println(writer.getCode());
     }
 
-    private ClassDefinition newPojo() {
+    private ClassDeclaration newPojo() {
         final PojoFactory factory = new PojoFactory();
         final PojoFactory.PojoDescription description = new PojoFactory.PojoDescription("MyPojo",
             new PojoFactory.Field(Primitive.DOUBLE, "field1"),