Skip to content

Commit be41f07

Browse files
authored
Merge pull request #49290 from Ladicek/annotation-proxy-provider-gizmo2
Add Gizmo 2 variant of `AnnotationProxyProvider.build()`
2 parents ffa3592 + 3d294da commit be41f07

File tree

5 files changed

+86
-18
lines changed

5 files changed

+86
-18
lines changed

core/deployment/src/main/java/io/quarkus/deployment/recording/AnnotationProxyProvider.java

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package io.quarkus.deployment.recording;
22

3+
import static org.jboss.jandex.gizmo2.Jandex2Gizmo.classDescOf;
34
import static org.objectweb.asm.Opcodes.ACC_FINAL;
45
import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
56
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
67

78
import java.io.InputStream;
89
import java.lang.annotation.Annotation;
10+
import java.lang.constant.ClassDesc;
911
import java.lang.reflect.InvocationHandler;
1012
import java.lang.reflect.Method;
1113
import java.lang.reflect.Proxy;
14+
import java.util.ArrayList;
1215
import java.util.HashMap;
1316
import java.util.List;
1417
import java.util.ListIterator;
@@ -32,6 +35,12 @@
3235
import io.quarkus.gizmo.FieldDescriptor;
3336
import io.quarkus.gizmo.MethodCreator;
3437
import io.quarkus.gizmo.MethodDescriptor;
38+
import io.quarkus.gizmo2.GenericType;
39+
import io.quarkus.gizmo2.Gizmo;
40+
import io.quarkus.gizmo2.ParamVar;
41+
import io.quarkus.gizmo2.TypeArgument;
42+
import io.quarkus.gizmo2.desc.ConstructorDesc;
43+
import io.quarkus.gizmo2.desc.FieldDesc;
3544

3645
public class AnnotationProxyProvider {
3746

@@ -70,9 +79,9 @@ public <A extends Annotation> AnnotationProxyBuilder<A> builder(AnnotationInstan
7079
}
7180
return clazz;
7281
});
73-
String annotationLiteral = annotationLiterals.computeIfAbsent(annotationInstance.name(), name ->
74-
// com.foo.MyAnnotation -> com.foo.MyAnnotation_Proxy_AnnotationLiteral
75-
name.toString().replace('.', '/') + "_Proxy_AnnotationLiteral");
82+
String annotationLiteral = annotationLiterals.computeIfAbsent(annotationInstance.name(),
83+
// com.foo.MyAnnotation -> com.foo.MyAnnotation_Proxy_AnnotationLiteral
84+
name -> name + "_Proxy_AnnotationLiteral");
7685

7786
return new AnnotationProxyBuilder<>(annotationInstance, annotationType, annotationLiteral, annotationClass);
7887
}
@@ -134,7 +143,6 @@ public AnnotationProxyBuilder<A> withDefaultValue(String name, Object value) {
134143
return this;
135144
}
136145

137-
@SuppressWarnings("unchecked")
138146
public A build(ClassOutput classOutput) {
139147

140148
// Generate literal class if needed
@@ -178,6 +186,11 @@ public A build(ClassOutput classOutput) {
178186
return Boolean.TRUE;
179187
});
180188

189+
return proxy();
190+
}
191+
192+
@SuppressWarnings("unchecked")
193+
private A proxy() {
181194
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
182195
if (classLoader == null) {
183196
classLoader = AnnotationProxy.class.getClassLoader();
@@ -216,6 +229,58 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
216229
}
217230
});
218231
}
232+
233+
public A build(io.quarkus.gizmo2.ClassOutput classOutput) {
234+
generatedLiterals.computeIfAbsent(annotationLiteral, generatedName -> {
235+
Gizmo.create(classOutput).class_(generatedName, cc -> {
236+
ClassDesc annotationClassDesc = classDescOf(annotationInstance.name());
237+
cc.extends_(GenericType.ofClass(AnnotationLiteral.class, TypeArgument.of(annotationClassDesc)));
238+
cc.implements_(annotationClassDesc);
239+
240+
List<MethodInfo> members = annotationClass.methods()
241+
.stream()
242+
.filter(m -> !m.isStaticInitializer() && !m.isConstructor())
243+
.toList();
244+
245+
List<FieldDesc> fields = new ArrayList<>(members.size());
246+
for (MethodInfo member : members) {
247+
fields.add(cc.field(member.name(), fc -> {
248+
fc.private_();
249+
fc.final_();
250+
fc.setType(classDescOf(member.returnType()));
251+
}));
252+
}
253+
254+
cc.constructor(mc -> {
255+
List<ParamVar> params = new ArrayList<>(members.size());
256+
for (MethodInfo member : members) {
257+
params.add(mc.parameter(member.name(), classDescOf(member.returnType())));
258+
}
259+
260+
mc.body(bc -> {
261+
bc.invokeSpecial(ConstructorDesc.of(AnnotationLiteral.class), cc.this_());
262+
for (int i = 0; i < members.size(); i++) {
263+
bc.set(cc.this_().field(fields.get(i)), params.get(i));
264+
}
265+
bc.return_();
266+
});
267+
});
268+
269+
for (int i = 0; i < members.size(); i++) {
270+
MethodInfo member = members.get(i);
271+
FieldDesc field = fields.get(i);
272+
cc.method(member.name(), mc -> {
273+
mc.returning(classDescOf(member.returnType()));
274+
mc.body(bc -> bc.return_(cc.this_().field(field)));
275+
});
276+
}
277+
});
278+
279+
return Boolean.TRUE;
280+
});
281+
282+
return proxy();
283+
}
219284
}
220285

221286
}

extensions/scheduler/deployment/src/main/java/io/quarkus/scheduler/deployment/SchedulerProcessor.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import static org.jboss.jandex.AnnotationValue.createArrayValue;
66
import static org.jboss.jandex.AnnotationValue.createBooleanValue;
77
import static org.jboss.jandex.AnnotationValue.createStringValue;
8+
import static org.jboss.jandex.gizmo2.Jandex2Gizmo.classDescOf;
89
import static org.jboss.jandex.gizmo2.Jandex2Gizmo.methodDescOf;
910

10-
import java.lang.constant.ClassDesc;
1111
import java.lang.reflect.Modifier;
1212
import java.time.Duration;
1313
import java.time.ZoneId;
@@ -64,7 +64,6 @@
6464
import io.quarkus.deployment.Capability;
6565
import io.quarkus.deployment.Feature;
6666
import io.quarkus.deployment.GeneratedClassGizmo2Adaptor;
67-
import io.quarkus.deployment.GeneratedClassGizmoAdaptor;
6867
import io.quarkus.deployment.annotations.BuildProducer;
6968
import io.quarkus.deployment.annotations.BuildStep;
7069
import io.quarkus.deployment.annotations.Record;
@@ -74,6 +73,7 @@
7473
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
7574
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
7675
import io.quarkus.deployment.metrics.MetricsCapabilityBuildItem;
76+
import io.quarkus.gizmo2.ClassOutput;
7777
import io.quarkus.gizmo2.Const;
7878
import io.quarkus.gizmo2.Expr;
7979
import io.quarkus.gizmo2.Gizmo;
@@ -393,9 +393,8 @@ public String apply(String name) {
393393
}
394394
};
395395

396-
Gizmo gizmo = Gizmo
397-
.create(new GeneratedClassGizmo2Adaptor(generatedClasses, generatedResources, generatedToBaseNameFun));
398-
io.quarkus.gizmo.ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClasses, generatedToBaseNameFun);
396+
ClassOutput classOutput = new GeneratedClassGizmo2Adaptor(generatedClasses, generatedResources, generatedToBaseNameFun);
397+
Gizmo gizmo = Gizmo.create(classOutput);
399398

400399
for (ScheduledBusinessMethodItem scheduledMethod : scheduledMethods) {
401400
MutableScheduledMethod metadata = new MutableScheduledMethod();
@@ -502,7 +501,7 @@ private String generateInvoker(ScheduledBusinessMethodItem scheduledMethod, Gizm
502501
if (isSuspendMethod) {
503502
mc.returning(Object.class);
504503
execution = mc.parameter("execution", ScheduledExecution.class);
505-
continuation = mc.parameter("continuation", ClassDesc.of(SchedulerDotNames.CONTINUATION.toString()));
504+
continuation = mc.parameter("continuation", classDescOf(SchedulerDotNames.CONTINUATION));
506505
} else {
507506
// The descriptor is: CompletionStage invoke(ScheduledExecution execution)
508507
mc.returning(CompletionStage.class);
@@ -572,7 +571,7 @@ private String generateInvoker(ScheduledBusinessMethodItem scheduledMethod, Gizm
572571
} else if (method.returnType().name().equals(SchedulerDotNames.UNI)) {
573572
// Subscribe to the returned Uni
574573
tryBlock.return_(tryBlock.invokeInterface(
575-
InterfaceMethodDesc.of(ClassDesc.of(SchedulerDotNames.UNI.toString()),
574+
InterfaceMethodDesc.of(classDescOf(SchedulerDotNames.UNI),
576575
"subscribeAsCompletionStage", CompletableFuture.class),
577576
ret));
578577
} else {

extensions/smallrye-fault-tolerance/deployment/src/main/java/io/quarkus/smallrye/faulttolerance/deployment/FaultToleranceScanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import io.quarkus.deployment.builditem.AnnotationProxyBuildItem;
2929
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
3030
import io.quarkus.deployment.recording.RecorderContext;
31-
import io.quarkus.gizmo.ClassOutput;
31+
import io.quarkus.gizmo2.ClassOutput;
3232
import io.smallrye.common.annotation.Blocking;
3333
import io.smallrye.common.annotation.NonBlocking;
3434
import io.smallrye.faulttolerance.api.ApplyFaultTolerance;

extensions/smallrye-fault-tolerance/deployment/src/main/java/io/quarkus/smallrye/faulttolerance/deployment/SmallRyeFaultToleranceProcessor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import io.quarkus.arc.processor.BuildExtension;
3434
import io.quarkus.arc.processor.BuiltinScope;
3535
import io.quarkus.deployment.Feature;
36-
import io.quarkus.deployment.GeneratedClassGizmoAdaptor;
36+
import io.quarkus.deployment.GeneratedClassGizmo2Adaptor;
3737
import io.quarkus.deployment.annotations.BuildProducer;
3838
import io.quarkus.deployment.annotations.BuildStep;
3939
import io.quarkus.deployment.annotations.ExecutionTime;
@@ -42,6 +42,7 @@
4242
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
4343
import io.quarkus.deployment.builditem.FeatureBuildItem;
4444
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
45+
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
4546
import io.quarkus.deployment.builditem.RunTimeConfigurationDefaultBuildItem;
4647
import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
4748
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
@@ -50,7 +51,7 @@
5051
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
5152
import io.quarkus.deployment.metrics.MetricsCapabilityBuildItem;
5253
import io.quarkus.deployment.recording.RecorderContext;
53-
import io.quarkus.gizmo.ClassOutput;
54+
import io.quarkus.gizmo2.ClassOutput;
5455
import io.quarkus.runtime.metrics.MetricsFactory;
5556
import io.quarkus.smallrye.faulttolerance.deployment.devui.FaultToleranceInfoBuildItem;
5657
import io.quarkus.smallrye.faulttolerance.runtime.QuarkusAsyncExecutorProvider;
@@ -247,6 +248,7 @@ void processFaultToleranceAnnotations(SmallRyeFaultToleranceRecorder recorder,
247248
BeanArchiveIndexBuildItem beanArchiveIndexBuildItem,
248249
AnnotationProxyBuildItem annotationProxy,
249250
BuildProducer<GeneratedClassBuildItem> generatedClasses,
251+
BuildProducer<GeneratedResourceBuildItem> generatedResources,
250252
BuildProducer<ReflectiveClassBuildItem> reflectiveClass,
251253
BuildProducer<ReflectiveMethodBuildItem> reflectiveMethod,
252254
BuildProducer<ValidationPhaseBuildItem.ValidationErrorBuildItem> errors,
@@ -269,7 +271,7 @@ void processFaultToleranceAnnotations(SmallRyeFaultToleranceRecorder recorder,
269271
IndexView index = beanArchiveIndexBuildItem.getIndex();
270272
// only generating annotation literal classes for MicroProfile/SmallRye Fault Tolerance annotations,
271273
// none of them are application classes
272-
ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClasses, false);
274+
ClassOutput classOutput = new GeneratedClassGizmo2Adaptor(generatedClasses, generatedResources, false);
273275

274276
FaultToleranceScanner scanner = new FaultToleranceScanner(index, annotationStore, annotationProxy, classOutput,
275277
recorderContext, reflectiveMethod);

extensions/vertx/deployment/src/main/java/io/quarkus/vertx/deployment/VertxProcessor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import io.quarkus.deployment.Capabilities;
4141
import io.quarkus.deployment.Capability;
4242
import io.quarkus.deployment.Feature;
43-
import io.quarkus.deployment.GeneratedClassGizmoAdaptor;
43+
import io.quarkus.deployment.GeneratedClassGizmo2Adaptor;
4444
import io.quarkus.deployment.annotations.BuildProducer;
4545
import io.quarkus.deployment.annotations.BuildStep;
4646
import io.quarkus.deployment.annotations.ExecutionTime;
@@ -50,6 +50,7 @@
5050
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
5151
import io.quarkus.deployment.builditem.FeatureBuildItem;
5252
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
53+
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
5354
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
5455
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
5556
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
@@ -59,7 +60,7 @@
5960
import io.quarkus.deployment.builditem.nativeimage.ReflectiveMethodBuildItem;
6061
import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem;
6162
import io.quarkus.deployment.recording.RecorderContext;
62-
import io.quarkus.gizmo.ClassOutput;
63+
import io.quarkus.gizmo2.ClassOutput;
6364
import io.quarkus.vertx.ConsumeEvent;
6465
import io.quarkus.vertx.core.deployment.CoreVertxBuildItem;
6566
import io.quarkus.vertx.deployment.spi.EventConsumerInvokerCustomizerBuildItem;
@@ -89,12 +90,13 @@ AdditionalBeanBuildItem registerBean() {
8990
VertxBuildItem build(CoreVertxBuildItem vertx, VertxEventBusConsumerRecorder recorder,
9091
List<EventConsumerBusinessMethodItem> messageConsumerBusinessMethods,
9192
BuildProducer<GeneratedClassBuildItem> generatedClass,
93+
BuildProducer<GeneratedResourceBuildItem> generatedResource,
9294
AnnotationProxyBuildItem annotationProxy, LaunchModeBuildItem launchMode, ShutdownContextBuildItem shutdown,
9395
BuildProducer<ServiceStartBuildItem> serviceStart,
9496
List<MessageCodecBuildItem> codecs, LocalCodecSelectorTypesBuildItem localCodecSelectorTypes,
9597
RecorderContext recorderContext) {
9698
List<EventConsumerInfo> messageConsumerConfigurations = new ArrayList<>();
97-
ClassOutput classOutput = new GeneratedClassGizmoAdaptor(generatedClass, true);
99+
ClassOutput classOutput = new GeneratedClassGizmo2Adaptor(generatedClass, generatedResource, true);
98100
for (EventConsumerBusinessMethodItem businessMethod : messageConsumerBusinessMethods) {
99101
ConsumeEvent annotation = annotationProxy.builder(businessMethod.getConsumeEvent(), ConsumeEvent.class)
100102
.withDefaultValue("value", businessMethod.getBean().getBeanClass().toString())

0 commit comments

Comments
 (0)