From 61ea0ded32e946b7ad4468edd30b794d460f88d6 Mon Sep 17 00:00:00 2001 From: Aleksandar Kanchev <136312841+kanchev1@users.noreply.github.com> Date: Wed, 11 Sep 2024 06:45:09 +0200 Subject: [PATCH] [fixes #3116] Add multi round support for mapstruct --- .../lombok/mapstruct/NotifierHider.java | 44 ++++++++++--------- .../lombok/launch/AnnotationProcessor.java | 5 --- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java b/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java index a8e92b4b9c..bed6c7143a 100644 --- a/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java +++ b/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java @@ -1,35 +1,37 @@ package lombok.mapstruct; -import java.lang.reflect.Field; +import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor; +import javax.lang.model.element.AnnotationMirror; import javax.lang.model.type.TypeMirror; +import java.util.List; -import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor; - +/** + * Report to MapStruct that a type is completed when there aren't any Lombok annotations left on it. Lombok annotations + * are removed whenever a class is processed. This way, annotations which require multiple rounds to process are also + * correctly handled, and MapStruct processing will be delayed until Lombok completely finishes processing required types. + */ class NotifierHider { public static class AstModificationNotifier implements AstModifyingAnnotationProcessor { - private static Field lombokInvoked; - - @Override public boolean isTypeComplete(TypeMirror type) { - if (System.getProperty("lombok.disable") != null) return true; - return isLombokInvoked(); - } - - private static boolean isLombokInvoked() { - if (lombokInvoked != null) { - try { - return lombokInvoked.getBoolean(null); - } catch (Exception e) {} + + @Override + public boolean isTypeComplete(final TypeMirror typeMirror) { + final List annotationMirrors = typeMirror.getAnnotationMirrors(); + if (annotationMirrors == null || annotationMirrors.isEmpty()) { return true; } - - try { - Class data = Class.forName("lombok.launch.AnnotationProcessorHider$AstModificationNotifierData"); - lombokInvoked = data.getField("lombokInvoked"); - return lombokInvoked.getBoolean(null); - } catch (Exception e) {} + + for (final AnnotationMirror annotationMirror : annotationMirrors) { + final String annotationName = String.valueOf(annotationMirror); + // check for ClaimingProcessor's SupportedAnnotationTypes + if (annotationName.startsWith("@lombok.")) { + return false; + } + } + return true; + } } } diff --git a/src/launch/lombok/launch/AnnotationProcessor.java b/src/launch/lombok/launch/AnnotationProcessor.java index 456a8cefca..28a28d723a 100644 --- a/src/launch/lombok/launch/AnnotationProcessor.java +++ b/src/launch/lombok/launch/AnnotationProcessor.java @@ -39,10 +39,6 @@ class AnnotationProcessorHider { - public static class AstModificationNotifierData { - public volatile static boolean lombokInvoked = false; - } - public static class AnnotationProcessor extends AbstractProcessor { private final AbstractProcessor instance = createWrappedInstance(); @@ -60,7 +56,6 @@ public static class AnnotationProcessor extends AbstractProcessor { @Override public void init(ProcessingEnvironment processingEnv) { disableJava9SillyWarning(); - AstModificationNotifierData.lombokInvoked = true; instance.init(processingEnv); super.init(processingEnv); }