Revert "[fixes #3116] Add multi round support for mapstruct":

This reverts commit 04c9755b39.

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.
This commit is contained in:
Reinier Zwitserloot committed 2024-11-15 01:22:59 +01:00
1 parent 3394b6ef7c
commit 0338705929
3 files changed
+26 -18

No files matched your search

-1
View File
@@ -1,7 +1,6 @@
Lombok contributors in alphabetical order:
Adam Juraszek <juriad@gmail.com>
Aleksandar Kanchev <136312841+kanchev1@users.noreply.github.com>
Aleksandr Zhelezniak <lekan1992@gmail.com>
Amine Touzani <ttzn.dev@gmail.com>
Andre Brait <andrebrait@gmail.com>
@@ -1,29 +1,33 @@
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 {
@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<? extends AnnotationMirror> 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;
}
}
@@ -39,6 +39,10 @@ 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();
@@ -56,6 +60,7 @@ class AnnotationProcessorHider {
@Override public void init(ProcessingEnvironment processingEnv) {
disableJava9SillyWarning();
AstModificationNotifierData.lombokInvoked = true;
instance.init(processingEnv);
super.init(processingEnv);
}