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

cdutz 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 71be51b9d7 feat: Added an option to be able to see which attributes 
are actively set on the current level (and hereby which ones are inherited)
71be51b9d7 is described below

commit 71be51b9d7bfb4244cf29253bcfba0a499b00050
Author: Christofer Dutz <[email protected]>
AuthorDate: Mon Sep 22 10:23:14 2025 +0200

    feat: Added an option to be able to see which attributes are actively set 
on the current level (and hereby which ones are inherited)
---
 .../mspec/model/fields/DefaultAbstractField.java   |  5 ++-
 .../mspec/model/fields/DefaultArrayField.java      |  5 ++-
 .../mspec/model/fields/DefaultAssertField.java     |  5 ++-
 .../mspec/model/fields/DefaultChecksumField.java   |  5 ++-
 .../mspec/model/fields/DefaultConstField.java      |  5 ++-
 .../model/fields/DefaultDiscriminatorField.java    |  5 ++-
 .../mspec/model/fields/DefaultEnumField.java       |  5 ++-
 .../language/mspec/model/fields/DefaultField.java  | 18 +++++++-
 .../mspec/model/fields/DefaultImplicitField.java   |  5 ++-
 .../model/fields/DefaultManualArrayField.java      |  5 ++-
 .../mspec/model/fields/DefaultManualField.java     |  5 ++-
 .../mspec/model/fields/DefaultOptionalField.java   |  5 ++-
 .../mspec/model/fields/DefaultPaddingField.java    |  5 ++-
 .../mspec/model/fields/DefaultPeekField.java       |  5 ++-
 .../mspec/model/fields/DefaultReservedField.java   |  5 ++-
 .../mspec/model/fields/DefaultSimpleField.java     |  5 ++-
 .../mspec/model/fields/DefaultStateField.java      |  5 ++-
 .../mspec/model/fields/DefaultSwitchField.java     |  4 +-
 .../mspec/model/fields/DefaultTypedField.java      |  5 ++-
 .../mspec/model/fields/DefaultTypedNamedField.java |  5 ++-
 .../mspec/model/fields/DefaultUnknownField.java    |  5 ++-
 .../mspec/model/fields/DefaultValidationField.java |  5 ++-
 .../mspec/model/fields/DefaultVirtualField.java    |  5 ++-
 .../mspec/parser/MessageFormatListener.java        | 50 +++++++++++++---------
 24 files changed, 112 insertions(+), 65 deletions(-)

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 a627d5a3ee..5e0af86827 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
@@ -22,11 +22,12 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.AbstractField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
+import java.util.Set;
 
 public class DefaultAbstractField extends DefaultTypedNamedField implements 
AbstractField {
 
-    public DefaultAbstractField(Map<String, Term> attributes, String name, 
String comment) {
-        super(attributes, name, comment);
+    public DefaultAbstractField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, String comment) {
+        super(attributes, currentAttributeNames, 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 4f8934317c..9f3dcc174f 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
@@ -25,14 +25,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultArrayField extends DefaultTypedNamedField implements 
ArrayField {
 
     private final LoopType loopType;
     private final Term loopExpression;
 
-    public DefaultArrayField(Map<String, Term> attributes, String name, 
LoopType loopType, Term loopExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultArrayField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, LoopType loopType, Term loopExpression, 
String comment) {
+        super(attributes, currentAttributeNames, name, comment);
         this.loopType = Objects.requireNonNull(loopType);
         this.loopExpression = Objects.requireNonNull(loopExpression);
     }
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 5758f2bdc0..62c8a42741 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
@@ -23,13 +23,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultAssertField extends DefaultTypedNamedField implements 
AssertField {
 
     private final Term conditionExpression;
 
-    public DefaultAssertField(Map<String, Term> attributes, String name, Term 
conditionExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultAssertField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term conditionExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 e923d53ac1..54afe1b726 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultChecksumField extends DefaultTypedNamedField implements 
ChecksumField {
 
     private final Term checksumExpression;
 
-    public DefaultChecksumField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term checksumExpression, String comment) 
{
-        super(attributes, name, comment);
+    public DefaultChecksumField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, SimpleTypeReference type, String name, Term 
checksumExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 44f3c364f3..3532c8f27a 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultConstField extends DefaultTypedNamedField implements 
ConstField {
 
     private final Literal referenceValue;
 
-    public DefaultConstField(Map<String, Term> attributes, String name, 
Literal referenceValue, String comment) {
-        super(attributes, name, comment);
+    public DefaultConstField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Literal referenceValue, String comment) {
+        super(attributes, currentAttributeNames, 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 51756e88be..baba58a1eb 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
@@ -22,11 +22,12 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
+import java.util.Set;
 
 public class DefaultDiscriminatorField extends DefaultTypedNamedField 
implements DiscriminatorField {
 
-    public DefaultDiscriminatorField(Map<String, Term> attributes, String 
name, String comment) {
-        super(attributes, name, comment);
+    public DefaultDiscriminatorField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, String comment) {
+        super(attributes, currentAttributeNames, 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 7aaefbba30..6000f13e80 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultEnumField extends DefaultTypedNamedField implements 
EnumField {
 
     private final String fieldName;
 
-    public DefaultEnumField(Map<String, Term> attributes, EnumTypeReference 
type, String name, String fieldName, String comment) {
-        super(attributes, name, comment);
+    public DefaultEnumField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, EnumTypeReference type, String name, String fieldName, 
String comment) {
+        super(attributes, currentAttributeNames, 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 9c08d08007..bbb13d35d4 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
@@ -24,16 +24,24 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 
 public abstract class DefaultField {
 
     protected final Map<String, Term> attributes;
+    protected final Set<String> currentAttributeNames;
     protected final String comment;
     protected TypeDefinition owner;
 
-    protected DefaultField(Map<String, Term> attributes, String comment) {
+    protected DefaultField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String comment) {
         this.attributes = Objects.requireNonNull(attributes);
+        currentAttributeNames.forEach(attributeName -> {
+            if (!attributes.containsKey(attributeName)) {
+                throw new IllegalArgumentException("Attribute '" + 
attributeName + "' is not defined for field " + this);
+            }
+        });
+        this.currentAttributeNames = 
Objects.requireNonNull(currentAttributeNames);
         this.comment = comment;
     }
 
@@ -49,6 +57,14 @@ public abstract class DefaultField {
         this.owner = owner;
     }
 
+    public Set<String> getAllAttributeNames() {
+        return attributes.keySet();
+    }
+
+    public Set<String> getCurrentAttributeNames() {
+        return attributes.keySet();
+    }
+
     public Optional<Term> getAttribute(String attributeName) {
         if (attributes.containsKey(attributeName)) {
             return Optional.of(attributes.get(attributeName));
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 ef88fcb863..d0be2408ff 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultImplicitField extends DefaultTypedNamedField implements 
ImplicitField {
 
     private final Term serializeExpression;
 
-    public DefaultImplicitField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term serializeExpression, String 
comment) {
-        super(attributes, name, comment);
+    public DefaultImplicitField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, SimpleTypeReference type, String name, Term 
serializeExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 a715e5926f..9220c3f4c0 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
@@ -25,6 +25,7 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultManualArrayField extends DefaultTypedNamedField implements 
ManualArrayField {
 
@@ -34,8 +35,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, String comment) {
-        super(attributes, name, comment);
+    public DefaultManualArrayField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, LoopType loopType, Term loopExpression, 
Term parseExpression, Term serializeExpression, Term lengthExpression, String 
comment) {
+        super(attributes, currentAttributeNames, name, comment);
         this.loopType = Objects.requireNonNull(loopType);
         this.loopExpression = Objects.requireNonNull(loopExpression);
         this.parseExpression = Objects.requireNonNull(parseExpression);
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 dfb7e8c01c..a7c23ef430 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
@@ -23,6 +23,7 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultManualField extends DefaultTypedNamedField implements 
ManualField {
 
@@ -30,8 +31,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, String 
comment) {
-        super(attributes, name, comment);
+    public DefaultManualField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term parseExpression, Term 
serializeExpression, Term lengthExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 30fc871f9d..22b563c7af 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 public class DefaultOptionalField extends DefaultTypedNamedField implements 
OptionalField {
 
     private final Term conditionExpression;
 
-    public DefaultOptionalField(Map<String, Term> attributes, String name, 
Term conditionExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultOptionalField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term conditionExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 22b849ce6a..98d373ac47 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
@@ -24,14 +24,15 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultPaddingField extends DefaultTypedNamedField implements 
PaddingField {
 
     private final Term paddingValue;
     private final Term paddingCondition;
 
-    public DefaultPaddingField(Map<String, Term> attributes, 
SimpleTypeReference type, String name, Term paddingValue, Term 
paddingCondition, String comment) {
-        super(attributes, name, comment);
+    public DefaultPaddingField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, SimpleTypeReference type, String name, Term 
paddingValue, Term paddingCondition, String comment) {
+        super(attributes, currentAttributeNames, 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 a1b97f4cc5..7eb41d251a 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 public class DefaultPeekField extends DefaultTypedNamedField implements 
PeekField {
 
     private final Term offsetExpression;
 
-    public DefaultPeekField(Map<String, Term> attributes, String name, Term 
offsetExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultPeekField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term offsetExpression, String comment) {
+        super(attributes, currentAttributeNames, name, comment);
         this.offsetExpression = 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 b7637dcfe6..f3035f37f3 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultReservedField extends DefaultTypedField implements 
ReservedField {
 
     private final Object referenceValue;
 
-    public DefaultReservedField(Map<String, Term> attributes, 
SimpleTypeReference type, Object referenceValue, String comment) {
-        super(attributes, comment);
+    public DefaultReservedField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, SimpleTypeReference type, Object referenceValue, String 
comment) {
+        super(attributes, currentAttributeNames, 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 9a6183a415..adfaeb2dc0 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
@@ -22,11 +22,12 @@ import 
org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
+import java.util.Set;
 
 public class DefaultSimpleField extends DefaultTypedNamedField implements 
SimpleField {
 
-    public DefaultSimpleField(Map<String, Term> attributes, String name, 
String comment) {
-        super(attributes, name, comment);
+    public DefaultSimpleField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, String comment) {
+        super(attributes, currentAttributeNames, 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 9fe013c9be..bb7c09e582 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
@@ -23,13 +23,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultStateField extends DefaultTypedNamedField implements 
StateField {
 
     private final Term valueExpression;
 
-    public DefaultStateField(Map<String, Term> attributes, String name, Term 
valueExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultStateField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term valueExpression, String comment) {
+        super(attributes, currentAttributeNames, 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 7e44127948..d8064b2ebc 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, String comment) {
-        super(attributes, comment);
+    public DefaultSwitchField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, List<VariableLiteral> variableLiterals, String comment) {
+        super(attributes, currentAttributeNames, 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 5f9d4ca4e0..d7ade3618c 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
@@ -23,6 +23,7 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
 
@@ -31,8 +32,8 @@ public abstract class DefaultTypedField extends DefaultField {
     protected final CompletableFuture<TypeReference> 
typeReferenceCompletionStage = new CompletableFuture<>();
     protected TypeReference type;
 
-    public DefaultTypedField(Map<String, Term> attributes, String comment) {
-        super(attributes, comment);
+    public DefaultTypedField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String comment) {
+        super(attributes, currentAttributeNames, 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 27e541f124..d688867ebd 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
@@ -22,13 +22,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultTypedNamedField extends DefaultTypedField {
 
     protected final String name;
 
-    public DefaultTypedNamedField(Map<String, Term> attributes, String name, 
String comment) {
-        super(attributes, comment);
+    public DefaultTypedNamedField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, String comment) {
+        super(attributes, currentAttributeNames, 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 695dbecb5d..bbcc598e7e 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
@@ -23,11 +23,12 @@ import 
org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReferen
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
+import java.util.Set;
 
 public class DefaultUnknownField extends DefaultTypedField implements 
UnknownField {
 
-    public DefaultUnknownField(Map<String, Term> attributes, 
SimpleTypeReference type, String comment) {
-        super(attributes, comment);
+    public DefaultUnknownField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, SimpleTypeReference type, String comment) {
+        super(attributes, currentAttributeNames, 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 17f049819a..4885f3280c 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
@@ -24,6 +24,7 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 public class DefaultValidationField extends DefaultField implements 
ValidationField {
 
@@ -31,8 +32,8 @@ public class DefaultValidationField extends DefaultField 
implements ValidationFi
     private final String description;
     private final boolean shouldFail;
 
-    public DefaultValidationField(Map<String, Term> attributes, Term 
validationExpression, String description, boolean shouldFail, String comment) {
-        super(attributes, comment);
+    public DefaultValidationField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, Term validationExpression, String description, boolean 
shouldFail, String comment) {
+        super(attributes, currentAttributeNames, 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 ca5d7a84e4..e8eba71ade 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
@@ -24,13 +24,14 @@ import 
org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class DefaultVirtualField extends DefaultTypedNamedField implements 
VirtualField {
 
     private final Term valueExpression;
 
-    public DefaultVirtualField(Map<String, Term> attributes, String name, Term 
valueExpression, String comment) {
-        super(attributes, name, comment);
+    public DefaultVirtualField(Map<String, Term> attributes, Set<String> 
currentAttributeNames, String name, Term valueExpression, String comment) {
+        super(attributes, currentAttributeNames, 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/parser/MessageFormatListener.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 38ca85049f..1adb680c55 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
@@ -308,7 +308,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterAbstractField(MSpecParser.AbstractFieldContext ctx) {
         var name = getIdString(ctx.name);
-        var field = new DefaultAbstractField(getAttributes(ctx), name, 
consumePendingComment(ctx));
+        var field = new DefaultAbstractField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -327,7 +327,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         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));
+        var field = new DefaultArrayField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, loopType, loopExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -345,7 +345,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     public void enterAssertField(MSpecParser.AssertFieldContext ctx) {
         var name = getIdString(ctx.name);
         var conditionExpression = getExpressionTerm(ctx.condition);
-        var field = new DefaultAssertField(getAttributes(ctx), name, 
conditionExpression, consumePendingComment(ctx));
+        var field = new DefaultAssertField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, conditionExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -364,7 +364,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         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));
+        var field = new DefaultChecksumField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, name, checksumExpression, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -373,7 +373,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterConstField(MSpecParser.ConstFieldContext ctx) {
         var name = getIdString(ctx.name);
-        var field = new DefaultConstField(getAttributes(ctx), name, 
getValueLiteral(ctx.expected), consumePendingComment(ctx));
+        var field = new DefaultConstField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, getValueLiteral(ctx.expected), 
consumePendingComment(ctx));
         if (ctx.type.dataType() != null) {
             field.setType(getSimpleTypeReference(ctx.type.dataType()));
         } else {
@@ -394,7 +394,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterDiscriminatorField(MSpecParser.DiscriminatorFieldContext 
ctx) {
         var name = getIdString(ctx.name);
-        var field = new DefaultDiscriminatorField(getAttributes(ctx), name, 
consumePendingComment(ctx));
+        var field = new DefaultDiscriminatorField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -418,7 +418,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.fieldName != null) {
             fieldName = getIdString(ctx.fieldName);
         }
-        var field = new DefaultEnumField(getAttributes(ctx), type, name, 
fieldName, consumePendingComment(ctx));
+        var field = new DefaultEnumField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, name, fieldName, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -429,7 +429,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         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));
+        var field = new DefaultImplicitField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, name, serializeExpression, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -444,7 +444,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         Term parseExpression = getExpressionTerm(ctx.parseExpression);
         Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
         Term lengthExpression = getExpressionTerm(ctx.lengthExpression);
-        DefaultManualArrayField field = new 
DefaultManualArrayField(getAttributes(ctx), name, loopType, loopExpression,
+        DefaultManualArrayField field = new 
DefaultManualArrayField(getAttributes(ctx), getCurFieldAttributeNames(ctx), 
name, loopType, loopExpression,
             parseExpression, serializeExpression, lengthExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
@@ -465,7 +465,7 @@ 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,
+        DefaultManualField field = new DefaultManualField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, parseExpression,
             serializeExpression,
             lengthExpression, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
@@ -488,7 +488,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.condition != null) {
             conditionExpression = getExpressionTerm(ctx.condition);
         }
-        var field = new DefaultOptionalField(getAttributes(ctx), name, 
conditionExpression, consumePendingComment(ctx));
+        var field = new DefaultOptionalField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, conditionExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -508,7 +508,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         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));
+        var field = new DefaultPaddingField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, name, paddingValue, timesPadding, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -521,7 +521,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.offset != null) {
             offsetExpression = getExpressionTerm(ctx.offset);
         }
-        var field = new DefaultPeekField(getAttributes(ctx), name, 
offsetExpression, consumePendingComment(ctx));
+        var field = new DefaultPeekField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, offsetExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -539,7 +539,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     public void enterReservedField(MSpecParser.ReservedFieldContext ctx) {
         var type = getSimpleTypeReference(ctx.type);
         var expected = getExprString(ctx.expected);
-        var field = new DefaultReservedField(getAttributes(ctx), type, 
expected, consumePendingComment(ctx));
+        var field = new DefaultReservedField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, expected, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -548,7 +548,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterSimpleField(MSpecParser.SimpleFieldContext ctx) {
         var name = getIdString(ctx.name);
-        var field = new DefaultSimpleField(getAttributes(ctx), name, 
consumePendingComment(ctx));
+        var field = new DefaultSimpleField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -592,7 +592,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
             () -> 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.
         var valueExpression = new DefaultVariableLiteral(name, null, null, 
null);
-        var field = new DefaultStateField(getAttributes(ctx), name, 
valueExpression, consumePendingComment(ctx));
+        var field = new DefaultStateField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, valueExpression, 
consumePendingComment(ctx));
         getTypeReference(type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -611,7 +611,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         var variableLiterals = ctx.discriminators.variableLiteral().stream()
             .map(this::getVariableLiteral)
             .collect(Collectors.toList());
-        var field = new DefaultSwitchField(getAttributes(ctx), 
variableLiterals, consumePendingComment(ctx));
+        var field = new DefaultSwitchField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), variableLiterals, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -620,7 +620,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     @Override
     public void enterUnknownField(MSpecParser.UnknownFieldContext ctx) {
         var type = getSimpleTypeReference(ctx.type);
-        var field = new DefaultUnknownField(getAttributes(ctx), type, 
consumePendingComment(ctx));
+        var field = new DefaultUnknownField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), type, consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -637,7 +637,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         if (ctx.description != null) {
             description = ctx.description.getText();
         }
-        var field = new DefaultValidationField(getAttributes(ctx), 
validationExpression, description, shouldFail, consumePendingComment(ctx));
+        var field = new DefaultValidationField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), validationExpression, description, shouldFail, 
consumePendingComment(ctx));
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -647,7 +647,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
     public void enterVirtualField(MSpecParser.VirtualFieldContext ctx) {
         var name = getIdString(ctx.name);
         var valueExpression = getExpressionTerm(ctx.valueExpression);
-        var field = new DefaultVirtualField(getAttributes(ctx), name, 
valueExpression, consumePendingComment(ctx));
+        var field = new DefaultVirtualField(getAttributes(ctx), 
getCurFieldAttributeNames(ctx), name, valueExpression, 
consumePendingComment(ctx));
         getTypeReference(ctx.type).whenComplete((typeReference, throwable) -> {
             if (throwable != null) {
                 // TODO: proper error collection in type context error bucket
@@ -1005,6 +1005,16 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         return attributes;
     }
 
+    private Set<String> getCurFieldAttributeNames(RuleContext ctx) {
+        Set<String> attributeNames = new HashSet<>();
+        if (ctx.parent.parent instanceof MSpecParser.FieldDefinitionContext 
fieldDefinitionContext) {
+            for (MSpecParser.AttributeContext attributeContext : 
fieldDefinitionContext.attributes.attribute()) {
+                attributeNames.add(attributeContext.name.getText());
+            }
+        }
+        return attributeNames;
+    }
+
     private String unquoteString(String quotedString) {
         if (quotedString == null || quotedString.length() < 2) {
             return quotedString;

Reply via email to