Skip to content

Commit 55a8eeb

Browse files
authored
Merge pull request quarkusio#50708 from Ladicek/arc-gizmo2
ArC: rewrite to Gizmo 2
2 parents 12eccb1 + 7b8d994 commit 55a8eeb

File tree

82 files changed

+7969
-8150
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+7969
-8150
lines changed

extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/LookupConditionsProcessor.java

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
import io.quarkus.arc.runtime.SuppressConditions;
2121
import io.quarkus.deployment.annotations.BuildProducer;
2222
import io.quarkus.deployment.annotations.BuildStep;
23-
import io.quarkus.gizmo.BytecodeCreator;
24-
import io.quarkus.gizmo.MethodDescriptor;
25-
import io.quarkus.gizmo.ResultHandle;
23+
import io.quarkus.gizmo2.Const;
24+
import io.quarkus.gizmo2.Expr;
25+
import io.quarkus.gizmo2.creator.BlockCreator;
26+
import io.quarkus.gizmo2.desc.MethodDesc;
2627

2728
public class LookupConditionsProcessor {
2829

@@ -39,22 +40,20 @@ public class LookupConditionsProcessor {
3940
private static final String STRING_VALUE = "stringValue";
4041
private static final String LOOKUP_IF_MISSING = "lookupIfMissing";
4142

42-
private static final MethodDescriptor SUPPRESS_IF_PROPERTY = MethodDescriptor.ofMethod(
43-
SuppressConditions.class,
44-
"suppressIfProperty", boolean.class, String.class, String.class, boolean.class);
45-
private static final MethodDescriptor SUPPRESS_UNLESS_PROPERTY = MethodDescriptor.ofMethod(
46-
SuppressConditions.class,
47-
"suppressUnlessProperty", boolean.class, String.class, String.class, boolean.class);
43+
private static final MethodDesc SUPPRESS_IF_PROPERTY = MethodDesc.of(SuppressConditions.class, "suppressIfProperty",
44+
boolean.class, String.class, String.class, boolean.class);
45+
private static final MethodDesc SUPPRESS_UNLESS_PROPERTY = MethodDesc.of(SuppressConditions.class, "suppressUnlessProperty",
46+
boolean.class, String.class, String.class, boolean.class);
4847

4948
@BuildStep
5049
void suppressConditionsGenerators(BuildProducer<SuppressConditionGeneratorBuildItem> generators,
5150
BeanArchiveIndexBuildItem beanArchiveIndex) {
5251
IndexView index = beanArchiveIndex.getIndex();
5352

54-
generators.produce(new SuppressConditionGeneratorBuildItem(new Function<BeanInfo, Consumer<BytecodeCreator>>() {
53+
generators.produce(new SuppressConditionGeneratorBuildItem(new Function<BeanInfo, Consumer<BlockCreator>>() {
5554

5655
@Override
57-
public Consumer<BytecodeCreator> apply(BeanInfo bean) {
56+
public Consumer<BlockCreator> apply(BeanInfo bean) {
5857
Optional<AnnotationTarget> maybeTarget = bean.getTarget();
5958
if (maybeTarget.isPresent()) {
6059
AnnotationTarget target = maybeTarget.get();
@@ -63,30 +62,28 @@ public Consumer<BytecodeCreator> apply(BeanInfo bean) {
6362
List<AnnotationInstance> unlessPropertyList = findAnnotations(target, LOOK_UP_UNLESS_PROPERTY,
6463
LOOK_UP_UNLESS_PROPERTY_CONTAINER, index);
6564
if (!ifPropertyList.isEmpty() || !unlessPropertyList.isEmpty()) {
66-
return new Consumer<BytecodeCreator>() {
65+
return new Consumer<BlockCreator>() {
6766
@Override
68-
public void accept(BytecodeCreator suppressed) {
67+
public void accept(BlockCreator suppressed) {
6968
for (AnnotationInstance ifProperty : ifPropertyList) {
7069
String propertyName = ifProperty.value(NAME).asString();
7170
String expectedStringValue = ifProperty.value(STRING_VALUE).asString();
7271
AnnotationValue lookupIfMissingValue = ifProperty.value(LOOKUP_IF_MISSING);
7372
boolean lookupIfMissing = lookupIfMissingValue != null
7473
&& lookupIfMissingValue.asBoolean();
75-
ResultHandle result = suppressed.invokeStaticMethod(
76-
SUPPRESS_IF_PROPERTY, suppressed.load(propertyName),
77-
suppressed.load(expectedStringValue), suppressed.load(lookupIfMissing));
78-
suppressed.ifTrue(result).trueBranch().returnValue(suppressed.load(true));
74+
Expr result = suppressed.invokeStatic(SUPPRESS_IF_PROPERTY, Const.of(propertyName),
75+
Const.of(expectedStringValue), Const.of(lookupIfMissing));
76+
suppressed.if_(result, BlockCreator::returnTrue);
7977
}
8078
for (AnnotationInstance unlessProperty : unlessPropertyList) {
8179
String propertyName = unlessProperty.value(NAME).asString();
8280
String expectedStringValue = unlessProperty.value(STRING_VALUE).asString();
8381
AnnotationValue lookupIfMissingValue = unlessProperty.value(LOOKUP_IF_MISSING);
8482
boolean lookupIfMissing = lookupIfMissingValue != null
8583
&& lookupIfMissingValue.asBoolean();
86-
ResultHandle result = suppressed.invokeStaticMethod(
87-
SUPPRESS_UNLESS_PROPERTY, suppressed.load(propertyName),
88-
suppressed.load(expectedStringValue), suppressed.load(lookupIfMissing));
89-
suppressed.ifTrue(result).trueBranch().returnValue(suppressed.load(true));
84+
Expr result = suppressed.invokeStatic(SUPPRESS_UNLESS_PROPERTY, Const.of(propertyName),
85+
Const.of(expectedStringValue), Const.of(lookupIfMissing));
86+
suppressed.if_(result, BlockCreator::returnTrue);
9087
}
9188
}
9289
};
@@ -102,20 +99,19 @@ List<AnnotationInstance> findAnnotations(AnnotationTarget target, DotName annota
10299
AnnotationInstance annotation;
103100
AnnotationInstance container;
104101
switch (target.kind()) {
105-
case CLASS:
102+
case CLASS -> {
106103
annotation = target.asClass().declaredAnnotation(annotationName);
107104
container = target.asClass().declaredAnnotation(containingAnnotationName);
108-
break;
109-
case FIELD:
105+
}
106+
case FIELD -> {
110107
annotation = target.asField().annotation(annotationName);
111108
container = target.asField().annotation(containingAnnotationName);
112-
break;
113-
case METHOD:
109+
}
110+
case METHOD -> {
114111
annotation = target.asMethod().annotation(annotationName);
115112
container = target.asMethod().annotation(containingAnnotationName);
116-
break;
117-
default:
118-
throw new IllegalStateException("Invalid bean target: " + target);
113+
}
114+
default -> throw new IllegalStateException("Invalid bean target: " + target);
119115
}
120116
if (annotation == null && container == null) {
121117
return Collections.emptyList();

extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/ShutdownBuildSteps.java

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package io.quarkus.arc.deployment;
22

3+
import static org.jboss.jandex.gizmo2.Jandex2Gizmo.methodDescOf;
4+
35
import java.lang.reflect.Modifier;
46
import java.util.ArrayList;
57
import java.util.List;
68
import java.util.function.Predicate;
79

8-
import jakarta.enterprise.context.spi.Contextual;
910
import jakarta.enterprise.inject.spi.ObserverMethod;
1011

1112
import org.jboss.jandex.AnnotationValue;
@@ -15,7 +16,6 @@
1516
import org.jboss.logging.Logger;
1617

1718
import io.quarkus.arc.deployment.ObserverRegistrationPhaseBuildItem.ObserverConfiguratorBuildItem;
18-
import io.quarkus.arc.impl.CreationalContextImpl;
1919
import io.quarkus.arc.processor.AnnotationStore;
2020
import io.quarkus.arc.processor.BeanInfo;
2121
import io.quarkus.arc.processor.BuildExtension;
@@ -24,10 +24,11 @@
2424
import io.quarkus.deployment.annotations.BuildProducer;
2525
import io.quarkus.deployment.annotations.BuildStep;
2626
import io.quarkus.deployment.shutdown.ShutdownBuildTimeConfig;
27-
import io.quarkus.gizmo.CatchBlockCreator;
28-
import io.quarkus.gizmo.MethodDescriptor;
29-
import io.quarkus.gizmo.ResultHandle;
30-
import io.quarkus.gizmo.TryBlock;
27+
import io.quarkus.gizmo2.Const;
28+
import io.quarkus.gizmo2.Expr;
29+
import io.quarkus.gizmo2.LocalVar;
30+
import io.quarkus.gizmo2.creator.BlockCreator;
31+
import io.quarkus.gizmo2.desc.ConstructorDesc;
3132
import io.quarkus.runtime.Shutdown;
3233
import io.quarkus.runtime.ShutdownDelayInitiated;
3334
import io.quarkus.runtime.ShutdownDelayInitiatedEvent;
@@ -123,43 +124,47 @@ private void processMethods(List<MethodInfo> shutdownMethods, AnnotationStore an
123124
}
124125
}
125126

126-
private void registerShutdownObserver(ObserverRegistrationPhaseBuildItem observerRegistration, BeanInfo bean, String id,
127+
private void registerShutdownObserver(ObserverRegistrationPhaseBuildItem observerRegistration, BeanInfo btBean, String id,
127128
int priority, MethodInfo shutdownMethod, DotName observedType) {
128129
ObserverConfigurator configurator = observerRegistration.getContext().configure()
129-
.beanClass(bean.getBeanClass())
130+
.beanClass(btBean.getBeanClass())
130131
.observedType(observedType.equals(SHUTDOWN_NAME) ? ShutdownEvent.class : ShutdownDelayInitiatedEvent.class);
131132
configurator.id(id);
132133
configurator.priority(priority);
133-
configurator.notify(mc -> {
134+
configurator.notify(ng -> {
135+
BlockCreator b0 = ng.notifyMethod();
136+
134137
// InjectableBean<Foo> bean = Arc.container().bean("bflmpsvz");
135-
ResultHandle containerHandle = mc.invokeStaticMethod(StartupBuildSteps.ARC_CONTAINER);
136-
ResultHandle beanHandle = mc.invokeInterfaceMethod(StartupBuildSteps.ARC_CONTAINER_BEAN, containerHandle,
137-
mc.load(bean.getIdentifier()));
138-
if (BuiltinScope.DEPENDENT.is(bean.getScope())) {
139-
ResultHandle creationalContext = mc.newInstance(
140-
MethodDescriptor.ofConstructor(CreationalContextImpl.class, Contextual.class),
141-
beanHandle);
138+
LocalVar arc = b0.localVar("arc", b0.invokeStatic(StartupBuildSteps.ARC_CONTAINER));
139+
LocalVar rtBean = b0.localVar("bean",
140+
b0.invokeInterface(StartupBuildSteps.ARC_CONTAINER_BEAN, arc, Const.of(btBean.getIdentifier())));
141+
if (BuiltinScope.DEPENDENT.is(btBean.getScope())) {
142+
LocalVar creationalContext = b0.localVar("creationalContext",
143+
b0.new_(StartupBuildSteps.CREATIONAL_CONTEXT_IMPL_CTOR, rtBean));
142144
// Create a dependent instance
143-
ResultHandle instance = mc.invokeInterfaceMethod(StartupBuildSteps.CONTEXTUAL_CREATE, beanHandle,
144-
creationalContext);
145-
TryBlock tryBlock = mc.tryBlock();
146-
tryBlock.invokeVirtualMethod(MethodDescriptor.of(shutdownMethod), instance);
147-
CatchBlockCreator catchBlock = tryBlock.addCatch(Exception.class);
148-
catchBlock.invokeInterfaceMethod(StartupBuildSteps.CONTEXTUAL_DESTROY, beanHandle, instance, creationalContext);
149-
catchBlock.throwException(RuntimeException.class, "Error destroying bean with @Shutdown method",
150-
catchBlock.getCaughtException());
151-
// Destroy the instance immediately
152-
mc.invokeInterfaceMethod(StartupBuildSteps.CONTEXTUAL_DESTROY, beanHandle, instance, creationalContext);
145+
LocalVar instance = b0.localVar("instance",
146+
b0.invokeInterface(StartupBuildSteps.CONTEXTUAL_CREATE, rtBean, creationalContext));
147+
b0.try_(tc -> {
148+
tc.body(b1 -> {
149+
b1.invokeVirtual(methodDescOf(shutdownMethod), instance);
150+
});
151+
tc.catch_(Exception.class, "e", (b1, e) -> {
152+
b1.throw_(b1.new_(ConstructorDesc.of(RuntimeException.class, String.class, Throwable.class),
153+
Const.of("Error calling @Shutdown method"), e));
154+
});
155+
tc.finally_(b1 -> {
156+
// Destroy the instance immediately
157+
b1.invokeInterface(StartupBuildSteps.CONTEXTUAL_DESTROY, rtBean, instance, creationalContext);
158+
});
159+
});
153160
} else {
154161
// Obtains the instance from the context
155162
// InstanceHandle<Foo> handle = Arc.container().instance(bean);
156-
ResultHandle instanceHandle = mc.invokeInterfaceMethod(StartupBuildSteps.ARC_CONTAINER_INSTANCE,
157-
containerHandle,
158-
beanHandle);
159-
ResultHandle instance = mc.invokeInterfaceMethod(StartupBuildSteps.INSTANCE_HANDLE_GET, instanceHandle);
160-
mc.invokeVirtualMethod(MethodDescriptor.of(shutdownMethod), instance);
163+
Expr instanceHandle = b0.invokeInterface(StartupBuildSteps.ARC_CONTAINER_INSTANCE, arc, rtBean);
164+
Expr instance = b0.invokeInterface(StartupBuildSteps.INSTANCE_HANDLE_GET, instanceHandle);
165+
b0.invokeVirtual(methodDescOf(shutdownMethod), instance);
161166
}
162-
mc.returnValue(null);
167+
b0.return_();
163168
});
164169
configurator.done();
165170
}

0 commit comments

Comments
 (0)