From 033870592900e47d9855d190924d0addecddad61 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Fri, 15 Nov 2024 01:20:14 +0100 Subject: [PATCH] Revert "[fixes #3116] Add multi round support for mapstruct": This reverts commit 04c9755b39617a0e222a8e88ef44677b34044ab2. The nature of the fix is to simply scan the TypeMirror for 'lombok shenanigans'; if it finds them, the type is not complete; if there are none, the type is. This fundamentally does not work - lombok shenanigans may remain even if lombok is done (`@lombok.NonNull` for example), and lombok shenanigans don't just appear as annotations on the type; they can appear in many forms: Annotations on local var decls, or even method calls to `Lombok.safeDeNull` or whatnot. safeDenull is made up, but we might add it someday. `@Getter` on a field isn't though, and suffers from the same problem. --- AUTHORS | 1 - .../lombok/mapstruct/NotifierHider.java | 36 ++++++++++--------- .../lombok/launch/AnnotationProcessor.java | 5 +++ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/AUTHORS b/AUTHORS index 67e8006023..a8c9bcc459 100755 --- a/AUTHORS +++ b/AUTHORS @@ -1,7 +1,6 @@ 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 834b5bf2e0..222e9c0baf 100644 --- a/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java +++ b/src/bindings/mapstruct/lombok/mapstruct/NotifierHider.java @@ -1,29 +1,33 @@ package lombok.mapstruct; -import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor; +import java.lang.reflect.Field; -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. - */ +import org.mapstruct.ap.spi.AstModifyingAnnotationProcessor; + class NotifierHider { public static class AstModificationNotifier implements AstModifyingAnnotationProcessor { - @Override - public boolean isTypeComplete(TypeMirror typeMirror) { + private static Field lombokInvoked; + + @Override public boolean isTypeComplete(TypeMirror type) { if (System.getProperty("lombok.disable") != null) 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; + return isLombokInvoked(); + } + + private static boolean isLombokInvoked() { + if (lombokInvoked != null) { + try { + return lombokInvoked.getBoolean(null); + } catch (Exception e) {} + return true; } + 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 28a28d723a..456a8cefca 100644 --- a/src/launch/lombok/launch/AnnotationProcessor.java +++ b/src/launch/lombok/launch/AnnotationProcessor.java @@ -39,6 +39,10 @@ class AnnotationProcessorHider { + public static class AstModificationNotifierData { + public volatile static boolean lombokInvoked = false; + } + public static class AnnotationProcessor extends AbstractProcessor { private final AbstractProcessor instance = createWrappedInstance(); @@ -56,6 +60,7 @@ public static class AnnotationProcessor extends AbstractProcessor { @Override public void init(ProcessingEnvironment processingEnv) { disableJava9SillyWarning(); + AstModificationNotifierData.lombokInvoked = true; instance.init(processingEnv); super.init(processingEnv); }