15
15
16
16
import java .lang .annotation .Annotation ;
17
17
18
+ import java .lang .constant .Constable ;
19
+ import java .lang .constant .ConstantDesc ;
20
+ import java .lang .constant .DynamicConstantDesc ;
21
+ import java .lang .constant .MethodHandleDesc ;
22
+ import java .lang .constant .MethodTypeDesc ;
23
+
18
24
import java .util .ArrayList ;
19
25
import java .util .Collection ;
20
26
import java .util .Collections ;
21
27
import java .util .List ;
22
28
import java .util .Objects ;
29
+ import java .util .Optional ;
23
30
import java .util .Set ;
24
31
25
32
import java .util .function .Supplier ;
52
59
import org .microbean .lang .type .DelegatingTypeMirror ;
53
60
import org .microbean .lang .type .NoType ;
54
61
62
+ import static java .lang .constant .ConstantDescs .BSM_INVOKE ;
63
+ import static java .lang .constant .DirectMethodHandleDesc .Kind .STATIC ;
64
+
65
+ import static org .microbean .lang .ConstantDescs .CD_DelegatingElement ;
66
+ import static org .microbean .lang .ConstantDescs .CD_Equality ;
67
+ import static org .microbean .lang .ConstantDescs .CD_TypeAndElementSource ;
68
+ import static org .microbean .lang .ConstantDescs .CD_Element ;
69
+
55
70
/**
56
71
* An {@link Element} that implements all known {@link Element} subinterfaces and delegates to an underlying {@link
57
72
* Element} for all operations.
60
75
*
61
76
* @author <a href="https://about.me/lairdnelson" target="_top">Laird Nelson</a>
62
77
*/
63
- @ SuppressWarnings ("preview" )
64
78
public final class DelegatingElement
65
- implements ExecutableElement ,
79
+ implements Constable ,
80
+ ExecutableElement ,
66
81
ModuleElement ,
67
82
PackageElement ,
68
83
Parameterizable ,
@@ -119,14 +134,29 @@ private DelegatingElement(final Element delegate,
119
134
@ Override // Element
120
135
public final <R , P > R accept (final ElementVisitor <R , P > v , final P p ) {
121
136
return switch (this .getKind ()) {
122
- case ANNOTATION_TYPE , CLASS , ENUM , INTERFACE , RECORD -> v .visitType (this , p );
123
- case TYPE_PARAMETER -> v .visitTypeParameter (this , p );
124
- case BINDING_VARIABLE , ENUM_CONSTANT , EXCEPTION_PARAMETER , FIELD , LOCAL_VARIABLE , PARAMETER , RESOURCE_VARIABLE -> v .visitVariable (this , p );
125
- case RECORD_COMPONENT -> v .visitRecordComponent (this , p );
126
- case CONSTRUCTOR , INSTANCE_INIT , METHOD , STATIC_INIT -> v .visitExecutable (this , p );
127
- case PACKAGE -> v .visitPackage (this , p );
128
- case MODULE -> v .visitModule (this , p );
129
- case OTHER -> v .visitUnknown (this , p );
137
+ case
138
+ ANNOTATION_TYPE ,
139
+ CLASS ,
140
+ ENUM ,
141
+ INTERFACE ,
142
+ RECORD -> v .visitType (this , p );
143
+ case TYPE_PARAMETER -> v .visitTypeParameter (this , p );
144
+ case
145
+ BINDING_VARIABLE ,
146
+ ENUM_CONSTANT ,
147
+ EXCEPTION_PARAMETER ,
148
+ FIELD , LOCAL_VARIABLE ,
149
+ PARAMETER ,
150
+ RESOURCE_VARIABLE -> v .visitVariable (this , p );
151
+ case RECORD_COMPONENT -> v .visitRecordComponent (this , p );
152
+ case
153
+ CONSTRUCTOR ,
154
+ INSTANCE_INIT ,
155
+ METHOD ,
156
+ STATIC_INIT -> v .visitExecutable (this , p );
157
+ case PACKAGE -> v .visitPackage (this , p );
158
+ case MODULE -> v .visitModule (this , p );
159
+ case OTHER -> v .visitUnknown (this , p );
130
160
};
131
161
}
132
162
@@ -139,11 +169,29 @@ public final Element delegate() {
139
169
return this .delegateSupplier .get ();
140
170
}
141
171
172
+ @ Override // Constable
173
+ public final Optional <? extends ConstantDesc > describeConstable () {
174
+ return this .ehc .describeConstable ()
175
+ .flatMap (ehcDesc -> (this .tes instanceof Constable c ? c .describeConstable () : Optional .<ConstantDesc >empty ())
176
+ .flatMap (tesDesc -> this .tes .describeConstable (this .delegate ())
177
+ .map (delegateDesc -> DynamicConstantDesc .of (BSM_INVOKE ,
178
+ MethodHandleDesc .ofMethod (STATIC ,
179
+ CD_DelegatingElement ,
180
+ "of" ,
181
+ MethodTypeDesc .of (CD_DelegatingElement ,
182
+ CD_Element ,
183
+ CD_TypeAndElementSource ,
184
+ CD_Equality )),
185
+ delegateDesc ,
186
+ tesDesc ,
187
+ ehcDesc ))));
188
+ }
189
+
142
190
@ Override // RecordComponentElement
143
191
public final ExecutableElement getAccessor () {
144
192
return switch (this .getKind ()) {
145
193
case RECORD_COMPONENT -> this .wrap (((RecordComponentElement )this .delegate ()).getAccessor ());
146
- default -> null ;
194
+ default -> null ;
147
195
};
148
196
}
149
197
@@ -193,8 +241,8 @@ public final AnnotationValue getDefaultValue() {
193
241
@ Override // ModuleElement
194
242
public final List <? extends Directive > getDirectives () {
195
243
return switch (this .getKind ()) {
196
- case MODULE -> ((ModuleElement )this .delegate ()).getDirectives ();
197
- default -> List .of ();
244
+ case MODULE -> ((ModuleElement )this .delegate ()).getDirectives (); // TODO: wrap? Probably not necessary
245
+ default -> List .of ();
198
246
};
199
247
}
200
248
@@ -212,7 +260,7 @@ public final Element getEnclosingElement() {
212
260
public final Element getGenericElement () {
213
261
return switch (this .getKind ()) {
214
262
case TYPE_PARAMETER -> this .wrap (((TypeParameterElement )this .delegate ()).getGenericElement ());
215
- default -> null ; // illegal state
263
+ default -> null ; // illegal state
216
264
};
217
265
}
218
266
@@ -239,22 +287,21 @@ public final Set<Modifier> getModifiers() {
239
287
public final NestingKind getNestingKind () {
240
288
return switch (this .getKind ()) {
241
289
case ANNOTATION_TYPE , CLASS , ENUM , INTERFACE , RECORD -> ((TypeElement )this .delegate ()).getNestingKind ();
242
- default -> null ;
290
+ default -> null ;
243
291
};
244
292
}
245
293
246
294
@ Override // ExecutableElement
247
295
public final List <? extends VariableElement > getParameters () {
248
296
return switch (this .getKind ()) {
249
297
case CONSTRUCTOR , METHOD -> this .wrap (((ExecutableElement )this .delegate ()).getParameters ());
250
- default -> List .of ();
298
+ default -> List .of ();
251
299
};
252
300
}
253
301
254
302
@ Override // ModuleElement, PackageElement, TypeElement
255
303
public final Name getQualifiedName () {
256
304
return switch (this .getKind ()) {
257
- // case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, MODULE, PACKAGE, RECORD -> ((QualifiedNameable)this.delegate()).getQualifiedName();
258
305
case ANNOTATION_TYPE , CLASS , ENUM , INTERFACE , MODULE , PACKAGE , RECORD ->
259
306
org .microbean .lang .element .Name .of (((QualifiedNameable )this .delegate ()).getQualifiedName ());
260
307
default -> org .microbean .lang .element .Name .of ();
@@ -272,8 +319,8 @@ public final TypeMirror getReceiverType() {
272
319
@ Override // TypeElement
273
320
public final List <? extends RecordComponentElement > getRecordComponents () {
274
321
return switch (this .getKind ()) {
275
- case RECORD -> (( TypeElement )this .delegate ()).getRecordComponents ();
276
- default -> List .of ();
322
+ case RECORD -> this . wrap ((( TypeElement )this .delegate ()).getRecordComponents () );
323
+ default -> List .of ();
277
324
};
278
325
}
279
326
@@ -284,7 +331,6 @@ public final TypeMirror getReturnType() {
284
331
285
332
@ Override // Element
286
333
public final Name getSimpleName () {
287
- // return this.delegate().getSimpleName();
288
334
return org .microbean .lang .element .Name .of (this .delegate ().getSimpleName ());
289
335
}
290
336
@@ -309,40 +355,40 @@ public final List<? extends TypeMirror> getThrownTypes() {
309
355
public final List <? extends TypeParameterElement > getTypeParameters () {
310
356
return switch (this .getKind ()) {
311
357
case CLASS , CONSTRUCTOR , ENUM , INTERFACE , RECORD , METHOD -> this .wrap (((Parameterizable )this .delegate ()).getTypeParameters ());
312
- default -> List .of ();
358
+ default -> List .of ();
313
359
};
314
360
}
315
361
316
362
@ Override // ExecutableElement
317
363
public final boolean isDefault () {
318
364
return switch (this .getKind ()) {
319
365
case METHOD -> ((ExecutableElement )this .delegate ()).isDefault ();
320
- default -> false ;
366
+ default -> false ;
321
367
};
322
368
}
323
369
324
370
@ Override // ModuleElement
325
371
public final boolean isOpen () {
326
372
return switch (this .getKind ()) {
327
373
case MODULE -> ((ModuleElement )this .delegate ()).isOpen ();
328
- default -> false ;
374
+ default -> false ;
329
375
};
330
376
}
331
377
332
378
@ Override // ModuleElement, PackageElement
333
379
public final boolean isUnnamed () {
334
380
return switch (this .getKind ()) {
335
- case MODULE -> ((ModuleElement )this .delegate ()).isUnnamed ();
381
+ case MODULE -> ((ModuleElement )this .delegate ()).isUnnamed ();
336
382
case PACKAGE -> ((PackageElement )this .delegate ()).isUnnamed ();
337
- default -> false ;
383
+ default -> this . getSimpleName (). isEmpty () ;
338
384
};
339
385
}
340
386
341
387
@ Override // ExecutableElement
342
388
public final boolean isVarArgs () {
343
389
return switch (this .getKind ()) {
344
390
case CONSTRUCTOR , METHOD -> ((ExecutableElement )this .delegate ()).isVarArgs ();
345
- default -> false ;
391
+ default -> false ;
346
392
};
347
393
}
348
394
0 commit comments