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

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 0d52bde353 feat(codegen): comment support
0d52bde353 is described below

commit 0d52bde353dc26550d1f12f53162230846f7e159
Author: Sebastian Rühl <[email protected]>
AuthorDate: Mon Sep 8 17:38:38 2025 +0200

    feat(codegen): comment support
---
 .../plugins/codegenerator/language/mspec/MSpec.g4  |   4 +-
 .../mspec/expression/ExpressionStringListener.java |  19 +-
 .../mspec/model/definitions/DefaultArgument.java   |   4 +-
 .../definitions/DefaultComplexTypeDefinition.java  |   6 +-
 .../DefaultConstantsTypeDefinition.java            |   8 +-
 .../definitions/DefaultDataIoTypeDefinition.java   |  13 +-
 .../DefaultDiscriminatedComplexTypeDefinition.java |   4 +-
 .../definitions/DefaultEnumTypeDefinition.java     |   4 +-
 .../mspec/model/definitions/DefaultEnumValue.java  |   9 +-
 .../model/definitions/DefaultTypeDefinition.java   |  18 +-
 .../mspec/model/fields/DefaultAbstractField.java   |   4 +-
 .../mspec/model/fields/DefaultArrayField.java      |  16 +-
 .../mspec/model/fields/DefaultAssertField.java     |   4 +-
 .../mspec/model/fields/DefaultChecksumField.java   |   7 +-
 .../mspec/model/fields/DefaultConstField.java      |   7 +-
 .../model/fields/DefaultDiscriminatorField.java    |   6 +-
 .../mspec/model/fields/DefaultEnumField.java       |   4 +-
 .../language/mspec/model/fields/DefaultField.java  |  22 +-
 .../mspec/model/fields/DefaultImplicitField.java   |   7 +-
 .../model/fields/DefaultManualArrayField.java      |  16 +-
 .../mspec/model/fields/DefaultManualField.java     |   4 +-
 .../mspec/model/fields/DefaultOptionalField.java   |   4 +-
 .../mspec/model/fields/DefaultPaddingField.java    |   4 +-
 .../mspec/model/fields/DefaultPeekField.java       |  13 +-
 .../mspec/model/fields/DefaultReservedField.java   |   7 +-
 .../mspec/model/fields/DefaultSimpleField.java     |   4 +-
 .../mspec/model/fields/DefaultStateField.java      |   4 +-
 .../mspec/model/fields/DefaultSwitchField.java     |   4 +-
 .../mspec/model/fields/DefaultTypedField.java      |   7 +-
 .../mspec/model/fields/DefaultTypedNamedField.java |   4 +-
 .../mspec/model/fields/DefaultUnknownField.java    |   6 +-
 .../mspec/model/fields/DefaultValidationField.java |   8 +-
 .../mspec/model/fields/DefaultVirtualField.java    |   8 +-
 .../references/AbstractSimpleTypeReference.java    |   9 +-
 .../model/references/DefaultEnumTypeReference.java |   8 +-
 .../references/DefaultVstringTypeReference.java    |   4 +-
 .../mspec/model/terms/DefaultBinaryTerm.java       |   8 +-
 .../mspec/model/terms/DefaultBooleanLiteral.java   |   4 +-
 .../model/terms/DefaultHexadecimalLiteral.java     |   4 +-
 .../mspec/model/terms/DefaultNumericLiteral.java   |   4 +-
 .../mspec/model/terms/DefaultStringLiteral.java    |   4 +-
 .../mspec/model/terms/DefaultTernaryTerm.java      |  10 +-
 .../mspec/model/terms/DefaultUnaryTerm.java        |   6 +-
 .../mspec/model/terms/DefaultVariableLiteral.java  |   2 +-
 .../mspec/parser/MessageFormatListener.java        | 454 ++++++++++++---------
 .../language/mspec/parser/MessageFormatParser.java |  12 +-
 .../mspec/protocol/ValidatableTypeContext.java     |   2 +-
 47 files changed, 444 insertions(+), 346 deletions(-)

diff --git 
a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
 
b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 2659e08e3b..58a42c18a7 100644
--- 
a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ 
b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -414,10 +414,8 @@ STRING_CHARACTER
  : ~["\\\r\n]
  ;
 
-// Stuff we just want to ignore
-
 LINE_COMMENT
- : '//' ~[\r\n]* -> channel(HIDDEN)
+ : ('//' ~[\r\n]*)+ -> channel(HIDDEN)
  ;
 
 BLOCK_COMMENT
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
index 4c5f3dd313..899052765b 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
@@ -73,12 +73,13 @@ public class ExpressionStringListener extends 
ExpressionBaseListener {
         if (roots.size() != 1) {
             throw new RuntimeException("Expression can only contain one root 
term.");
         }
-        root = roots.get(0);
+        root = roots.getFirst();
     }
 
     
/////////////////////////////////////////////////////////////////////////////////////////
     // Literals
-    
/////////////////////////////////////////////////////////////////////////////////////////
+
+    /// 
//////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     public void exitNullExpression(ExpressionParser.NullExpressionContext ctx) 
{
@@ -284,7 +285,8 @@ public class ExpressionStringListener extends 
ExpressionBaseListener {
 
     
/////////////////////////////////////////////////////////////////////////////////////////
     // Unary Terms
-    
/////////////////////////////////////////////////////////////////////////////////////////
+
+    /// 
//////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     public void enterNotExpression(ExpressionParser.NotExpressionContext ctx) {
@@ -321,7 +323,8 @@ public class ExpressionStringListener extends 
ExpressionBaseListener {
 
     
/////////////////////////////////////////////////////////////////////////////////////////
     // Binary Terms
-    
/////////////////////////////////////////////////////////////////////////////////////////
+
+    /// 
//////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     public void enterOrExpression(ExpressionParser.OrExpressionContext ctx) {
@@ -435,7 +438,8 @@ public class ExpressionStringListener extends 
ExpressionBaseListener {
 
     
/////////////////////////////////////////////////////////////////////////////////////////
     // Ternary Terms
-    
/////////////////////////////////////////////////////////////////////////////////////////
+
+    /// 
//////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     public void enterIfExpression(ExpressionParser.IfExpressionContext ctx) {
@@ -450,13 +454,14 @@ public class ExpressionStringListener extends 
ExpressionBaseListener {
 
     
/////////////////////////////////////////////////////////////////////////////////////////
     // Helpers
-    
/////////////////////////////////////////////////////////////////////////////////////////
+
+    /// 
//////////////////////////////////////////////////////////////////////////////////////
 
     private UnaryTerm getUnaryTerm(String op, List<Term> terms) {
         if (terms.size() != 1) {
             throw new RuntimeException(op + " should be a unary operation");
         }
-        Term a = terms.get(0);
+        Term a = terms.getFirst();
         return new DefaultUnaryTerm(a, op);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultArgument.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultArgument.java
index f3d096c9f5..5beb04f1ed 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultArgument.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultArgument.java
@@ -27,12 +27,10 @@ import java.util.concurrent.CompletionStage;
 
 public class DefaultArgument implements Argument {
 
+    protected final CompletableFuture<TypeReference> 
typeReferenceCompletionStage = new CompletableFuture<>();
     private final String name;
-
     private TypeReference type;
 
-    protected final CompletableFuture<TypeReference> 
typeReferenceCompletionStage = new CompletableFuture<>();
-
     public DefaultArgument(String name) {
         this.name = Objects.requireNonNull(name);
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 45d08d3ae3..cff93010e4 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -32,8 +32,8 @@ public class DefaultComplexTypeDefinition extends 
DefaultTypeDefinition implemen
     private final List<Field> fields;
     protected ComplexTypeDefinition parentType;
 
-    public DefaultComplexTypeDefinition(String name, Map<String, Term> 
attributes, List<Argument> parserArguments, boolean isAbstract, List<Field> 
fields) {
-        super(name, attributes, parserArguments);
+    public DefaultComplexTypeDefinition(String name, Map<String, Term> 
attributes, List<Argument> parserArguments, boolean isAbstract, List<Field> 
fields, String comment) {
+        super(name, attributes, parserArguments, comment);
         this.isAbstract = isAbstract;
         this.fields = Objects.requireNonNull(fields);
     }
@@ -48,7 +48,7 @@ public class DefaultComplexTypeDefinition extends 
DefaultTypeDefinition implemen
 
     public Optional<List<Argument>> getAllParserArguments() {
         List<Argument> allArguments = new 
ArrayList<>(getParserArguments().orElse(Collections.emptyList()));
-        if(getParentType().isPresent()) {
+        if (getParentType().isPresent()) {
             ComplexTypeDefinition parent = getParentType().get();
             
allArguments.addAll(parent.getAllParserArguments().orElse(Collections.emptyList()));
         }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultConstantsTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultConstantsTypeDefinition.java
index 2b90e4430b..17f64bcc02 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultConstantsTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultConstantsTypeDefinition.java
@@ -18,24 +18,22 @@
  */
 package 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
-import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import 
org.apache.plc4x.plugins.codegenerator.types.definitions.ConstantsTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
 import org.apache.plc4x.plugins.codegenerator.types.fields.PropertyField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField;
-import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 public class DefaultConstantsTypeDefinition extends DefaultTypeDefinition 
implements ConstantsTypeDefinition {
 
     private final List<Field> fields;
 
-    public DefaultConstantsTypeDefinition(String name, Map<String, Term> 
attributes, List<Argument> parserArguments, List<Field> fields) {
-        super(name, attributes, parserArguments);
+    public DefaultConstantsTypeDefinition(String name, List<Field> fields, 
String comment) {
+        super(name, Collections.emptyMap(), Collections.emptyList(), comment);
         this.fields = fields;
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
index d8d85b4310..60107639f6 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
@@ -34,19 +34,20 @@ public class DefaultDataIoTypeDefinition extends 
DefaultComplexTypeDefinition im
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultDataIoTypeDefinition.class);
     private final SwitchField switchField;
     private TypeReference type;
-    public DefaultDataIoTypeDefinition(String name, Map<String, Term> 
attributes, List<Argument> parserArguments, SwitchField switchField) {
-        super(name, attributes, parserArguments, false, List.of(switchField));
+
+    public DefaultDataIoTypeDefinition(String name, Map<String, Term> 
attributes, List<Argument> parserArguments, SwitchField switchField, String 
comment) {
+        super(name, attributes, parserArguments, false, List.of(switchField), 
comment);
         this.switchField = Objects.requireNonNull(switchField);
-        if (parserArguments.size() < 1) {
+        if (parserArguments.isEmpty()) {
             throw new IllegalStateException();
         }
-        ((DefaultArgument) 
parserArguments.get(0)).getTypeReferenceCompletionStage().whenComplete((typeReference,
 throwable) -> {
+        ((DefaultArgument) 
parserArguments.getFirst()).getTypeReferenceCompletionStage().whenComplete((typeReference,
 throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
-                LOGGER.debug("Error setting type for {}", 
parserArguments.get(0), throwable);
+                LOGGER.debug("Error setting type for {}", 
parserArguments.getFirst(), throwable);
                 return;
             }
-            this.type = 
Objects.requireNonNull(parserArguments.get(0).getType());
+            this.type = 
Objects.requireNonNull(parserArguments.getFirst().getType());
         });
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index 3615bcaad3..8aaeca41ac 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -33,8 +33,8 @@ public class DefaultDiscriminatedComplexTypeDefinition 
extends DefaultComplexTyp
 
     private final List<Term> discriminatorValueTerms;
 
-    public DefaultDiscriminatedComplexTypeDefinition(String name, Map<String, 
Term> attributes, List<Argument> parserArguments, boolean isAbstract, 
List<Field> fields, List<Term> discriminatorValueTerms) {
-        super(name, attributes, parserArguments, isAbstract, fields);
+    public DefaultDiscriminatedComplexTypeDefinition(String name, Map<String, 
Term> attributes, List<Argument> parserArguments, boolean isAbstract, 
List<Field> fields, List<Term> discriminatorValueTerms, String comment) {
+        super(name, attributes, parserArguments, isAbstract, fields, comment);
         this.discriminatorValueTerms = 
Objects.requireNonNull(discriminatorValueTerms);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
index 378de83a71..6d0640873b 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
@@ -40,8 +40,8 @@ public class DefaultEnumTypeDefinition extends 
DefaultTypeDefinition implements
     private final Map<String, TypeReference> constants;
 
     public DefaultEnumTypeDefinition(String name, SimpleTypeReference type, 
Map<String, Term> attributes, List<EnumValue> enumValues,
-                                     List<Argument> parserArgument) {
-        super(name, attributes, parserArgument);
+                                     List<Argument> parserArgument, String 
comment) {
+        super(name, attributes, parserArgument, comment);
         this.type = Objects.requireNonNull(type);
         this.enumValues = Objects.requireNonNull(enumValues);
         this.constants = new HashMap<>();
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumValue.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumValue.java
index 76cdfd9f5e..2e9a786a89 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumValue.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumValue.java
@@ -29,11 +29,13 @@ public class DefaultEnumValue implements EnumValue {
     private final String value;
     private final String name;
     private final Map<String, String> constants;
+    private final String comment;
 
-    public DefaultEnumValue(String value, String name, Map<String, String> 
constants) {
+    public DefaultEnumValue(String value, String name, Map<String, String> 
constants, String comment) {
         this.value = Objects.requireNonNull(value);
         this.name = Objects.requireNonNull(name);
         this.constants = constants;
+        this.comment = comment;
     }
 
     @Override
@@ -54,6 +56,11 @@ public class DefaultEnumValue implements EnumValue {
         return Optional.ofNullable(constants.get(name));
     }
 
+    @Override
+    public Optional<String> getComment() {
+        return Optional.ofNullable(comment);
+    }
+
     @Override
     public String toString() {
         return "DefaultEnumValue{" +
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
index 3d61c22db3..2f3047eb57 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
@@ -27,13 +27,15 @@ import java.util.*;
 public abstract class DefaultTypeDefinition {
 
     protected final String name;
-    private final Map<String, Term> attributes;
     protected final List<Argument> parserArguments;
+    protected final String comment;
+    private final Map<String, Term> attributes;
 
-    public DefaultTypeDefinition(String name, Map<String, Term> attributes, 
List<Argument> parserArguments) {
+    public DefaultTypeDefinition(String name, Map<String, Term> attributes, 
List<Argument> parserArguments, String comment) {
         this.name = Objects.requireNonNull(name);
         this.attributes = attributes;
         this.parserArguments = parserArguments;
+        this.comment = comment;
     }
 
     public String getName() {
@@ -59,12 +61,17 @@ public abstract class DefaultTypeDefinition {
         return Optional.of(allArguments);
     }
 
+    public Optional<String> getComment() {
+        return Optional.ofNullable(comment);
+    }
+
     @Override
     public String toString() {
         return "DefaultTypeDefinition{" +
             "name='" + name + '\'' +
             ", attributes=" + attributes +
             ", parserArguments=" + parserArguments +
+            ", comment='" + comment + '\'' +
             '}';
     }
 
@@ -73,11 +80,14 @@ public abstract class DefaultTypeDefinition {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         DefaultTypeDefinition that = (DefaultTypeDefinition) o;
-        return name.equals(that.name) && Objects.equals(attributes, 
that.attributes) && Objects.equals(parserArguments, that.parserArguments);
+        return name.equals(that.name) &&
+            Objects.equals(attributes, that.attributes) &&
+            Objects.equals(parserArguments, that.parserArguments) &&
+            comment.equals(that.comment);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(name, attributes, parserArguments);
+        return Objects.hash(name, attributes, parserArguments, comment);
     }
 }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
index 5fd413ef42..a627d5a3ee 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
@@ -25,8 +25,8 @@ import java.util.Map;
 
 public class DefaultAbstractField extends DefaultTypedNamedField implements 
AbstractField {
 
-    public DefaultAbstractField(Map<String, Term> attributes, String name) {
-        super(attributes, name);
+    public DefaultAbstractField(Map<String, Term> attributes, String name, 
String comment) {
+        super(attributes, name, comment);
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
index d31efd0e06..4f8934317c 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
@@ -31,8 +31,8 @@ public class DefaultArrayField extends DefaultTypedNamedField 
implements ArrayFi
     private final LoopType loopType;
     private final Term loopExpression;
 
-    public DefaultArrayField(Map<String, Term> attributes, String name, 
LoopType loopType, Term loopExpression) {
-        super(attributes, name);
+    public DefaultArrayField(Map<String, Term> attributes, String name, 
LoopType loopType, Term loopExpression, String comment) {
+        super(attributes, name, comment);
         this.loopType = Objects.requireNonNull(loopType);
         this.loopExpression = Objects.requireNonNull(loopExpression);
     }
@@ -45,19 +45,19 @@ public class DefaultArrayField extends 
DefaultTypedNamedField implements ArrayFi
         return loopExpression;
     }
 
+    @Override
+    public ArrayTypeReference getType() {
+        return (ArrayTypeReference) super.getType();
+    }
+
     @Override
     public void setType(TypeReference typeReference) {
-        if(!(typeReference instanceof ArrayTypeReference)) {
+        if (!(typeReference instanceof ArrayTypeReference)) {
             throw new IllegalArgumentException("Array fields can only have 
ArrayTypeReferences");
         }
         super.setType(typeReference);
     }
 
-    @Override
-    public ArrayTypeReference getType() {
-        return (ArrayTypeReference) super.getType();
-    }
-
     @Override
     public String toString() {
         return "DefaultArrayField{" +
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
index bb36b97330..5758f2bdc0 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
@@ -28,8 +28,8 @@ public class DefaultAssertField extends 
DefaultTypedNamedField implements Assert
 
     private final Term conditionExpression;
 
-    public DefaultAssertField(Map<String, Term> attributes, String name, Term 
conditionExpression) {
-        super(attributes, name);
+    public DefaultAssertField(Map<String, Term> attributes, String name, Term 
conditionExpression, String comment) {
+        super(attributes, name, comment);
         this.conditionExpression = Objects.requireNonNull(conditionExpression);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
index 84d35449d6..e923d53ac1 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
@@ -22,14 +22,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField;
 import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
 public class DefaultChecksumField extends DefaultTypedNamedField implements 
ChecksumField {
 
     private final Term checksumExpression;
 
-    public DefaultChecksumField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term checksumExpression) {
-        super(attributes, name);
+    public DefaultChecksumField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term checksumExpression, String comment) 
{
+        super(attributes, name, comment);
         this.checksumExpression = Objects.requireNonNull(checksumExpression);
         this.type = type;
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
index a2b892310c..44f3c364f3 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
@@ -22,14 +22,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Literal;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
 public class DefaultConstField extends DefaultTypedNamedField implements 
ConstField {
 
     private final Literal referenceValue;
 
-    public DefaultConstField(Map<String, Term> attributes, String name, 
Literal referenceValue) {
-        super(attributes, name);
+    public DefaultConstField(Map<String, Term> attributes, String name, 
Literal referenceValue, String comment) {
+        super(attributes, name, comment);
         this.referenceValue = Objects.requireNonNull(referenceValue);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
index df0e8b2312..51756e88be 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
@@ -21,12 +21,12 @@ package 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 import org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
 
 public class DefaultDiscriminatorField extends DefaultTypedNamedField 
implements DiscriminatorField {
 
-    public DefaultDiscriminatorField(Map<String, Term> attributes, String 
name) {
-        super(attributes, name);
+    public DefaultDiscriminatorField(Map<String, Term> attributes, String 
name, String comment) {
+        super(attributes, name, comment);
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
index 541b946b2a..7aaefbba30 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
@@ -29,8 +29,8 @@ public class DefaultEnumField extends DefaultTypedNamedField 
implements EnumFiel
 
     private final String fieldName;
 
-    public DefaultEnumField(Map<String, Term> attributes, EnumTypeReference 
type, String name, String fieldName) {
-        super(attributes, name);
+    public DefaultEnumField(Map<String, Term> attributes, EnumTypeReference 
type, String name, String fieldName, String comment) {
+        super(attributes, name, comment);
         this.fieldName = Objects.requireNonNull(fieldName);
         this.type = type;
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
index 8107d4faf4..492dc5fb0a 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
@@ -25,25 +25,32 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
+
 public abstract class DefaultField {
 
-    protected TypeDefinition owner;
     protected final Map<String, Term> attributes;
+    protected final String comment;
+    protected TypeDefinition owner;
 
-    protected DefaultField(Map<String, Term> attributes) {
+    protected DefaultField(Map<String, Term> attributes, String comment) {
         this.attributes = Objects.requireNonNull(attributes);
+        this.comment = comment;
     }
 
-    public void setOwner(TypeDefinition owner) {
-        this.owner = owner;
+    public Optional<String> getComment() {
+        return Optional.ofNullable(comment);
     }
 
     public TypeDefinition getOwner() {
         return owner;
     }
 
+    public void setOwner(TypeDefinition owner) {
+        this.owner = owner;
+    }
+
     public Optional<Term> getAttribute(String attributeName) {
-        if(attributes.containsKey(attributeName)) {
+        if (attributes.containsKey(attributeName)) {
             return Optional.of(attributes.get(attributeName));
         }
         return Optional.empty();
@@ -53,6 +60,7 @@ public abstract class DefaultField {
     public String toString() {
         return "DefaultField{" +
             "attributes=" + attributes +
+            ", comment='" + comment + '\'' +
             '}';
     }
 
@@ -61,11 +69,11 @@ public abstract class DefaultField {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         DefaultField that = (DefaultField) o;
-        return Objects.equals(attributes, that.attributes);
+        return Objects.equals(attributes, that.attributes) && 
comment.equals(that.comment);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(attributes);
+        return Objects.hash(attributes, comment);
     }
 }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
index 9cbc024791..ef88fcb863 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
@@ -22,14 +22,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.ImplicitField;
 import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
 public class DefaultImplicitField extends DefaultTypedNamedField implements 
ImplicitField {
 
     private final Term serializeExpression;
 
-    public DefaultImplicitField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term serializeExpression) {
-        super(attributes, name);
+    public DefaultImplicitField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term serializeExpression, String 
comment) {
+        super(attributes, name, comment);
         this.serializeExpression = Objects.requireNonNull(serializeExpression);
         this.type = type;
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
index 27ad02022f..a715e5926f 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
@@ -34,8 +34,8 @@ public class DefaultManualArrayField extends 
DefaultTypedNamedField implements M
     private final Term serializeExpression;
     private final Term lengthExpression;
 
-    public DefaultManualArrayField(Map<String, Term> attributes, String name, 
LoopType loopType, Term loopExpression, Term parseExpression, Term 
serializeExpression, Term lengthExpression) {
-        super(attributes, name);
+    public DefaultManualArrayField(Map<String, Term> attributes, String name, 
LoopType loopType, Term loopExpression, Term parseExpression, Term 
serializeExpression, Term lengthExpression, String comment) {
+        super(attributes, name, comment);
         this.loopType = Objects.requireNonNull(loopType);
         this.loopExpression = Objects.requireNonNull(loopExpression);
         this.parseExpression = Objects.requireNonNull(parseExpression);
@@ -63,19 +63,19 @@ public class DefaultManualArrayField extends 
DefaultTypedNamedField implements M
         return lengthExpression;
     }
 
+    @Override
+    public ArrayTypeReference getType() {
+        return (ArrayTypeReference) super.getType();
+    }
+
     @Override
     public void setType(TypeReference typeReference) {
-        if(!(typeReference instanceof ArrayTypeReference)) {
+        if (!(typeReference instanceof ArrayTypeReference)) {
             throw new IllegalArgumentException("Manual array fields can only 
have ArrayTypeReferences");
         }
         super.setType(typeReference);
     }
 
-    @Override
-    public ArrayTypeReference getType() {
-        return (ArrayTypeReference) super.getType();
-    }
-
     @Override
     public String toString() {
         return "DefaultManualArrayField{" +
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
index eb4af3c927..dfb7e8c01c 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
@@ -30,8 +30,8 @@ public class DefaultManualField extends 
DefaultTypedNamedField implements Manual
     private final Term serializeExpression;
     private final Term lengthExpression;
 
-    public DefaultManualField(Map<String, Term> attributes, String name, Term 
parseExpression, Term serializeExpression, Term lengthExpression) {
-        super(attributes, name);
+    public DefaultManualField(Map<String, Term> attributes, String name, Term 
parseExpression, Term serializeExpression, Term lengthExpression, String 
comment) {
+        super(attributes, name, comment);
         this.parseExpression = Objects.requireNonNull(parseExpression);
         this.serializeExpression = Objects.requireNonNull(serializeExpression);
         this.lengthExpression = Objects.requireNonNull(lengthExpression);
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
index 1afb91a064..30fc871f9d 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
@@ -29,8 +29,8 @@ public class DefaultOptionalField extends 
DefaultTypedNamedField implements Opti
 
     private final Term conditionExpression;
 
-    public DefaultOptionalField(Map<String, Term> attributes, String name, 
Term conditionExpression) {
-        super(attributes, name);
+    public DefaultOptionalField(Map<String, Term> attributes, String name, 
Term conditionExpression, String comment) {
+        super(attributes, name, comment);
         this.conditionExpression = conditionExpression;
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
index 1284c3ee33..22b849ce6a 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
@@ -30,8 +30,8 @@ public class DefaultPaddingField extends 
DefaultTypedNamedField implements Paddi
     private final Term paddingValue;
     private final Term paddingCondition;
 
-    public DefaultPaddingField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term paddingValue, Term 
paddingCondition) {
-        super(attributes, name);
+    public DefaultPaddingField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term paddingValue, Term 
paddingCondition, String comment) {
+        super(attributes, name, comment);
         this.paddingValue = Objects.requireNonNull(paddingValue);
         this.paddingCondition = Objects.requireNonNull(paddingCondition);
         this.type = type;
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPeekField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPeekField.java
index f8f035449e..a1b97f4cc5 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPeekField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPeekField.java
@@ -29,8 +29,8 @@ public class DefaultPeekField extends DefaultTypedNamedField 
implements PeekFiel
 
     private final Term offsetExpression;
 
-    public DefaultPeekField(Map<String, Term> attributes, String name, Term 
offsetExpression) {
-        super(attributes, name);
+    public DefaultPeekField(Map<String, Term> attributes, String name, Term 
offsetExpression, String comment) {
+        super(attributes, name, comment);
         this.offsetExpression = offsetExpression;
     }
 
@@ -47,9 +47,12 @@ public class DefaultPeekField extends DefaultTypedNamedField 
implements PeekFiel
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        if (!super.equals(o)) return false;
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        if (!super.equals(o))
+            return false;
         DefaultPeekField that = (DefaultPeekField) o;
         return Objects.equals(offsetExpression, that.offsetExpression);
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
index e638bc2309..b7637dcfe6 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
@@ -22,14 +22,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.ReservedField;
 import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
 public class DefaultReservedField extends DefaultTypedField implements 
ReservedField {
 
     private final Object referenceValue;
 
-    public DefaultReservedField(Map<String, Term> attributes, 
SimpleTypeReference type, Object referenceValue) {
-        super(attributes);
+    public DefaultReservedField(Map<String, Term> attributes, 
SimpleTypeReference type, Object referenceValue, String comment) {
+        super(attributes, comment);
         this.referenceValue = Objects.requireNonNull(referenceValue);
         this.type = type;
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
index 2d495c142c..9a6183a415 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
@@ -25,8 +25,8 @@ import java.util.Map;
 
 public class DefaultSimpleField extends DefaultTypedNamedField implements 
SimpleField {
 
-    public DefaultSimpleField(Map<String, Term> attributes, String name) {
-        super(attributes, name);
+    public DefaultSimpleField(Map<String, Term> attributes, String name, 
String comment) {
+        super(attributes, name, comment);
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultStateField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultStateField.java
index 95b0f21096..9fe013c9be 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultStateField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultStateField.java
@@ -28,8 +28,8 @@ public class DefaultStateField extends DefaultTypedNamedField 
implements StateFi
 
     private final Term valueExpression;
 
-    public DefaultStateField(Map<String, Term> attributes, String name, Term 
valueExpression) {
-        super(attributes, name);
+    public DefaultStateField(Map<String, Term> attributes, String name, Term 
valueExpression, String comment) {
+        super(attributes, name, comment);
         this.valueExpression = Objects.requireNonNull(valueExpression);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
index 08f7b1d950..7e44127948 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
@@ -31,8 +31,8 @@ public class DefaultSwitchField extends DefaultField 
implements SwitchField {
     private final List<VariableLiteral> variableLiterals;
     private final List<DiscriminatedComplexTypeDefinition> cases;
 
-    public DefaultSwitchField(Map<String, Term> attributes, 
List<VariableLiteral> variableLiterals) {
-        super(attributes);
+    public DefaultSwitchField(Map<String, Term> attributes, 
List<VariableLiteral> variableLiterals, String comment) {
+        super(attributes, comment);
         this.variableLiterals = Objects.requireNonNull(variableLiterals);
         this.cases = new LinkedList<>();
     }
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedField.java
index 0b2a3f5f39..5f9d4ca4e0 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedField.java
@@ -28,12 +28,11 @@ import java.util.concurrent.CompletionStage;
 
 public abstract class DefaultTypedField extends DefaultField {
 
-    protected TypeReference type;
-
     protected final CompletableFuture<TypeReference> 
typeReferenceCompletionStage = new CompletableFuture<>();
+    protected TypeReference type;
 
-    public DefaultTypedField(Map<String, Term> attributes) {
-        super(attributes);
+    public DefaultTypedField(Map<String, Term> attributes, String comment) {
+        super(attributes, comment);
     }
 
     public TypeReference getType() {
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedNamedField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedNamedField.java
index 4bebc74471..27e541f124 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedNamedField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTypedNamedField.java
@@ -27,8 +27,8 @@ public class DefaultTypedNamedField extends DefaultTypedField 
{
 
     protected final String name;
 
-    public DefaultTypedNamedField(Map<String, Term> attributes, String name) {
-        super(attributes);
+    public DefaultTypedNamedField(Map<String, Term> attributes, String name, 
String comment) {
+        super(attributes, comment);
         this.name = name;
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
index e078db313c..695dbecb5d 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
@@ -22,12 +22,12 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.UnknownField;
 import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
 
 public class DefaultUnknownField extends DefaultTypedField implements 
UnknownField {
 
-    public DefaultUnknownField(Map<String, Term> attributes, 
SimpleTypeReference type) {
-        super(attributes);
+    public DefaultUnknownField(Map<String, Term> attributes, 
SimpleTypeReference type, String comment) {
+        super(attributes, comment);
         this.type = type;
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
index 8900dbfb6f..17f049819a 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultValidationField.java
@@ -18,7 +18,6 @@
  */
 package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
 import org.apache.plc4x.plugins.codegenerator.types.fields.ValidationField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
@@ -26,15 +25,14 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
-public class DefaultValidationField extends DefaultField implements 
ValidationField, Field {
+public class DefaultValidationField extends DefaultField implements 
ValidationField {
 
     private final Term validationExpression;
     private final String description;
-
     private final boolean shouldFail;
 
-    public DefaultValidationField(Map<String, Term> attributes, Term 
validationExpression, String description, boolean shouldFail) {
-        super(attributes);
+    public DefaultValidationField(Map<String, Term> attributes, Term 
validationExpression, String description, boolean shouldFail, String comment) {
+        super(attributes, comment);
         this.validationExpression = 
Objects.requireNonNull(validationExpression);
         this.description = description;
         this.shouldFail = shouldFail;
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
index edfd21c20a..ca5d7a84e4 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
@@ -1,3 +1,4 @@
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,14 +22,15 @@ package 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 import org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
 public class DefaultVirtualField extends DefaultTypedNamedField implements 
VirtualField {
 
     private final Term valueExpression;
 
-    public DefaultVirtualField(Map<String, Term> attributes, String name, Term 
valueExpression) {
-        super(attributes, name);
+    public DefaultVirtualField(Map<String, Term> attributes, String name, Term 
valueExpression, String comment) {
+        super(attributes, name, comment);
         this.valueExpression = Objects.requireNonNull(valueExpression);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/AbstractSimpleTypeReference.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/AbstractSimpleTypeReference.java
index 82dab6bce1..fd305faf08 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/AbstractSimpleTypeReference.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/AbstractSimpleTypeReference.java
@@ -45,16 +45,15 @@ public abstract class AbstractSimpleTypeReference 
implements SimpleTypeReference
     @Override
     public String toString() {
         return "AbstractSimpleTypeReference{" +
-                "baseType=" + baseType +
-                ", sizeInBits=" + sizeInBits +
-                '}';
+            "baseType=" + baseType +
+            ", sizeInBits=" + sizeInBits +
+            '}';
     }
 
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
-        if (!(o instanceof AbstractSimpleTypeReference)) return false;
-        AbstractSimpleTypeReference that = (AbstractSimpleTypeReference) o;
+        if (!(o instanceof AbstractSimpleTypeReference that)) return false;
         return getSizeInBits() == that.getSizeInBits() && getBaseType() == 
that.getBaseType();
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultEnumTypeReference.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultEnumTypeReference.java
index 6bc7617eea..e8e142600c 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultEnumTypeReference.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultEnumTypeReference.java
@@ -64,7 +64,7 @@ public class DefaultEnumTypeReference implements 
EnumTypeReference {
     @Override
     public void setTypeDefinition(TypeDefinition typeDefinition) {
         Objects.requireNonNull(typeDefinition);
-        if(!(typeDefinition instanceof EnumTypeDefinition)) {
+        if (!(typeDefinition instanceof EnumTypeDefinition)) {
             throw new IllegalArgumentException("DefaultEnumTypeReferences only 
accept instances of EnumTypeDefinitions");
         }
         this.typeDefinition = ((EnumTypeDefinition) typeDefinition);
@@ -86,9 +86,9 @@ public class DefaultEnumTypeReference implements 
EnumTypeReference {
     @Override
     public String toString() {
         return "DefaultEnumTypeReference{" +
-                "name='" + name + '\'' +
-                ", params=" + params +
-                '}';
+            "name='" + name + '\'' +
+            ", params=" + params +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultVstringTypeReference.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultVstringTypeReference.java
index 84017af6dd..e074b062f3 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultVstringTypeReference.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultVstringTypeReference.java
@@ -40,8 +40,8 @@ public class DefaultVstringTypeReference extends 
AbstractSimpleTypeReference imp
     @Override
     public String toString() {
         return "DefaultStringTypeReference{" +
-                "lengthExpression=" + lengthExpression +
-                "} " + super.toString();
+            "lengthExpression=" + lengthExpression +
+            "} " + super.toString();
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBinaryTerm.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBinaryTerm.java
index bad4776d3f..e2fa953ac4 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBinaryTerm.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBinaryTerm.java
@@ -55,10 +55,10 @@ public class DefaultBinaryTerm implements BinaryTerm {
     @Override
     public String toString() {
         return "DefaultBinaryTerm{" +
-                "a=" + a +
-                ", b=" + b +
-                ", operation='" + operation + '\'' +
-                '}';
+            "a=" + a +
+            ", b=" + b +
+            ", operation='" + operation + '\'' +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBooleanLiteral.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBooleanLiteral.java
index f16244641a..d2ed160d6b 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBooleanLiteral.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultBooleanLiteral.java
@@ -42,8 +42,8 @@ public class DefaultBooleanLiteral implements BooleanLiteral {
     @Override
     public String toString() {
         return "DefaultBooleanLiteral{" +
-                "value=" + value +
-                '}';
+            "value=" + value +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultHexadecimalLiteral.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultHexadecimalLiteral.java
index 61e7d563cc..ac5c2efe37 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultHexadecimalLiteral.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultHexadecimalLiteral.java
@@ -42,8 +42,8 @@ public class DefaultHexadecimalLiteral implements 
HexadecimalLiteral {
     @Override
     public String toString() {
         return "DefaultHexadecimalLiteral{" +
-                "hexString=" + hexString +
-                '}';
+            "hexString=" + hexString +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultNumericLiteral.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultNumericLiteral.java
index 29de4de56f..cdecc9ada8 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultNumericLiteral.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultNumericLiteral.java
@@ -42,8 +42,8 @@ public class DefaultNumericLiteral implements NumericLiteral {
     @Override
     public String toString() {
         return "DefaultNumericLiteral{" +
-                "number=" + number +
-                '}';
+            "number=" + number +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultStringLiteral.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultStringLiteral.java
index 6b876e4843..534a3c5418 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultStringLiteral.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultStringLiteral.java
@@ -42,8 +42,8 @@ public class DefaultStringLiteral implements StringLiteral {
     @Override
     public String toString() {
         return "DefaultStringLiteral{" +
-                "value='" + value + '\'' +
-                '}';
+            "value='" + value + '\'' +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultTernaryTerm.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultTernaryTerm.java
index dde9d29437..55adbaa096 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultTernaryTerm.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultTernaryTerm.java
@@ -61,11 +61,11 @@ public class DefaultTernaryTerm implements TernaryTerm {
     @Override
     public String toString() {
         return "DefaultTernaryTerm{" +
-                "a=" + a +
-                ", b=" + b +
-                ", c=" + c +
-                ", operation='" + operation + '\'' +
-                '}';
+            "a=" + a +
+            ", b=" + b +
+            ", c=" + c +
+            ", operation='" + operation + '\'' +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultUnaryTerm.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultUnaryTerm.java
index 51cae7d4db..f5d38033d1 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultUnaryTerm.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultUnaryTerm.java
@@ -49,9 +49,9 @@ public class DefaultUnaryTerm implements UnaryTerm {
     @Override
     public String toString() {
         return "DefaultUnaryTerm{" +
-                "a=" + a +
-                ", operation='" + operation + '\'' +
-                '}';
+            "a=" + a +
+            ", operation='" + operation + '\'' +
+            '}';
     }
 
     @Override
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultVariableLiteral.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultVariableLiteral.java
index 664660f13d..ce5cff8495 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultVariableLiteral.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/terms/DefaultVariableLiteral.java
@@ -29,10 +29,10 @@ import java.util.Optional;
 public class DefaultVariableLiteral implements VariableLiteral {
 
     private final String name;
-    private TypeReference typeReference;
     private final List<Term> args;
     private final Integer index;
     private final VariableLiteral child;
+    private TypeReference typeReference;
 
     public DefaultVariableLiteral(String name, List<Term> args, Integer index, 
VariableLiteral child) {
         this.name = Objects.requireNonNull(name);
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 8e7ce7e6c4..884ebaf84c 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -18,11 +18,14 @@
  */
 package org.apache.plc4x.plugins.codegenerator.language.mspec.parser;
 
+import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.RuleContext;
+import org.antlr.v4.runtime.Token;
 import org.apache.commons.io.IOUtils;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.LazyTypeDefinitionConsumer;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecBaseListener;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecLexer;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.expression.ExpressionStringParser;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.*;
@@ -30,18 +33,20 @@ import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.*;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.*;
 import 
org.apache.plc4x.plugins.codegenerator.language.mspec.model.terms.DefaultVariableLiteral;
 import org.apache.plc4x.plugins.codegenerator.protocol.TypeContext;
-import org.apache.plc4x.plugins.codegenerator.types.definitions.*;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import 
org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
 import org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
 import org.apache.plc4x.plugins.codegenerator.types.fields.ManualArrayField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
-import org.apache.plc4x.plugins.codegenerator.types.references.*;
+import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -52,43 +57,82 @@ import java.util.stream.Collectors;
 public class MessageFormatListener extends MSpecBaseListener implements 
LazyTypeDefinitionConsumer {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MessageFormatListener.class);
-
-    private Deque<List<Field>> parserContexts;
-
-    private Deque<List<EnumValue>> enumContexts;
-
     protected final Map<String, TypeDefinition> types;
-
     protected final Map<String, List<Consumer<TypeDefinition>>> 
typeDefinitionConsumers;
-
+    private final CommonTokenStream tokenStream;
     private final Stack<Map<String, Term>> batchSetAttributes = new Stack<>();
-
-    public Deque<List<Field>> getParserContexts() {
-        return parserContexts;
-    }
-
-    public Deque<List<EnumValue>> getEnumContexts() {
-        return enumContexts;
-    }
-
     private final Stack<String> currentTypeName = new Stack<>();
+    // For storing comments for complex types between enter/exit
+    private final Map<MSpecParser.ComplexTypeContext, String> 
complexTypeComments = new HashMap<>();
+    private Deque<List<Field>> parserContexts;
+    private Deque<List<EnumValue>> enumContexts;
 
-    public MessageFormatListener() {
+    public MessageFormatListener(CommonTokenStream tokenStream) {
+        this.tokenStream = tokenStream;
         types = new HashMap<>();
         typeDefinitionConsumers = new HashMap<>();
     }
 
-    public MessageFormatListener(TypeContext exitingTypeContext) {
+    public MessageFormatListener(CommonTokenStream tokenStream, TypeContext 
exitingTypeContext) {
+        this.tokenStream = tokenStream;
         types = new HashMap<>(exitingTypeContext.getTypeDefinitions());
         typeDefinitionConsumers = new 
HashMap<>(exitingTypeContext.getUnresolvedTypeReferences());
     }
 
+    public Deque<List<Field>> getParserContexts() {
+        return parserContexts;
+    }
+
+    public Deque<List<EnumValue>> getEnumContexts() {
+        return enumContexts;
+    }
+
     @Override
     public void enterFile(MSpecParser.FileContext ctx) {
         parserContexts = new LinkedList<>();
         enumContexts = new LinkedList<>();
     }
 
+    // Helper: Attach comment if directly above or on the same line
+    private String consumePendingComment(ParserRuleContext ctx) {
+        ctx = ctx.getParent(); // TODO: this is because of the stupid bracket 
which is considered a previous token... figure out a smart way
+        Token startToken = ctx.getStart();
+
+        List<Token> frontComments = new LinkedList<>();
+        int tokenIndex = startToken.getTokenIndex();
+        List<Token> hiddenToLeft = 
tokenStream.getHiddenTokensToLeft(tokenIndex);
+        if (hiddenToLeft != null) {
+            hiddenToLeft.reversed().stream()
+                .takeWhile(token -> frontComments.isEmpty() || 
(token.getType() != MSpecLexer.WS))
+                .filter(token -> token.getType() == MSpecLexer.LINE_COMMENT || 
token.getType() == MSpecLexer.BLOCK_COMMENT)
+                .forEach(frontComments::add);
+        }
+        Token eolComment = null;
+        List<Token> hiddenToRight = 
tokenStream.getHiddenTokensToRight(tokenIndex);
+        if (hiddenToRight != null) {
+            eolComment = hiddenToRight.stream()
+                .filter(token -> token.getType() == MSpecLexer.LINE_COMMENT || 
token.getType() == MSpecLexer.BLOCK_COMMENT)
+                .findFirst()
+                .orElse(null);
+        }
+
+        StringBuilder comment = new StringBuilder();
+
+        var defLine = startToken.getLine();
+        if (!frontComments.isEmpty() && frontComments.getFirst().getLine() == 
defLine - 1) {
+            frontComments.reversed().forEach(token -> 
comment.append(token.getText()));
+        }
+
+        if (eolComment != null && eolComment.getLine() == defLine) {
+            comment.append(eolComment.getText());
+        }
+
+        if (comment.isEmpty()) {
+            return null;
+        }
+        return comment.toString();
+    }
+
     @Override
     public void enterContantsDefinition(MSpecParser.ContantsDefinitionContext 
ctx) {
         currentTypeName.push("Constants");
@@ -107,9 +151,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         String typeName = "Constants";
 
         // If the type has subtypes, it's an abstract type.
-        final List<Field> fields = parserContexts.pop();
-        DefaultConstantsTypeDefinition type = new 
DefaultConstantsTypeDefinition(
-            typeName, Collections.emptyMap(), Collections.emptyList(), fields);
+        var fields = parserContexts.pop();
+        var type = new DefaultConstantsTypeDefinition(typeName, fields, 
consumePendingComment(ctx));
         // Link the fields and the complex types.
         if (fields != null) {
             fields.forEach(field -> ((DefaultField) field).setOwner(type));
@@ -145,65 +188,66 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         // Set a map of attributes that should be set for all fields.
         Map<String, Term> curBatchSetAttributes = new HashMap<>();
         // Add all attributes defined in the current batchSet field.
-        for (MSpecParser.AttributeContext attributeContext : 
ctx.attributes.attribute()) {
-            Term attributeExpression = 
getExpressionTerm(attributeContext.value);
+        for (var attributeContext : ctx.attributes.attribute()) {
+            var attributeExpression = 
getExpressionTerm(attributeContext.value);
             curBatchSetAttributes.put(attributeContext.name.getText(), 
attributeExpression);
         }
         // Make the new Map the top of the stack.
         batchSetAttributes.push(curBatchSetAttributes);
 
+        // Attach comment if present (store for use in exit)
+        var comment = consumePendingComment(ctx);
+        if (comment != null) {
+            complexTypeComments.put(ctx, comment);
+        }
+
         if ("enum".equals(ctx.getChild(0).getText())) {
-            List<EnumValue> enumContext = new LinkedList<>();
+            var enumContext = new LinkedList<EnumValue>();
             enumContexts.push(enumContext);
         } else {
-            List<Field> parserContext = new LinkedList<>();
+            var parserContext = new LinkedList<Field>();
             parserContexts.push(parserContext);
         }
     }
 
     @Override
     public void exitComplexType(MSpecParser.ComplexTypeContext ctx) {
-        String typeName = getIdString(ctx.name);
-        List<Argument> parserArguments = null;
-        if (ctx.params != null) {
-            parserArguments = getParserArguments(ctx.params.argument());
-        }
+        var typeName = getIdString(ctx.name);
+        var parserArguments = ctx.params != null ? 
getParserArguments(ctx.params.argument()) : null;
 
-        final Map<String, Term> attributes = batchSetAttributes.peek();
+        var attributes = batchSetAttributes.peek();
         // Handle enum types.
         if ("enum".equals(ctx.getChild(0).getText())) {
-            SimpleTypeReference type = (ctx.type != null) ? 
getSimpleTypeReference(ctx.type) : null;
-            List<EnumValue> enumValues = getEnumValues();
+            var type = ctx.type != null ? getSimpleTypeReference(ctx.type) : 
null;
+            var enumValues = getEnumValues();
             if (type == null) {
                 // in case there is no type we default to uint32
                 type = new 
DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.UINT, 32);
             }
-            DefaultEnumTypeDefinition enumType = new 
DefaultEnumTypeDefinition(typeName, type, attributes, enumValues,
-                parserArguments);
+            var enumType = new DefaultEnumTypeDefinition(typeName, type, 
attributes, enumValues, parserArguments, consumePendingComment(ctx));
             dispatchType(typeName, enumType);
             enumContexts.pop();
-        } else if (ctx.dataIoTypeSwitch != null) {  // Handle data-io types.
-            SwitchField switchField = getSwitchField();
-            DefaultDataIoTypeDefinition type = new 
DefaultDataIoTypeDefinition(typeName, attributes, parserArguments, switchField);
+        } else if (ctx.dataIoTypeSwitch != null) { // Handle data-io types.
+            var switchField = getSwitchField();
+            var type = new DefaultDataIoTypeDefinition(typeName, attributes, 
parserArguments, switchField, consumePendingComment(ctx));
             dispatchType(typeName, type);
 
             // Set the parent type for all sub-types.
             if (switchField != null) {
                 for (DiscriminatedComplexTypeDefinition subtype : 
switchField.getCases()) {
-                    if (subtype instanceof 
DefaultDiscriminatedComplexTypeDefinition) {
-                        LOGGER.debug("Setting parent {} for {}", type, 
subtype);
-                        ((DefaultDiscriminatedComplexTypeDefinition) 
subtype).setParentType(type);
+                    if (subtype instanceof 
DefaultDiscriminatedComplexTypeDefinition ddctd) {
+                        LOGGER.debug("Setting parent {} for {}", type, ddctd);
+                        ddctd.setParentType(type);
                     }
                 }
             }
             parserContexts.pop();
         } else { // Handle all other types.
             // If the type has sub-types it's an abstract type.
-            SwitchField switchField = getSwitchField();
-            boolean abstractType = switchField != null;
-            final List<Field> fields = parserContexts.pop();
-            DefaultComplexTypeDefinition type = new 
DefaultComplexTypeDefinition(
-                typeName, attributes, parserArguments, abstractType, fields);
+            var switchField = getSwitchField();
+            var abstractType = switchField != null;
+            var fields = parserContexts.pop();
+            var type = new DefaultComplexTypeDefinition(typeName, attributes, 
parserArguments, abstractType, fields, complexTypeComments.remove(ctx));
             // Link the fields and the complex types.
             if (fields != null) {
                 fields.forEach(field -> ((DefaultField) field).setOwner(type));
@@ -220,10 +264,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         Optional<SwitchField> switchField = type.getSwitchField();
         if (switchField.isPresent()) {
             for (DiscriminatedComplexTypeDefinition subtype : 
switchField.get().getCases()) {
-                if (subtype instanceof 
DefaultDiscriminatedComplexTypeDefinition) {
-                    LOGGER.debug("Setting parent {} for {}", type, subtype);
-                    ((DefaultDiscriminatedComplexTypeDefinition) 
subtype).setParentType(type);
-                    
setParentRelationship((DefaultDiscriminatedComplexTypeDefinition) subtype);
+                if (subtype instanceof 
DefaultDiscriminatedComplexTypeDefinition ddct) {
+                    LOGGER.debug("Setting parent {} for {}", type, ddct);
+                    ddct.setParentType(type);
+                    setParentRelationship(ddct);
                 }
             }
         }
@@ -232,7 +276,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterBatchSetDefinition(MSpecParser.BatchSetDefinitionContext 
ctx) {
         // Set a map of attributes that should be set for all fields.
-        Map<String, Term> curBatchSetAttributes = new HashMap<>();
+        var curBatchSetAttributes = new HashMap<String, Term>();
         // Add all attributes of the lower layers and initialize the new map 
with it.
         if (!batchSetAttributes.empty()) {
             curBatchSetAttributes.putAll(batchSetAttributes.peek());
@@ -254,8 +298,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterAbstractField(MSpecParser.AbstractFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        DefaultAbstractField field = new 
DefaultAbstractField(getAttributes(ctx), name);
+        var name = getIdString(ctx.name);
+        var field = new DefaultAbstractField(getAttributes(ctx), name, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -271,10 +315,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterArrayField(MSpecParser.ArrayFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        ArrayField.LoopType loopType = 
ArrayField.LoopType.valueOf(ctx.loopType.getText().toUpperCase());
-        Term loopExpression = getExpressionTerm(ctx.loopExpression);
-        DefaultArrayField field = new DefaultArrayField(getAttributes(ctx), 
name, loopType, loopExpression);
+        var name = getIdString(ctx.name);
+        var loopType = 
ArrayField.LoopType.valueOf(ctx.loopType.getText().toUpperCase());
+        var loopExpression = getExpressionTerm(ctx.loopExpression);
+        var field = new DefaultArrayField(getAttributes(ctx), name, loopType, 
loopExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -290,9 +334,9 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterAssertField(MSpecParser.AssertFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        Term conditionExpression = getExpressionTerm(ctx.condition);
-        DefaultAssertField field = new DefaultAssertField(getAttributes(ctx), 
name, conditionExpression);
+        var name = getIdString(ctx.name);
+        var conditionExpression = getExpressionTerm(ctx.condition);
+        var field = new DefaultAssertField(getAttributes(ctx), name, 
conditionExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -308,10 +352,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterChecksumField(MSpecParser.ChecksumFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        String name = getIdString(ctx.name);
-        Term checksumExpression = getExpressionTerm(ctx.checksumExpression);
-        Field field = new DefaultChecksumField(getAttributes(ctx), type, name, 
checksumExpression);
+        var type = getSimpleTypeReference(ctx.type);
+        var name = getIdString(ctx.name);
+        var checksumExpression = getExpressionTerm(ctx.checksumExpression);
+        var field = new DefaultChecksumField(getAttributes(ctx), type, name, 
checksumExpression, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -319,8 +363,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterConstField(MSpecParser.ConstFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        DefaultConstField field = new DefaultConstField(getAttributes(ctx), 
name, getValueLiteral(ctx.expected));
+        var name = getIdString(ctx.name);
+        var field = new DefaultConstField(getAttributes(ctx), name, 
getValueLiteral(ctx.expected), consumePendingComment(ctx));
         if (ctx.type.dataType() != null) {
             field.setType(getSimpleTypeReference(ctx.type.dataType()));
         } else {
@@ -340,8 +384,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterDiscriminatorField(MSpecParser.DiscriminatorFieldContext 
ctx) {
-        String name = getIdString(ctx.name);
-        DefaultDiscriminatorField field = new 
DefaultDiscriminatorField(getAttributes(ctx), name);
+        var name = getIdString(ctx.name);
+        var field = new DefaultDiscriminatorField(getAttributes(ctx), name, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -357,15 +401,15 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterEnumField(MSpecParser.EnumFieldContext ctx) {
-        String typeRefName = ctx.type.complexTypeReference.getText();
-        DefaultEnumTypeReference type = new 
DefaultEnumTypeReference(typeRefName, null);
+        var typeRefName = ctx.type.complexTypeReference.getText();
+        var type = new DefaultEnumTypeReference(typeRefName, null);
         setOrScheduleTypeDefinitionConsumer(typeRefName, 
type::setTypeDefinition);
-        String name = getIdString(ctx.name);
+        var name = getIdString(ctx.name);
         String fieldName = null;
         if (ctx.fieldName != null) {
             fieldName = getIdString(ctx.fieldName);
         }
-        Field field = new DefaultEnumField(getAttributes(ctx), type, name, 
fieldName);
+        var field = new DefaultEnumField(getAttributes(ctx), type, name, 
fieldName, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -373,10 +417,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        String name = getIdString(ctx.name);
-        Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
-        Field field = new DefaultImplicitField(getAttributes(ctx), type, name, 
serializeExpression);
+        var type = getSimpleTypeReference(ctx.type);
+        var name = getIdString(ctx.name);
+        var serializeExpression = getExpressionTerm(ctx.serializeExpression);
+        var field = new DefaultImplicitField(getAttributes(ctx), type, name, 
serializeExpression, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -392,7 +436,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
         Term lengthExpression = getExpressionTerm(ctx.lengthExpression);
         DefaultManualArrayField field = new 
DefaultManualArrayField(getAttributes(ctx), name, loopType, loopExpression,
-            parseExpression, serializeExpression, lengthExpression);
+            parseExpression, serializeExpression, lengthExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -412,8 +456,9 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         Term parseExpression = getExpressionTerm(ctx.parseExpression);
         Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
         Term lengthExpression = getExpressionTerm(ctx.lengthExpression);
-        DefaultManualField field = new DefaultManualField(getAttributes(ctx), 
name, parseExpression, serializeExpression,
-            lengthExpression);
+        DefaultManualField field = new DefaultManualField(getAttributes(ctx), 
name, parseExpression,
+            serializeExpression,
+            lengthExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -434,7 +479,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.condition != null) {
             conditionExpression = getExpressionTerm(ctx.condition);
         }
-        DefaultOptionalField field = new 
DefaultOptionalField(getAttributes(ctx), name, conditionExpression);
+        var field = new DefaultOptionalField(getAttributes(ctx), name, 
conditionExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -450,11 +495,11 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterPaddingField(MSpecParser.PaddingFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        String name = getIdString(ctx.name);
-        Term paddingValue = getExpressionTerm(ctx.paddingValue);
-        Term timesPadding = getExpressionTerm(ctx.timesPadding);
-        Field field = new DefaultPaddingField(getAttributes(ctx), type, name, 
paddingValue, timesPadding);
+        var type = getSimpleTypeReference(ctx.type);
+        var name = getIdString(ctx.name);
+        var paddingValue = getExpressionTerm(ctx.paddingValue);
+        var timesPadding = getExpressionTerm(ctx.timesPadding);
+        var field = new DefaultPaddingField(getAttributes(ctx), type, name, 
paddingValue, timesPadding, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -462,12 +507,12 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterPeekField(MSpecParser.PeekFieldContext ctx) {
-        String name = getIdString(ctx.name);
+        var name = getIdString(ctx.name);
         Term offsetExpression = null;
         if (ctx.offset != null) {
             offsetExpression = getExpressionTerm(ctx.offset);
         }
-        DefaultPeekField field = new DefaultPeekField(getAttributes(ctx), 
name, offsetExpression);
+        var field = new DefaultPeekField(getAttributes(ctx), name, 
offsetExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -483,9 +528,9 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterReservedField(MSpecParser.ReservedFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        String expected = getExprString(ctx.expected);
-        Field field = new DefaultReservedField(getAttributes(ctx), type, 
expected);
+        var type = getSimpleTypeReference(ctx.type);
+        var expected = getExprString(ctx.expected);
+        var field = new DefaultReservedField(getAttributes(ctx), type, 
expected, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -493,8 +538,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterSimpleField(MSpecParser.SimpleFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        DefaultSimpleField field = new DefaultSimpleField(getAttributes(ctx), 
name);
+        var name = getIdString(ctx.name);
+        var field = new DefaultSimpleField(getAttributes(ctx), name, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -510,31 +555,35 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterStateField(MSpecParser.StateFieldContext ctx) {
-        String name = getIdString(ctx.name);
+        var name = getIdString(ctx.name);
         // Get the type information from the parents arguments.
-        ParserRuleContext parent = ctx.getParent().getParent().getParent();
-        if (!(parent instanceof MSpecParser.ComplexTypeContext) && !(parent 
instanceof MSpecParser.CaseStatementContext)) {
+        var parent = ctx.getParent().getParent().getParent();
+        if (!(parent instanceof MSpecParser.ComplexTypeContext)
+            && !(parent instanceof MSpecParser.CaseStatementContext)) {
             throw new RuntimeException("state fields must only be defined in 
complex types");
         }
         Optional<MSpecParser.ArgumentContext> argumentContext;
-        if (parent instanceof MSpecParser.ComplexTypeContext) {
-            MSpecParser.ComplexTypeContext complexTypeContext = 
(MSpecParser.ComplexTypeContext) parent;
-            argumentContext = 
complexTypeContext.params.argument().stream().filter(argContext -> 
argContext.name.getText().equalsIgnoreCase(name)).findFirst();
+        if (parent instanceof MSpecParser.ComplexTypeContext 
complexTypeContext) {
+            argumentContext = complexTypeContext.params.argument().stream()
+                .filter(argContext -> 
argContext.name.getText().equalsIgnoreCase(name)).findFirst();
         } else {
             RuleContext curContext = parent;
-            while((curContext.parent != null) && !(curContext.parent 
instanceof MSpecParser.ComplexTypeContext)) {
+            while ((curContext.parent != null) && !(curContext.parent 
instanceof MSpecParser.ComplexTypeContext)) {
                 curContext = curContext.parent;
             }
             if (curContext.parent == null) {
-                throw new RuntimeException("state fields must refer to 
arguments by using the same name. Parent context is null.");
+                throw new RuntimeException(
+                    "state fields must refer to arguments by using the same 
name. Parent context is null.");
             }
-            MSpecParser.ComplexTypeContext complexTypeContext = 
(MSpecParser.ComplexTypeContext) curContext.parent;
-            argumentContext = 
complexTypeContext.params.argument().stream().filter(argContext -> 
argContext.name.getText().equalsIgnoreCase(name)).findFirst();
+            var complexTypeContext = (MSpecParser.ComplexTypeContext) 
curContext.parent;
+            argumentContext = complexTypeContext.params.argument().stream()
+                .filter(argContext -> 
argContext.name.getText().equalsIgnoreCase(name)).findFirst();
         }
-        MSpecParser.TypeReferenceContext type = argumentContext.orElseThrow(() 
-> new RuntimeException("state fields must refer to arguments by using the same 
name.")).type;
+        var type = argumentContext.orElseThrow(
+            () -> new RuntimeException("state fields must refer to arguments 
by using the same name.")).type;
         // The variable term is always just a direct reference to the parser 
argument.
-        Term valueExpression = new DefaultVariableLiteral(name, null, null, 
null);
-        DefaultStateField field = new DefaultStateField(getAttributes(ctx), 
name, valueExpression);
+        var valueExpression = new DefaultVariableLiteral(name, null, null, 
null);
+        var field = new DefaultStateField(getAttributes(ctx), name, 
valueExpression, consumePendingComment(ctx));
         getTypeReference(type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -550,10 +599,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterTypeSwitchField(MSpecParser.TypeSwitchFieldContext ctx) {
-        List<VariableLiteral> variableLiterals = 
ctx.discriminators.variableLiteral().stream()
+        var variableLiterals = ctx.discriminators.variableLiteral().stream()
             .map(this::getVariableLiteral)
             .collect(Collectors.toList());
-        DefaultSwitchField field = new DefaultSwitchField(getAttributes(ctx), 
variableLiterals);
+        var field = new DefaultSwitchField(getAttributes(ctx), 
variableLiterals, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -561,8 +610,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterUnknownField(MSpecParser.UnknownFieldContext ctx) {
-        SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        Field field = new DefaultUnknownField(getAttributes(ctx), type);
+        var type = getSimpleTypeReference(ctx.type);
+        var field = new DefaultUnknownField(getAttributes(ctx), type, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -570,8 +619,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterValidationField(MSpecParser.ValidationFieldContext ctx) {
-        Term validationExpression = 
getExpressionTerm(ctx.validationExpression);
-        boolean shouldFail = true;
+        var validationExpression = getExpressionTerm(ctx.validationExpression);
+        var shouldFail = true;
         if (ctx.shouldFail != null) {
             shouldFail = "true".equalsIgnoreCase(ctx.shouldFail.getText());
         }
@@ -579,7 +628,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.description != null) {
             description = ctx.description.getText();
         }
-        Field field = new DefaultValidationField(getAttributes(ctx), 
validationExpression, description, shouldFail);
+        var field = new DefaultValidationField(getAttributes(ctx), 
validationExpression, description, shouldFail, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -587,9 +636,9 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void enterVirtualField(MSpecParser.VirtualFieldContext ctx) {
-        String name = getIdString(ctx.name);
-        Term valueExpression = getExpressionTerm(ctx.valueExpression);
-        DefaultVirtualField field = new 
DefaultVirtualField(getAttributes(ctx), name, valueExpression);
+        var name = getIdString(ctx.name);
+        var valueExpression = getExpressionTerm(ctx.valueExpression);
+        var field = new DefaultVirtualField(getAttributes(ctx), name, 
valueExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -608,11 +657,11 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         List<Field> parserContext = new LinkedList<>();
 
         // Calculate the name of the current type
-        String namePrefix = "";
-        if(ctx.nameWildcard != null) {
+        var namePrefix = "";
+        if (ctx.nameWildcard != null) {
             namePrefix = getCurrentTypeName();
         }
-        String typeName = namePrefix + ctx.name.getText();
+        var typeName = namePrefix + ctx.name.getText();
 
         currentTypeName.push(typeName);
         // For DataIo we don't generate types.
@@ -625,24 +674,29 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void exitCaseStatement(MSpecParser.CaseStatementContext ctx) {
-        String typeName = currentTypeName.pop();
+        var typeName = currentTypeName.pop();
         // For DataIo we don't generate types.
         if (ctx.parent.parent instanceof MSpecParser.DataIoDefinitionContext) {
             currentTypeName.push(typeName);
             typeName = ctx.name.getText();
         }
 
-        boolean abstractType = getSwitchField() != null;
+        var abstractType = getSwitchField() != null;
 
-        final Map<String, Term> attributes = batchSetAttributes.peek();
+        var attributes = batchSetAttributes.peek();
 
-        List<Argument> parserArguments = new LinkedList<>();
+        var parserArguments = new LinkedList<Argument>();
         // For DataIO types, add all the arguments from the parent type.
-/*        if (!(ctx.parent.parent.parent.parent instanceof 
MSpecParser.ComplexTypeContext)
-            && ((MSpecParser.ComplexTypeContext) 
ctx.parent.parent.parent).params != null) {
-            parserArguments.addAll(getParserArguments(
-                ((MSpecParser.ComplexTypeContext) 
ctx.parent.parent.parent).params.argument()));
-        }*/
+        /*
+         * if (!(ctx.parent.parent.parent.parent instanceof
+         * MSpecParser.ComplexTypeContext)
+         * && ((MSpecParser.ComplexTypeContext) 
ctx.parent.parent.parent).params !=
+         * null) {
+         * parserArguments.addAll(getParserArguments(
+         * ((MSpecParser.ComplexTypeContext)
+         * ctx.parent.parent.parent).params.argument()));
+         * }
+         */
         // Add all eventually existing local arguments.
         if (ctx.argumentList() != null) {
             
parserArguments.addAll(getParserArguments(ctx.argumentList().argument()));
@@ -656,22 +710,21 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         } else {
             discriminatorValues = Collections.emptyList();
         }
-        final List<Field> fields = parserContexts.pop();
-        DefaultDiscriminatedComplexTypeDefinition type =
-            new DefaultDiscriminatedComplexTypeDefinition(typeName, 
attributes, parserArguments, abstractType,
-                fields, discriminatorValues);
+        var fields = parserContexts.pop();
+        var type = new DefaultDiscriminatedComplexTypeDefinition(typeName, 
attributes, parserArguments, abstractType, fields, discriminatorValues, 
consumePendingComment(ctx));
         // Link the fields and the complex types.
         if (fields != null) {
             fields.forEach(field -> ((DefaultField) field).setOwner(type));
         }
 
-        // For DataIO we don't need to generate the sub-types as these will be 
PlcValues.
+        // For DataIO we don't need to generate the sub-types as these will be
+        // PlcValues.
         if (!(ctx.parent.parent instanceof 
MSpecParser.DataIoDefinitionContext)) {
             dispatchType(typeName, type);
         }
 
         // Add the type to the switch field definition.
-        DefaultSwitchField switchField = getSwitchField();
+        var switchField = getSwitchField();
         if (switchField == null) {
             throw new RuntimeException("This shouldn't have happened");
         }
@@ -680,14 +733,15 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     @Override
     public void 
enterEnumValueDefinition(MSpecParser.EnumValueDefinitionContext ctx) {
-        String value = (ctx.valueExpression != null) ? 
unquoteString(ctx.valueExpression.getText()) : null;
-        String name = ctx.name.getText();
+        var value = (ctx.valueExpression != null) ? 
unquoteString(ctx.valueExpression.getText()) : null;
+        var name = ctx.name.getText();
         Map<String, String> constants = null;
         if (ctx.constantValueExpressions != null) {
-            MSpecParser.ComplexTypeContext parentCtx = 
(MSpecParser.ComplexTypeContext) ctx.parent;
-            int numConstantValues = parentCtx.params.argument().size();
-            int numExpressionValues = 
ctx.constantValueExpressions.expression().size();
-            // This only works if we provide exactly the same number of 
expressions as we defined constants
+            var parentCtx = (MSpecParser.ComplexTypeContext) ctx.parent;
+            var numConstantValues = parentCtx.params.argument().size();
+            var numExpressionValues = 
ctx.constantValueExpressions.expression().size();
+            // This only works if we provide exactly the same number of 
expressions as we
+            // defined constants
             if (numConstantValues != numExpressionValues) {
                 throw new RuntimeException("Number of constant value 
expressions doesn't match the number of " +
                     "defined constants. Expecting " + numConstantValues + " 
but got " + numExpressionValues);
@@ -696,10 +750,10 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
             // Build a map of the constant expressions (With the constant name 
as key)
             constants = new HashMap<>();
             for (int i = 0; i < numConstantValues; i++) {
-                MSpecParser.ArgumentContext argumentContext = 
parentCtx.params.argument(i);
-                String constantName = argumentContext.name.getText();
-                MSpecParser.ExpressionContext expression = 
ctx.constantValueExpressions.expression(i);
-                String constant = unquoteString(expression.getText());
+                var argumentContext = parentCtx.params.argument(i);
+                var constantName = argumentContext.name.getText();
+                var expression = ctx.constantValueExpressions.expression(i);
+                var constant = unquoteString(expression.getText());
                 // String expressions are double escaped
                 if (constant != null && constant.startsWith("\"")) {
                     constant = unquoteString(constant);
@@ -707,18 +761,18 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
                 constants.put(constantName, constant);
             }
         }
-        List<EnumValue> enumValues = 
Objects.requireNonNull(this.enumContexts.peek());
+        var enumValues = Objects.requireNonNull(this.enumContexts.peek());
         if (value == null) {
             // If no values are specified we count
-            String counted = "0";
-            if (enumValues.size() > 0) {
-                String previousValue = enumValues.get(enumValues.size() - 
1).getValue();
-                int parsedPreviousValue = Integer.parseInt(previousValue);
+            var counted = "0";
+            if (!enumValues.isEmpty()) {
+                var previousValue = enumValues.getLast().getValue();
+                var parsedPreviousValue = Integer.parseInt(previousValue);
                 counted = "" + (parsedPreviousValue + 1);
             }
             value = counted;
         }
-        final DefaultEnumValue enumValue = new DefaultEnumValue(value, name, 
constants);
+        var enumValue = new DefaultEnumValue(value, name, constants, 
consumePendingComment(ctx));
         enumValues.add(enumValue);
     }
 
@@ -726,12 +780,12 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (expressionContext.ASTERISK() != null) {
             return WildcardTerm.INSTANCE;
         }
-        String expressionString = getExprString(expressionContext);
+        var expressionString = getExprString(expressionContext);
         Objects.requireNonNull(expressionString, "Expression string should not 
be null");
-        InputStream inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
+        var inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
 
         Objects.requireNonNull(getCurrentTypeName(), "expression term can only 
occur within a type");
-        ExpressionStringParser parser = new ExpressionStringParser(this, 
getCurrentTypeName());
+        var parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             return parser.parse(inputStream);
         } catch (Exception e) {
@@ -742,29 +796,32 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
     private VariableLiteral 
getVariableLiteral(MSpecParser.VariableLiteralContext variableLiteralContext) {
         // TODO: make nullsafe
-        final String variableLiteral = variableLiteralContext.getText();
-        InputStream inputStream = IOUtils.toInputStream(variableLiteral, 
Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, 
getCurrentTypeName());
+        var variableLiteral = variableLiteralContext.getText();
+        var inputStream = IOUtils.toInputStream(variableLiteral, 
Charset.defaultCharset());
+        var parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
-            // As this come from a VariableLiteralContext we know that it is a 
VariableLiteral
+            // As this come from a VariableLiteralContext we know that it is a
+            // VariableLiteral
             return (VariableLiteral) parser.parse(inputStream);
         } catch (Exception e) {
             throw new RuntimeException(String.format("Error parsing variable 
literal: '%s' at line %d column %d",
-                variableLiteral, variableLiteralContext.start.getLine(), 
variableLiteralContext.start.getStartIndex()), e);
+                variableLiteral, variableLiteralContext.start.getLine(),
+                variableLiteralContext.start.getStartIndex()), e);
         }
     }
 
     private Literal getValueLiteral(MSpecParser.ValueLiteralContext 
valueLiteralContext) {
         // TODO: make nullsafe
-        final String valueLiteralContextText = valueLiteralContext.getText();
-        InputStream inputStream = 
IOUtils.toInputStream(valueLiteralContextText, Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, 
getCurrentTypeName());
+        var valueLiteralContextText = valueLiteralContext.getText();
+        var inputStream = IOUtils.toInputStream(valueLiteralContextText, 
Charset.defaultCharset());
+        var parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             // As this come from a ValueLiteralContext we know that it is a 
Literal
             return (Literal) parser.parse(inputStream);
         } catch (Exception e) {
             throw new RuntimeException(String.format("Error parsing variable 
literal: '%s' at line %d column %d",
-                valueLiteralContextText, valueLiteralContext.start.getLine(), 
valueLiteralContext.start.getStartIndex()), e);
+                valueLiteralContextText, valueLiteralContext.start.getLine(),
+                valueLiteralContext.start.getStartIndex()), e);
         }
     }
 
@@ -773,18 +830,20 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
             return 
CompletableFuture.completedFuture(getSimpleTypeReference(ctx.simpleTypeReference));
         } else {
             CompletableFuture<TypeReference> typeReferenceCompletableFuture = 
new CompletableFuture<>();
-            String typeRefName = ctx.complexTypeReference.getText();
+            var typeRefName = ctx.complexTypeReference.getText();
             setOrScheduleTypeDefinitionConsumer(typeRefName, typeDefinition -> 
{
                 if (typeDefinition.isDataIoTypeDefinition()) {
-                    DefaultDataIoTypeReference value = new 
DefaultDataIoTypeReference(typeRefName, getParams(ctx.params));
+                    var value = new DefaultDataIoTypeReference(typeRefName,
+                        getParams(ctx.params));
                     value.setTypeDefinition(typeDefinition);
                     typeReferenceCompletableFuture.complete(value);
                 } else if (typeDefinition.isComplexTypeDefinition()) {
-                    DefaultComplexTypeReference value = new 
DefaultComplexTypeReference(typeRefName, getParams(ctx.params));
+                    var value = new DefaultComplexTypeReference(typeRefName,
+                        getParams(ctx.params));
                     value.setTypeDefinition(typeDefinition);
                     typeReferenceCompletableFuture.complete(value);
                 } else if (typeDefinition.isEnumTypeDefinition()) {
-                    DefaultEnumTypeReference value = new 
DefaultEnumTypeReference(typeRefName, getParams(ctx.params));
+                    var value = new DefaultEnumTypeReference(typeRefName, 
getParams(ctx.params));
                     value.setTypeDefinition(typeDefinition);
                     typeReferenceCompletableFuture.complete(value);
                 } else {
@@ -796,12 +855,12 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     }
 
     private SimpleTypeReference 
getSimpleTypeReference(MSpecParser.DataTypeContext ctx) {
-        SimpleTypeReference.SimpleBaseType simpleBaseType =
-            
SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
+        var simpleBaseType = SimpleTypeReference.SimpleBaseType
+            .valueOf(ctx.base.getText().toUpperCase());
         // String types need an additional length expression.
         if (simpleBaseType == SimpleTypeReference.SimpleBaseType.VSTRING) {
             if (ctx.length != null) {
-                Term lengthExpression = getExpressionTerm(ctx.length);
+                var lengthExpression = getExpressionTerm(ctx.length);
                 return new DefaultVstringTypeReference(simpleBaseType, 
lengthExpression);
             } else {
                 return new DefaultVstringTypeReference(simpleBaseType, null);
@@ -810,21 +869,22 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         switch (simpleBaseType) {
             case INT:
             case UINT:
-                int integerSize = Integer.parseInt(ctx.size.getText());
+                var integerSize = Integer.parseInt(ctx.size.getText());
                 return new DefaultIntegerTypeReference(simpleBaseType, 
integerSize);
             case VINT: {
-                final Map<String, Term> attributes = 
getAttributes(ctx.parent.parent);
+                var attributes = getAttributes(ctx.parent.parent);
                 SimpleTypeReference propertyType;
-                int propertySizeInBits = 32;
+                var propertySizeInBits = 32;
                 if (attributes.containsKey("propertySizeInBits")) {
-                    final Term propertySizeInBitsTerm = 
attributes.get("propertySizeInBits");
-                    if (!(propertySizeInBitsTerm instanceof NumericLiteral)) {
-                        throw new RuntimeException("'propertySizeInBits' 
attribute is required to be a numeric literal");
+                    var propertySizeInBitsTerm = 
attributes.get("propertySizeInBits");
+                    if (!(propertySizeInBitsTerm instanceof NumericLiteral 
propertySizeInBitsLiteral)) {
+                        throw new RuntimeException(
+                            "'propertySizeInBits' attribute is required to be 
a numeric literal");
                     }
-                    NumericLiteral propertySizeInBitsLiteral = 
(NumericLiteral) propertySizeInBitsTerm;
                     propertySizeInBits = 
propertySizeInBitsLiteral.getNumber().intValue();
                 }
-                propertyType = new 
DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.INT, 
propertySizeInBits);
+                propertyType = new 
DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.INT,
+                    propertySizeInBits);
                 return new DefaultVintegerTypeReference(simpleBaseType, 
propertyType);
             }
             case VUINT: {
@@ -833,13 +893,14 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
                 int propertySizeInBits = 32;
                 if (attributes.containsKey("propertySizeInBits")) {
                     final Term propertySizeInBitsTerm = 
attributes.get("propertySizeInBits");
-                    if (!(propertySizeInBitsTerm instanceof NumericLiteral)) {
-                        throw new RuntimeException("'propertySizeInBits' 
attribute is required to be a numeric literal");
+                    if (!(propertySizeInBitsTerm instanceof NumericLiteral 
propertySizeInBitsLiteral)) {
+                        throw new RuntimeException(
+                            "'propertySizeInBits' attribute is required to be 
a numeric literal");
                     }
-                    NumericLiteral propertySizeInBitsLiteral = 
(NumericLiteral) propertySizeInBitsTerm;
                     propertySizeInBits = 
propertySizeInBitsLiteral.getNumber().intValue();
                 }
-                propertyType = new 
DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.UINT, 
propertySizeInBits);
+                propertyType = new 
DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.UINT,
+                    propertySizeInBits);
                 return new DefaultVintegerTypeReference(simpleBaseType, 
propertyType);
             }
             case FLOAT:
@@ -863,7 +924,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     }
 
     private DefaultSwitchField getSwitchField() {
-        for (Field field : Objects.requireNonNull(parserContexts.peek())) {
+        for (var field : Objects.requireNonNull(parserContexts.peek())) {
             if (field instanceof DefaultSwitchField) {
                 return (DefaultSwitchField) field;
             }
@@ -903,8 +964,8 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     }
 
     private Term parseExpression(String expressionString) {
-        InputStream inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, 
getCurrentTypeName());
+        var inputStream = IOUtils.toInputStream(expressionString, 
Charset.defaultCharset());
+        var parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             return parser.parse(inputStream);
         } catch (Exception e) {
@@ -913,7 +974,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     }
 
     private String getCurrentTypeName() {
-        if(currentTypeName.isEmpty()) {
+        if (currentTypeName.isEmpty()) {
             return null;
         }
         return currentTypeName.peek();
@@ -926,8 +987,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
             attributes.putAll(batchSetAttributes.peek());
         }
         // Add any attributes set on the current field itself.
-        if (ctx.parent.parent instanceof MSpecParser.FieldDefinitionContext) {
-            MSpecParser.FieldDefinitionContext fieldDefinitionContext = 
(MSpecParser.FieldDefinitionContext) ctx.parent.parent;
+        if (ctx.parent.parent instanceof MSpecParser.FieldDefinitionContext 
fieldDefinitionContext) {
             for (MSpecParser.AttributeContext attributeContext : 
fieldDefinitionContext.attributes.attribute()) {
                 Term attributeExpression = 
getExpressionTerm(attributeContext.value);
                 attributes.put(attributeContext.name.getText(), 
attributeExpression);
@@ -962,12 +1022,13 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
         if (types.containsKey(typeName)) {
             LOGGER.warn("{} being overridden", typeName);
-            // TODO: we need to implement replace logic... means we need to 
replace all old references with the new one in that case otherwise we just get 
an exception
+            // TODO: we need to implement replace logic... means we need to 
replace all old
+            // references with the new one in that case otherwise we just get 
an exception
         }
 
         types.put(typeName, type);
 
-        while (typeDefinitionConsumers.getOrDefault(typeName, new 
LinkedList<>()).size() != 0) {
+        while (!typeDefinitionConsumers.getOrDefault(typeName, new 
LinkedList<>()).isEmpty()) {
 
             consumerDispatchType(typeName, type);
         }
@@ -976,11 +1037,11 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     }
 
     private void consumerDispatchType(String typeName, TypeDefinition type) {
-        List<Consumer<TypeDefinition>> waitingConsumers = 
typeDefinitionConsumers.getOrDefault(typeName, new LinkedList<>());
+        var waitingConsumers = typeDefinitionConsumers.getOrDefault(typeName, 
new LinkedList<>());
         LOGGER.debug("{} waiting for {}", waitingConsumers.size(), typeName);
 
-        Iterator<Consumer<TypeDefinition>> consumerIterator = 
waitingConsumers.iterator();
-        List<Consumer<TypeDefinition>> removedItems = new ArrayList<>();
+        var consumerIterator = waitingConsumers.iterator();
+        var removedItems = new ArrayList<Consumer<TypeDefinition>>();
 
         while (consumerIterator.hasNext()) {
             Consumer<TypeDefinition> setter = consumerIterator.next();
@@ -999,14 +1060,15 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     public void setOrScheduleTypeDefinitionConsumer(String typeRefName, 
Consumer<TypeDefinition> setTypeDefinition) {
         LOGGER.debug("set or schedule {}", typeRefName);
 
-        TypeDefinition typeDefinition = types.get(typeRefName);
+        var typeDefinition = types.get(typeRefName);
         if (typeDefinition != null) {
             LOGGER.debug("{} present so setting for {}", typeRefName, 
setTypeDefinition);
             setTypeDefinition.accept(typeDefinition);
         } else {
             // put up order
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug("{} already waiting for {}", 
typeDefinitionConsumers.getOrDefault(typeRefName, new LinkedList<>()).size(), 
typeRefName);
+                LOGGER.debug("{} already waiting for {}",
+                    typeDefinitionConsumers.getOrDefault(typeRefName, new 
LinkedList<>()).size(), typeRefName);
             }
             typeDefinitionConsumers.putIfAbsent(typeRefName, new 
LinkedList<>());
             typeDefinitionConsumers.get(typeRefName).add(setTypeDefinition);
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
index 53cacc19a2..62e6274f19 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
@@ -51,9 +51,12 @@ public class MessageFormatParser {
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
+
+        var tokenStream = new CommonTokenStream(lexer);
+
         MessageFormatListener listener;
         if (existingTypeContext == null) {
-            listener = new MessageFormatListener();
+            listener = new MessageFormatListener(tokenStream);
         } else {
             if (LOGGER.isDebugEnabled()) {
                 Map<String, TypeDefinition> exitingTypeDefinitions = 
existingTypeContext.getTypeDefinitions();
@@ -66,10 +69,13 @@ public class MessageFormatParser {
                 }
             }
 
-            listener = new MessageFormatListener(existingTypeContext);
+            listener = new MessageFormatListener(tokenStream, 
existingTypeContext);
         }
 
-        new ParseTreeWalker().walk(listener, new MSpecParser(new 
CommonTokenStream(lexer)).file());
+        var parser = new MSpecParser(tokenStream);
+
+        ParseTreeWalker parseTreeWalker = new ParseTreeWalker();
+        parseTreeWalker.walk(listener, parser.file());
         LOGGER.info("Checking for open consumers");
         listener.typeDefinitionConsumers.forEach((key, value) -> 
LOGGER.warn("{} has {} open consumers", key, value.size()));
         return new ValidatableTypeContext() {
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/protocol/ValidatableTypeContext.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/protocol/ValidatableTypeContext.java
index 7e55072933..e23448fd45 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/protocol/ValidatableTypeContext.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/protocol/ValidatableTypeContext.java
@@ -30,7 +30,7 @@ public interface ValidatableTypeContext extends TypeContext {
      */
     default void validate() throws GenerationException {
         // TODO: check that we have at least of parsed type
-        if (getUnresolvedTypeReferences().size() > 0) {
+        if (!getUnresolvedTypeReferences().isEmpty()) {
             throw new GenerationException("Unresolved types left: " + 
getUnresolvedTypeReferences());
         }
     }

Reply via email to