diff --git a/AUTHORS b/AUTHORS index a8c9bcc4..67e80060 100755 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,7 @@ Lombok contributors in alphabetical order: Adam Juraszek +Aleksandar Kanchev <136312841+kanchev1@users.noreply.github.com> Aleksandr Zhelezniak Amine Touzani Andre Brait diff --git a/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java b/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java index a8e92b4b..834b5bf2 100644 --- a/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java +++ b/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java @@ -1,34 +1,29 @@ package lombok.mapstruct; -import java.lang.reflect.Field; - -import javax.lang.model.type.TypeMirror; - import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.type.TypeMirror; +import java.util.List; + +/** + * 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) { + @Override + public boolean isTypeComplete(TypeMirror typeMirror) { 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) {} - return true; + List annotationMirrors = typeMirror.getAnnotationMirrors(); + if (annotationMirrors == null || annotationMirrors.isEmpty()) return true; + + for (AnnotationMirror annotationMirror : annotationMirrors) { + String annotationName = String.valueOf(annotationMirror); + if (annotationName.startsWith("@lombok.")) return false; } - try { - Class data = Class.forName("lombok.launch.AnnotationProcessorHider$AstModificationNotifierData"); - lombokInvoked = data.getField("lombokInvoked"); - return lombokInvoked.getBoolean(null); - } catch (Exception e) {} return true; } } diff --git a/src/launch/lombok/launch/AnnotationProcessor.java b/src/launch/lombok/launch/AnnotationProcessor.java index 456a8cef..28a28d72 100644 --- a/src/launch/lombok/launch/AnnotationProcessor.java +++ b/src/launch/lombok/launch/AnnotationProcessor.java @@ -39,10 +39,6 @@ import sun.misc.Unsafe; 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 @@ class AnnotationProcessorHider { @Override public void init(ProcessingEnvironment processingEnv) { disableJava9SillyWarning(); - AstModificationNotifierData.lombokInvoked = true; instance.init(processingEnv); super.init(processingEnv); }