Skip to content
This repository was archived by the owner on Jan 2, 2025. It is now read-only.

Commit 6d4381f

Browse files
committed
DelegatingElement is now Constable
Signed-off-by: Laird Nelson <[email protected]>
1 parent c01dae9 commit 6d4381f

File tree

4 files changed

+117
-63
lines changed

4 files changed

+117
-63
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Maven dependency:
2727
<groupId>org.microbean</groupId>
2828
<artifactId>microbean-lang</artifactId>
2929
<!-- Always check https://search.maven.org/artifact/org.microbean/microbean-lang for up-to-date available versions. -->
30-
<version>0.0.15</version>
30+
<version>0.0.17</version>
3131
</dependency>
3232
```
3333

lang/src/main/java/org/microbean/lang/ConstantDescs.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public final class ConstantDescs {
2828

2929
public static final ClassDesc CD_DeclaredType = ClassDesc.of("javax.lang.model.type.DeclaredType");
3030

31+
public static final ClassDesc CD_DelegatingElement = ClassDesc.of("org.microbean.lang.element.DelegatingElement");
32+
33+
public static final ClassDesc CD_DelegatingTypeMirror = ClassDesc.of("org.microbean.lang.type.DelegatingTypeMirror");
34+
3135
public static final ClassDesc CD_Element = ClassDesc.of("javax.lang.model.element.Element");
3236

3337
public static final ClassDesc CD_Equality = ClassDesc.of("org.microbean.lang.Equality");

lang/src/main/java/org/microbean/lang/element/DelegatingElement.java

Lines changed: 72 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,18 @@
1515

1616
import java.lang.annotation.Annotation;
1717

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+
1824
import java.util.ArrayList;
1925
import java.util.Collection;
2026
import java.util.Collections;
2127
import java.util.List;
2228
import java.util.Objects;
29+
import java.util.Optional;
2330
import java.util.Set;
2431

2532
import java.util.function.Supplier;
@@ -52,6 +59,14 @@
5259
import org.microbean.lang.type.DelegatingTypeMirror;
5360
import org.microbean.lang.type.NoType;
5461

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+
5570
/**
5671
* An {@link Element} that implements all known {@link Element} subinterfaces and delegates to an underlying {@link
5772
* Element} for all operations.
@@ -60,9 +75,9 @@
6075
*
6176
* @author <a href="https://about.me/lairdnelson" target="_top">Laird Nelson</a>
6277
*/
63-
@SuppressWarnings("preview")
6478
public final class DelegatingElement
65-
implements ExecutableElement,
79+
implements Constable,
80+
ExecutableElement,
6681
ModuleElement,
6782
PackageElement,
6883
Parameterizable,
@@ -119,14 +134,29 @@ private DelegatingElement(final Element delegate,
119134
@Override // Element
120135
public final <R, P> R accept(final ElementVisitor<R, P> v, final P p) {
121136
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);
130160
};
131161
}
132162

@@ -139,11 +169,29 @@ public final Element delegate() {
139169
return this.delegateSupplier.get();
140170
}
141171

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+
142190
@Override // RecordComponentElement
143191
public final ExecutableElement getAccessor() {
144192
return switch (this.getKind()) {
145193
case RECORD_COMPONENT -> this.wrap(((RecordComponentElement)this.delegate()).getAccessor());
146-
default -> null;
194+
default -> null;
147195
};
148196
}
149197

@@ -193,8 +241,8 @@ public final AnnotationValue getDefaultValue() {
193241
@Override // ModuleElement
194242
public final List<? extends Directive> getDirectives() {
195243
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();
198246
};
199247
}
200248

@@ -212,7 +260,7 @@ public final Element getEnclosingElement() {
212260
public final Element getGenericElement() {
213261
return switch (this.getKind()) {
214262
case TYPE_PARAMETER -> this.wrap(((TypeParameterElement)this.delegate()).getGenericElement());
215-
default -> null; // illegal state
263+
default -> null; // illegal state
216264
};
217265
}
218266

@@ -239,22 +287,21 @@ public final Set<Modifier> getModifiers() {
239287
public final NestingKind getNestingKind() {
240288
return switch (this.getKind()) {
241289
case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, RECORD -> ((TypeElement)this.delegate()).getNestingKind();
242-
default -> null;
290+
default -> null;
243291
};
244292
}
245293

246294
@Override // ExecutableElement
247295
public final List<? extends VariableElement> getParameters() {
248296
return switch (this.getKind()) {
249297
case CONSTRUCTOR, METHOD -> this.wrap(((ExecutableElement)this.delegate()).getParameters());
250-
default -> List.of();
298+
default -> List.of();
251299
};
252300
}
253301

254302
@Override // ModuleElement, PackageElement, TypeElement
255303
public final Name getQualifiedName() {
256304
return switch (this.getKind()) {
257-
// case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, MODULE, PACKAGE, RECORD -> ((QualifiedNameable)this.delegate()).getQualifiedName();
258305
case ANNOTATION_TYPE, CLASS, ENUM, INTERFACE, MODULE, PACKAGE, RECORD ->
259306
org.microbean.lang.element.Name.of(((QualifiedNameable)this.delegate()).getQualifiedName());
260307
default -> org.microbean.lang.element.Name.of();
@@ -272,8 +319,8 @@ public final TypeMirror getReceiverType() {
272319
@Override // TypeElement
273320
public final List<? extends RecordComponentElement> getRecordComponents() {
274321
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();
277324
};
278325
}
279326

@@ -284,7 +331,6 @@ public final TypeMirror getReturnType() {
284331

285332
@Override // Element
286333
public final Name getSimpleName() {
287-
// return this.delegate().getSimpleName();
288334
return org.microbean.lang.element.Name.of(this.delegate().getSimpleName());
289335
}
290336

@@ -309,40 +355,40 @@ public final List<? extends TypeMirror> getThrownTypes() {
309355
public final List<? extends TypeParameterElement> getTypeParameters() {
310356
return switch (this.getKind()) {
311357
case CLASS, CONSTRUCTOR, ENUM, INTERFACE, RECORD, METHOD -> this.wrap(((Parameterizable)this.delegate()).getTypeParameters());
312-
default -> List.of();
358+
default -> List.of();
313359
};
314360
}
315361

316362
@Override // ExecutableElement
317363
public final boolean isDefault() {
318364
return switch (this.getKind()) {
319365
case METHOD -> ((ExecutableElement)this.delegate()).isDefault();
320-
default -> false;
366+
default -> false;
321367
};
322368
}
323369

324370
@Override // ModuleElement
325371
public final boolean isOpen() {
326372
return switch (this.getKind()) {
327373
case MODULE -> ((ModuleElement)this.delegate()).isOpen();
328-
default -> false;
374+
default -> false;
329375
};
330376
}
331377

332378
@Override // ModuleElement, PackageElement
333379
public final boolean isUnnamed() {
334380
return switch (this.getKind()) {
335-
case MODULE -> ((ModuleElement)this.delegate()).isUnnamed();
381+
case MODULE -> ((ModuleElement)this.delegate()).isUnnamed();
336382
case PACKAGE -> ((PackageElement)this.delegate()).isUnnamed();
337-
default -> false;
383+
default -> this.getSimpleName().isEmpty();
338384
};
339385
}
340386

341387
@Override // ExecutableElement
342388
public final boolean isVarArgs() {
343389
return switch (this.getKind()) {
344390
case CONSTRUCTOR, METHOD -> ((ExecutableElement)this.delegate()).isVarArgs();
345-
default -> false;
391+
default -> false;
346392
};
347393
}
348394

0 commit comments

Comments
 (0)