From ca99bdfbede1586970a6253a1fbd3adb04be5a76 Mon Sep 17 00:00:00 2001 From: mszabo-wikia <2721291+mszabo-wikia@users.noreply.github.com> Date: Wed, 6 Jun 2018 14:59:18 +0200 Subject: Fix #1716: Update for Gradle incremental compilation API change in Gradle 4.8 and above --- src/core/lombok/javac/apt/LombokProcessor.java | 35 ++++++++++++++++++-------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java index fc457735..6f82f261 100644 --- a/src/core/lombok/javac/apt/LombokProcessor.java +++ b/src/core/lombok/javac/apt/LombokProcessor.java @@ -70,6 +70,9 @@ import com.sun.tools.javac.util.Context; */ @SupportedAnnotationTypes("*") public class LombokProcessor extends AbstractProcessor { + private static final String GRADLE_INCREMENTAL_FILER_CLASS = + "org.gradle.api.internal.tasks.compile.processing.IncrementalFiler"; + private ProcessingEnvironment processingEnv; private JavacProcessingEnvironment javacProcessingEnv; private JavacFiler javacFiler; @@ -431,20 +434,30 @@ public class LombokProcessor extends AbstractProcessor { * gradle incremental compilation, the delegate Filer of the gradle wrapper is returned. */ public JavacFiler getJavacFiler(Filer filer) { - final Class filerSuperClass = filer.getClass().getSuperclass(); - if (filerSuperClass.getName().equals("org.gradle.api.internal.tasks.compile.processing.IncrementalFiler")) { - try { - Field field = filerSuperClass.getDeclaredField("delegate"); - field.setAccessible(true); - Object delegate = field.get(filer); - return (JavacFiler) delegate; - } catch (final Exception e) { - e.printStackTrace(); - processingEnv.getMessager().printMessage(Kind.WARNING, - "Can't get the delegate of the gradle IncrementalFiler. Lombok won't work."); + try { + final Class filerClass = filer.getClass(); + final Class filerSuperClass = filerClass.getSuperclass(); + + if (filerSuperClass.getName().equals(GRADLE_INCREMENTAL_FILER_CLASS)) { + // Gradle before 4.8 + return tryGetJavacFilerDelegate(filerSuperClass, filer); + } else if (filer.getClass().getName().equals(GRADLE_INCREMENTAL_FILER_CLASS)) { + // Gradle 4.8 and above + return tryGetJavacFilerDelegate(filerClass, filer); } + } catch (final Exception e) { + e.printStackTrace(); + processingEnv.getMessager().printMessage(Kind.WARNING, + "Can't get the delegate of the gradle IncrementalFiler. Lombok won't work."); } + return (JavacFiler) filer; } + private JavacFiler tryGetJavacFilerDelegate(Class filerDelegateClass, Object instance) throws Exception { + Field field = filerDelegateClass.getDeclaredField("delegate"); + field.setAccessible(true); + Object delegate = field.get(instance); + return (JavacFiler) delegate; + } } -- cgit From 4256d7daeda177ed3e361eb972fce62d9e1050c5 Mon Sep 17 00:00:00 2001 From: mszabo-wikia <2721291+mszabo-wikia@users.noreply.github.com> Date: Thu, 7 Jun 2018 12:06:38 +0200 Subject: Generify logic to obtain JavacFiler and JavacProcessingEnvironment --- src/core/lombok/javac/apt/LombokProcessor.java | 68 ++++++++++++-------------- 1 file changed, 32 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java index 6f82f261..124d5b6c 100644 --- a/src/core/lombok/javac/apt/LombokProcessor.java +++ b/src/core/lombok/javac/apt/LombokProcessor.java @@ -37,7 +37,6 @@ import java.util.Set; import java.util.SortedSet; import javax.annotation.processing.AbstractProcessor; -import javax.annotation.processing.Filer; import javax.annotation.processing.Messager; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.RoundEnvironment; @@ -70,8 +69,6 @@ import com.sun.tools.javac.util.Context; */ @SupportedAnnotationTypes("*") public class LombokProcessor extends AbstractProcessor { - private static final String GRADLE_INCREMENTAL_FILER_CLASS = - "org.gradle.api.internal.tasks.compile.processing.IncrementalFiler"; private ProcessingEnvironment processingEnv; private JavacProcessingEnvironment javacProcessingEnv; @@ -412,52 +409,51 @@ public class LombokProcessor extends AbstractProcessor { * This class casts the given processing environment to a JavacProcessingEnvironment. In case of * gradle incremental compilation, the delegate ProcessingEnvironment of the gradle wrapper is returned. */ - public JavacProcessingEnvironment getJavacProcessingEnvironment(ProcessingEnvironment procEnv) { - final Class procEnvClass = procEnv.getClass(); - if (procEnv.getClass().getName().equals("org.gradle.api.internal.tasks.compile.processing.IncrementalProcessingEnvironment")) { + public JavacProcessingEnvironment getJavacProcessingEnvironment(Object procEnv) { + if (procEnv instanceof JavacProcessingEnvironment) { + return (JavacProcessingEnvironment) procEnv; + } + + // try to find a "delegate" field in the object, and use this to try to obtain a JavacProcessingEnvironment + for (Class procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) { try { - Field field = procEnvClass.getDeclaredField("delegate"); - field.setAccessible(true); - Object delegate = field.get(procEnv); - return (JavacProcessingEnvironment) delegate; + return getJavacProcessingEnvironment(tryGetDelegateField(procEnvClass, procEnv)); } catch (final Exception e) { - e.printStackTrace(); - procEnv.getMessager().printMessage(Kind.WARNING, - "Can't get the delegate of the gradle IncrementalProcessingEnvironment. Lombok won't work."); + // delegate field was not found, try on superclass } } - return (JavacProcessingEnvironment) procEnv; + + processingEnv.getMessager().printMessage(Kind.WARNING, + "Can't get the delegate of the gradle IncrementalProcessingEnvironment. Lombok won't work."); + return null; } /** - * This class casts the given filer to a JavacFiler. In case of - * gradle incremental compilation, the delegate Filer of the gradle wrapper is returned. + * This class returns the given filer as a JavacFiler. In case the case that the filer is no + * JavacFiler (e.g. the Gradle IncrementalFiler), its "delegate" field is used to get the JavacFiler + * (directly or through a delegate field again) */ - public JavacFiler getJavacFiler(Filer filer) { - try { - final Class filerClass = filer.getClass(); - final Class filerSuperClass = filerClass.getSuperclass(); + public JavacFiler getJavacFiler(Object filer) { + if (filer instanceof JavacFiler) { + return (JavacFiler) filer; + } - if (filerSuperClass.getName().equals(GRADLE_INCREMENTAL_FILER_CLASS)) { - // Gradle before 4.8 - return tryGetJavacFilerDelegate(filerSuperClass, filer); - } else if (filer.getClass().getName().equals(GRADLE_INCREMENTAL_FILER_CLASS)) { - // Gradle 4.8 and above - return tryGetJavacFilerDelegate(filerClass, filer); + // try to find a "delegate" field in the object, and use this to check for a JavacFiler + for (Class filerClass = filer.getClass(); filerClass != null; filerClass = filerClass.getSuperclass()) { + try { + return getJavacFiler(tryGetDelegateField(filerClass, filer)); + } catch (final Exception e) { + // delegate field was not found, try on superclass } - } catch (final Exception e) { - e.printStackTrace(); - processingEnv.getMessager().printMessage(Kind.WARNING, - "Can't get the delegate of the gradle IncrementalFiler. Lombok won't work."); } - return (JavacFiler) filer; + processingEnv.getMessager().printMessage(Kind.WARNING, + "Can't get a JavacFiler from " + filer.getClass().getName() + ". Lombok won't work."); + return null; } - - private JavacFiler tryGetJavacFilerDelegate(Class filerDelegateClass, Object instance) throws Exception { - Field field = filerDelegateClass.getDeclaredField("delegate"); + private Object tryGetDelegateField(Class delegateClass, Object instance) throws Exception { + Field field = delegateClass.getDeclaredField("delegate"); field.setAccessible(true); - Object delegate = field.get(instance); - return (JavacFiler) delegate; + return field.get(instance); } } -- cgit From 6311a7efe394bf19cd2a874d29d7d97b26a25a8d Mon Sep 17 00:00:00 2001 From: mszabo-wikia <2721291+mszabo-wikia@users.noreply.github.com> Date: Thu, 7 Jun 2018 17:45:43 +0200 Subject: Also generify AnnotationProcessor logic --- src/core/lombok/core/AnnotationProcessor.java | 28 ++++++++++++++++++++------ src/core/lombok/javac/apt/LombokProcessor.java | 1 + 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/core/lombok/core/AnnotationProcessor.java b/src/core/lombok/core/AnnotationProcessor.java index d05597b6..04448ecb 100644 --- a/src/core/lombok/core/AnnotationProcessor.java +++ b/src/core/lombok/core/AnnotationProcessor.java @@ -49,6 +49,7 @@ import lombok.patcher.ClassRootFinder; @SupportedAnnotationTypes("*") public class AnnotationProcessor extends AbstractProcessor { + private static String trace(Throwable t) { StringWriter w = new StringWriter(); t.printStackTrace(new PrintWriter(w, true)); @@ -71,18 +72,33 @@ public class AnnotationProcessor extends AbstractProcessor { * the delegate ProcessingEnvironment of the gradle wrapper is returned. */ public static ProcessingEnvironment getJavacProcessingEnvironment(ProcessingEnvironment procEnv, List delayedWarnings) { - final Class procEnvClass = procEnv.getClass(); - if (procEnvClass.getName().equals("org.gradle.api.internal.tasks.compile.processing.IncrementalProcessingEnvironment")) { + ProcessingEnvironment javacProcEnv = tryRecursivelyObtainJavacProcessingEnvironment(procEnv); + + if (javacProcEnv == null) { + delayedWarnings.add("Can't get the delegate of the gradle IncrementalProcessingEnvironment."); + } + + return javacProcEnv; + } + + private static ProcessingEnvironment tryRecursivelyObtainJavacProcessingEnvironment(ProcessingEnvironment procEnv) { + if (procEnv.getClass().getName().equals("com.sun.tools.javac.processing.JavacProcessingEnvironment")) { + return procEnv; + } + + for (Class procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) { try { Field field = procEnvClass.getDeclaredField("delegate"); field.setAccessible(true); Object delegate = field.get(procEnv); - return (ProcessingEnvironment) delegate; + + return tryRecursivelyObtainJavacProcessingEnvironment((ProcessingEnvironment) delegate); } catch (final Exception e) { - delayedWarnings.add("Can't get the delegate of the gradle IncrementalProcessingEnvironment: " + trace(e)); + // no valid delegate, try superclass } } - return procEnv; + + return null; } @@ -96,7 +112,7 @@ public class AnnotationProcessor extends AbstractProcessor { @Override boolean want(ProcessingEnvironment procEnv, List delayedWarnings) { ProcessingEnvironment javacProcEnv = getJavacProcessingEnvironment(procEnv, delayedWarnings); - if (!javacProcEnv.getClass().getName().equals("com.sun.tools.javac.processing.JavacProcessingEnvironment")) return false; + if (javacProcEnv == null) return false; try { ClassLoader classLoader = findAndPatchClassLoader(javacProcEnv); diff --git a/src/core/lombok/javac/apt/LombokProcessor.java b/src/core/lombok/javac/apt/LombokProcessor.java index 124d5b6c..04b494bf 100644 --- a/src/core/lombok/javac/apt/LombokProcessor.java +++ b/src/core/lombok/javac/apt/LombokProcessor.java @@ -451,6 +451,7 @@ public class LombokProcessor extends AbstractProcessor { "Can't get a JavacFiler from " + filer.getClass().getName() + ". Lombok won't work."); return null; } + private Object tryGetDelegateField(Class delegateClass, Object instance) throws Exception { Field field = delegateClass.getDeclaredField("delegate"); field.setAccessible(true); -- cgit