@@ -123,10 +123,12 @@ private static <C, R> R processClass(C context, Class<?> source,
123
123
case INHERITED_ANNOTATIONS :
124
124
return processClassInheritedAnnotations (context , source , processor , classFilter );
125
125
case SUPERCLASS :
126
- return processClassHierarchy (context , new int [] { 0 }, source , processor , classFilter , false );
126
+ return processClassHierarchy (context , source , processor , classFilter , false , false );
127
127
case EXHAUSTIVE :
128
128
case TYPE_HIERARCHY :
129
- return processClassHierarchy (context , new int [] {0 }, source , processor , classFilter , true );
129
+ return processClassHierarchy (context , source , processor , classFilter , true , false );
130
+ case TYPE_HIERARCHY_AND_ENCLOSING_CLASSES :
131
+ return processClassHierarchy (context , source , processor , classFilter , true , true );
130
132
}
131
133
throw new IllegalStateException ("Unsupported search strategy " + searchStrategy );
132
134
}
@@ -184,10 +186,22 @@ private static <C, R> R processClassInheritedAnnotations(C context, Class<?> sou
184
186
return null ;
185
187
}
186
188
189
+ @ Nullable
190
+ private static <C , R > R processClassHierarchy (C context , Class <?> source ,
191
+ AnnotationsProcessor <C , R > processor ,
192
+ @ Nullable BiPredicate <C , Class <?>> classFilter , boolean includeInterfaces ,
193
+ boolean includeEnclosing ) {
194
+
195
+ int [] aggregateIndex = new int [] { 0 };
196
+ return processClassHierarchy (context , aggregateIndex , source , processor ,
197
+ classFilter , includeInterfaces , includeEnclosing );
198
+ }
199
+
187
200
@ Nullable
188
201
private static <C , R > R processClassHierarchy (C context , int [] aggregateIndex ,
189
202
Class <?> source , AnnotationsProcessor <C , R > processor ,
190
- @ Nullable BiPredicate <C , Class <?>> classFilter , boolean includeInterfaces ) {
203
+ @ Nullable BiPredicate <C , Class <?>> classFilter , boolean includeInterfaces ,
204
+ boolean includeEnclosing ) {
191
205
192
206
R result = processor .doWithAggregate (context , aggregateIndex [0 ]);
193
207
if (result != null ) {
@@ -205,7 +219,7 @@ private static <C, R> R processClassHierarchy(C context, int[] aggregateIndex,
205
219
if (includeInterfaces ) {
206
220
for (Class <?> interfaceType : source .getInterfaces ()) {
207
221
R interfacesResult = processClassHierarchy (context , aggregateIndex ,
208
- interfaceType , processor , classFilter , true );
222
+ interfaceType , processor , classFilter , true , includeEnclosing );
209
223
if (interfacesResult != null ) {
210
224
return interfacesResult ;
211
225
}
@@ -214,11 +228,21 @@ private static <C, R> R processClassHierarchy(C context, int[] aggregateIndex,
214
228
Class <?> superclass = source .getSuperclass ();
215
229
if (superclass != Object .class && superclass != null ) {
216
230
R superclassResult = processClassHierarchy (context , aggregateIndex ,
217
- superclass , processor , classFilter , includeInterfaces );
231
+ superclass , processor , classFilter , includeInterfaces ,
232
+ includeEnclosing );
218
233
if (superclassResult != null ) {
219
234
return superclassResult ;
220
235
}
221
236
}
237
+ Class <?> enclosingClass = source .getEnclosingClass ();
238
+ if (includeEnclosing && enclosingClass != null ) {
239
+ R enclosingResult = processClassHierarchy (context , aggregateIndex ,
240
+ enclosingClass , processor , classFilter , includeInterfaces ,
241
+ includeEnclosing );
242
+ if (enclosingResult != null ) {
243
+ return enclosingResult ;
244
+ }
245
+ }
222
246
return null ;
223
247
}
224
248
@@ -237,6 +261,7 @@ private static <C, R> R processMethod(C context, Method source,
237
261
processor , classFilter , source , false );
238
262
case EXHAUSTIVE :
239
263
case TYPE_HIERARCHY :
264
+ case TYPE_HIERARCHY_AND_ENCLOSING_CLASSES :
240
265
return processMethodHierarchy (context , new int [] {0 }, source .getDeclaringClass (),
241
266
processor , classFilter , source , true );
242
267
}
0 commit comments