Skip to content

Commit 29d3418

Browse files
Rawi01rspilker
authored andcommitted
[fixes #2592] Find ProcessingEnvironment in InteliJ 2020.3 and Kotlin
1 parent 58545ce commit 29d3418

File tree

2 files changed

+98
-22
lines changed

2 files changed

+98
-22
lines changed

src/core/lombok/core/AnnotationProcessor.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
import java.io.File;
2727
import java.io.PrintWriter;
2828
import java.io.StringWriter;
29-
import java.lang.reflect.Field;
29+
import java.lang.reflect.InvocationHandler;
3030
import java.lang.reflect.Method;
31+
import java.lang.reflect.Proxy;
3132
import java.net.URL;
3233
import java.util.ArrayList;
3334
import java.util.Arrays;
@@ -83,15 +84,11 @@ private static ProcessingEnvironment tryRecursivelyObtainJavacProcessingEnvironm
8384

8485
for (Class<?> procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) {
8586
try {
86-
Field field;
87-
try {
88-
field = Permit.getField(procEnvClass, "delegate");
89-
} catch (NoSuchFieldException e) {
90-
field = Permit.getField(procEnvClass, "processingEnv");
91-
}
92-
Object delegate = field.get(procEnv);
93-
94-
return tryRecursivelyObtainJavacProcessingEnvironment((ProcessingEnvironment) delegate);
87+
Object delegate = tryGetDelegateField(procEnvClass, procEnv);
88+
if (delegate == null) delegate = tryGetProcessingEnvField(procEnvClass, procEnv);
89+
if (delegate == null) delegate = tryGetProxyDelegateToField(procEnvClass, procEnv);
90+
91+
if (delegate != null) return tryRecursivelyObtainJavacProcessingEnvironment((ProcessingEnvironment) delegate);
9592
} catch (final Exception e) {
9693
// no valid delegate, try superclass
9794
}
@@ -100,6 +97,40 @@ private static ProcessingEnvironment tryRecursivelyObtainJavacProcessingEnvironm
10097
return null;
10198
}
10299

100+
/**
101+
* Gradle incremental processing
102+
*/
103+
private static Object tryGetDelegateField(Class<?> delegateClass, Object instance) {
104+
try {
105+
return Permit.getField(delegateClass, "delegate").get(instance);
106+
} catch (Exception e) {
107+
return null;
108+
}
109+
}
110+
111+
/**
112+
* Kotlin incremental processing
113+
*/
114+
private static Object tryGetProcessingEnvField(Class<?> delegateClass, Object instance) {
115+
try {
116+
return Permit.getField(delegateClass, "processingEnv").get(instance);
117+
} catch (Exception e) {
118+
return null;
119+
}
120+
}
121+
122+
/**
123+
* InteliJ >= 2020.3
124+
*/
125+
private static Object tryGetProxyDelegateToField(Class<?> delegateClass, Object instance) {
126+
try {
127+
InvocationHandler handler = Proxy.getInvocationHandler(instance);
128+
return Permit.getField(handler.getClass(), "val$delegateTo").get(handler);
129+
} catch (Exception e) {
130+
return null;
131+
}
132+
}
133+
103134
static class JavacDescriptor extends ProcessorDescriptor {
104135
private Processor processor;
105136

src/core/lombok/javac/apt/LombokProcessor.java

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
import java.io.IOException;
2525
import java.io.InputStream;
2626
import java.lang.reflect.Field;
27+
import java.lang.reflect.InvocationHandler;
2728
import java.lang.reflect.InvocationTargetException;
2829
import java.lang.reflect.Method;
30+
import java.lang.reflect.Proxy;
2931
import java.net.URL;
3032
import java.util.ArrayList;
3133
import java.util.Enumeration;
@@ -432,11 +434,12 @@ public JavacProcessingEnvironment getJavacProcessingEnvironment(Object procEnv)
432434

433435
// try to find a "delegate" field in the object, and use this to try to obtain a JavacProcessingEnvironment
434436
for (Class<?> procEnvClass = procEnv.getClass(); procEnvClass != null; procEnvClass = procEnvClass.getSuperclass()) {
435-
try {
436-
return getJavacProcessingEnvironment(tryGetDelegateField(procEnvClass, procEnv));
437-
} catch (final Exception e) {
438-
// delegate field was not found, try on superclass
439-
}
437+
Object delegate = tryGetDelegateField(procEnvClass, procEnv);
438+
if (delegate == null) delegate = tryGetProxyDelegateToField(procEnvClass, procEnv);
439+
if (delegate == null) delegate = tryGetProcessingEnvField(procEnvClass, procEnv);
440+
441+
if (delegate != null) return getJavacProcessingEnvironment(delegate);
442+
// delegate field was not found, try on superclass
440443
}
441444

442445
processingEnv.getMessager().printMessage(Kind.WARNING,
@@ -454,19 +457,61 @@ public JavacFiler getJavacFiler(Object filer) {
454457

455458
// try to find a "delegate" field in the object, and use this to check for a JavacFiler
456459
for (Class<?> filerClass = filer.getClass(); filerClass != null; filerClass = filerClass.getSuperclass()) {
457-
try {
458-
return getJavacFiler(tryGetDelegateField(filerClass, filer));
459-
} catch (final Exception e) {
460-
// delegate field was not found, try on superclass
461-
}
460+
Object delegate = tryGetDelegateField(filerClass, filer);
461+
if (delegate == null) delegate = tryGetProxyDelegateToField(filerClass, filer);
462+
if (delegate == null) delegate = tryGetFilerField(filerClass, filer);
463+
464+
if (delegate != null) return getJavacFiler(delegate);
465+
// delegate field was not found, try on superclass
462466
}
463467

464468
processingEnv.getMessager().printMessage(Kind.WARNING,
465469
"Can't get a JavacFiler from " + filer.getClass().getName() + ". Lombok won't work.");
466470
return null;
467471
}
468472

469-
private Object tryGetDelegateField(Class<?> delegateClass, Object instance) throws Exception {
470-
return Permit.getField(delegateClass, "delegate").get(instance);
473+
/**
474+
* Gradle incremental processing
475+
*/
476+
private Object tryGetDelegateField(Class<?> delegateClass, Object instance) {
477+
try {
478+
return Permit.getField(delegateClass, "delegate").get(instance);
479+
} catch (Exception e) {
480+
return null;
481+
}
482+
}
483+
484+
/**
485+
* Kotlin incremental processing
486+
*/
487+
private Object tryGetProcessingEnvField(Class<?> delegateClass, Object instance) {
488+
try {
489+
return Permit.getField(delegateClass, "processingEnv").get(instance);
490+
} catch (Exception e) {
491+
return null;
492+
}
493+
}
494+
495+
/**
496+
* Kotlin incremental processing
497+
*/
498+
private Object tryGetFilerField(Class<?> delegateClass, Object instance) {
499+
try {
500+
return Permit.getField(delegateClass, "filer").get(instance);
501+
} catch (Exception e) {
502+
return null;
503+
}
504+
}
505+
506+
/**
507+
* InteliJ >= 2020.3
508+
*/
509+
private Object tryGetProxyDelegateToField(Class<?> delegateClass, Object instance) {
510+
try {
511+
InvocationHandler handler = Proxy.getInvocationHandler(instance);
512+
return Permit.getField(handler.getClass(), "val$delegateTo").get(handler);
513+
} catch (Exception e) {
514+
return null;
515+
}
471516
}
472517
}

0 commit comments

Comments
 (0)