From 7357198d457ea06894d10cc2f9eb067ff90dd28e Mon Sep 17 00:00:00 2001 From: kske Date: Sun, 14 Mar 2021 14:38:43 +0100 Subject: [PATCH] Warn about useless handler property redefinitions When polymorphism or a priority is defined at listener-level and then identically defined for a specific handler, a warning is issued. This does not affect redefinitions of default values. --- .../kske/eventbus/proc/EventProcessor.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/event-bus-proc/src/main/java/dev/kske/eventbus/proc/EventProcessor.java b/event-bus-proc/src/main/java/dev/kske/eventbus/proc/EventProcessor.java index fed6f1c..fd0567b 100644 --- a/event-bus-proc/src/main/java/dev/kske/eventbus/proc/EventProcessor.java +++ b/event-bus-proc/src/main/java/dev/kske/eventbus/proc/EventProcessor.java @@ -65,7 +65,7 @@ public class EventProcessor extends AbstractProcessor { // Warn the user about unused return values if (useParameter && eventHandler.getReturnType().getKind() != TypeKind.VOID) - warning(eventHandler, "Unused return value"); + warning(eventHandler, "Unused return value"); // Abort checking if the handler signature is incorrect if (!pass) @@ -84,9 +84,45 @@ public class EventProcessor extends AbstractProcessor { } } + // Get the listener containing this handler + TypeElement listener = (TypeElement) eventHandler.getEnclosingElement(); + + // Default properties + boolean defPolymorphic = false; + int defPriority = 100; + + // Listener-level polymorphism + Polymorphic listenerPolymorphic = listener.getAnnotation(Polymorphic.class); + boolean hasListenerPolymorphic = listenerPolymorphic != null; + + // Listener-level priority + Priority listenerPriority = listener.getAnnotation(Priority.class); + boolean hasListenerPriority = listenerPriority != null; + + // Effective polymorphism + boolean polymorphic = + hasListenerPolymorphic ? listenerPolymorphic.value() : defPolymorphic; + boolean hasHandlerPolymorphic = eventHandler.getAnnotation(Polymorphic.class) != null; + if (hasHandlerPolymorphic) + polymorphic = eventHandler.getAnnotation(Polymorphic.class).value(); + + // Effective priority + int priority = hasListenerPriority ? listenerPriority.value() : defPriority; + boolean hasHandlerPriority = eventHandler.getAnnotation(Priority.class) != null; + if (hasHandlerPriority) + priority = eventHandler.getAnnotation(Priority.class).value(); + + // Detect useless polymorphism redefinition + if (hasListenerPolymorphic && hasHandlerPolymorphic + && listenerPolymorphic.value() == polymorphic) + warning(eventHandler, "@Polymorphism is already defined at listener level"); + + // Detect useless priority redefinition + if (hasListenerPriority && hasHandlerPriority && listenerPriority.value() == priority) + warning(eventHandler, "@Priority is already defined at the listener level"); + // Detect missing or useless @Polymorphic - boolean polymorphic = eventHandler.getAnnotation(Polymorphic.class) != null; - Element eventElement = ((DeclaredType) eventType).asElement(); + Element eventElement = ((DeclaredType) eventType).asElement(); // Check for handlers for abstract types that aren't polymorphic if (!polymorphic && (eventElement.getKind() == ElementKind.INTERFACE