24
24
import java .io .IOException ;
25
25
import java .io .InputStream ;
26
26
import java .lang .reflect .Field ;
27
+ import java .lang .reflect .InvocationHandler ;
27
28
import java .lang .reflect .InvocationTargetException ;
28
29
import java .lang .reflect .Method ;
30
+ import java .lang .reflect .Proxy ;
29
31
import java .net .URL ;
30
32
import java .util .ArrayList ;
31
33
import java .util .Enumeration ;
@@ -432,11 +434,12 @@ public JavacProcessingEnvironment getJavacProcessingEnvironment(Object procEnv)
432
434
433
435
// try to find a "delegate" field in the object, and use this to try to obtain a JavacProcessingEnvironment
434
436
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
440
443
}
441
444
442
445
processingEnv .getMessager ().printMessage (Kind .WARNING ,
@@ -454,19 +457,61 @@ public JavacFiler getJavacFiler(Object filer) {
454
457
455
458
// try to find a "delegate" field in the object, and use this to check for a JavacFiler
456
459
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
462
466
}
463
467
464
468
processingEnv .getMessager ().printMessage (Kind .WARNING ,
465
469
"Can't get a JavacFiler from " + filer .getClass ().getName () + ". Lombok won't work." );
466
470
return null ;
467
471
}
468
472
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
+ }
471
516
}
472
517
}
0 commit comments