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

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new e3bc6017cb4 IGNITE-28626 MessageProcessor must fail build for unknown 
messages without ordered fields (#13090)
e3bc6017cb4 is described below

commit e3bc6017cb4ddcf7d592c678b5619957126e1344
Author: Nikolay <[email protected]>
AuthorDate: Thu Apr 30 12:01:26 2026 +0300

    IGNITE-28626 MessageProcessor must fail build for unknown messages without 
ordered fields (#13090)
---
 .../apache/ignite/internal/MessageProcessor.java   | 45 ++++++++++++++++++----
 1 file changed, 37 insertions(+), 8 deletions(-)

diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
index cf62696f3a7..6659d3e2195 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
@@ -82,6 +82,13 @@ public class MessageProcessor extends AbstractProcessor {
         
"org.apache.ignite.internal.processors.query.h2.twostep.msg.GridH2Null",
     };
 
+    /** Messages with no fields. A serializer generation intentionally 
skipped. */
+    static final String[] SKIP_MESSAGES = {
+        "org.apache.ignite.internal.processors.odbc.ClientMessage",
+        "org.apache.ignite.internal.managers.communication.CompressedMessage",
+        "org.apache.ignite.loadtests.communication.GridTestMessage"
+    };
+
     /** */
     private final Map<String, IgniteBiTuple<String, String>> enumMappersInUse 
= new HashMap<>();
 
@@ -90,11 +97,9 @@ public class MessageProcessor extends AbstractProcessor {
      */
     @Override public boolean process(Set<? extends TypeElement> annotations, 
RoundEnvironment roundEnv) {
         TypeMirror msgType = 
processingEnv.getElementUtils().getTypeElement(MESSAGE_INTERFACE).asType();
-        List<TypeMirror> emptyMsgs = Arrays.stream(EMPTY_MESSAGES)
-            .map(cls -> processingEnv.getElementUtils().getTypeElement(cls))
-            .filter(Objects::nonNull)
-            .map(Element::asType)
-            .collect(Collectors.toList());
+
+        List<TypeMirror> emptyMsgs = typesToTypeMirrors(EMPTY_MESSAGES);
+        List<TypeMirror> skipMsgs = typesToTypeMirrors(SKIP_MESSAGES);
 
         Map<TypeElement, List<VariableElement>> msgFields = new HashMap<>();
 
@@ -104,7 +109,7 @@ public class MessageProcessor extends AbstractProcessor {
 
             TypeElement clazz = (TypeElement)el;
 
-            if (!processingEnv.getTypeUtils().isAssignable(clazz.asType(), 
msgType))
+            if (!isAssignable(msgType, clazz))
                 continue;
 
             if (clazz.getModifiers().contains(Modifier.ABSTRACT))
@@ -112,8 +117,18 @@ public class MessageProcessor extends AbstractProcessor {
 
             List<VariableElement> fields = orderedFields(clazz);
 
-            if (!fields.isEmpty() || emptyMsgs.stream().anyMatch(t -> 
processingEnv.getTypeUtils().isAssignable(clazz.asType(), t)))
-                msgFields.put(clazz, fields);
+            if (fields.isEmpty() && emptyMsgs.stream().noneMatch(t -> 
isAssignable(t, clazz))) {
+                if (skipMsgs.stream().anyMatch(t -> isAssignable(t, clazz)))
+                    continue;
+
+                processingEnv.getMessager().printMessage(
+                    Diagnostic.Kind.ERROR,
+                    "Message class doesn't have any ordered fields. " +
+                        "Annotate fields with @Order or add to known empty 
classes MessageProcessor#EMPTY_MESSAGES",
+                    clazz);
+            }
+
+            msgFields.put(clazz, fields);
         }
 
         for (Map.Entry<TypeElement, List<VariableElement>> type: 
msgFields.entrySet()) {
@@ -239,4 +254,18 @@ public class MessageProcessor extends AbstractProcessor {
 
         return processingEnv.getTypeUtils().asElement(elType).getKind() == 
ElementKind.ENUM;
     }
+
+    /** Map class names to {@link TypeMirror} objects. */
+    private List<TypeMirror> typesToTypeMirrors(String[] types) {
+        return Arrays.stream(types)
+            .map(cls -> processingEnv.getElementUtils().getTypeElement(cls))
+            .filter(Objects::nonNull)
+            .map(Element::asType)
+            .collect(Collectors.toList());
+    }
+
+    /** */
+    private boolean isAssignable(TypeMirror t, TypeElement clazz) {
+        return processingEnv.getTypeUtils().isAssignable(clazz.asType(), t);
+    }
 }

Reply via email to