From 6c36bb6ed70297fcfe051bd360dc47fa0042c208 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 26 Jun 2025 18:24:31 -0400 Subject: [PATCH] allow bulk external --- .../inject/generator/InjectProcessor.java | 30 ++++++++++++++----- .../models/valid/external/BulkExternal.java | 12 ++++++++ .../main/java/io/avaje/inject/External.java | 14 +++++---- 3 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/BulkExternal.java diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java b/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java index 410f12ca6..306720619 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java @@ -174,13 +174,23 @@ public boolean process(Set annotations, RoundEnvironment maybeElements(roundEnv, AssistFactoryPrism.PRISM_TYPE).ifPresent(this::readAssisted); maybeElements(roundEnv, ExternalPrism.PRISM_TYPE).stream() - .flatMap(Set::stream) - .forEach(e -> { - var type = UType.parse(e.asType()); - type = "java.util.List".equals(type.mainType()) ? type.param0() : type; - ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), Util.named(e)); - ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), null); - }); + .flatMap(Set::stream) + .forEach( + e -> { + if (e instanceof ExecutableElement) { + ExecutableElement method = (ExecutableElement) e; + method + .getParameters() + .forEach( + p -> { + var type = UType.parse(p.asType()); + addExteralType(p, type); + }); + } else { + var type = UType.parse(e.asType()); + addExteralType(e, type); + } + }); maybeElements(roundEnv, ServiceProviderPrism.PRISM_TYPE).ifPresent(this::registerSPI); maybeElements(roundEnv, PluginProvidesPrism.PRISM_TYPE).ifPresent(this::registerSPI); @@ -207,6 +217,12 @@ public boolean process(Set annotations, RoundEnvironment return false; } + private void addExteralType(Element e, UType type) { + type = "java.util.List".equals(type.mainType()) ? type.param0() : type; + ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), Util.named(e)); + ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), null); + } + private void validateQualifier(ExecutableElement method) { var type = APContext.asTypeElement(method.getReturnType()); if (type == null || type.getKind() != ElementKind.ANNOTATION_TYPE) { diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/BulkExternal.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/BulkExternal.java new file mode 100644 index 000000000..aa7111083 --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/BulkExternal.java @@ -0,0 +1,12 @@ +package io.avaje.inject.generator.models.valid.external; + +import java.lang.ref.WeakReference; + +import io.avaje.inject.External; +import jakarta.inject.Singleton; + +@Singleton +public class BulkExternal { + @External + public BulkExternal(WeakReference mace, Cloneable jango) {} +} diff --git a/inject/src/main/java/io/avaje/inject/External.java b/inject/src/main/java/io/avaje/inject/External.java index 0b2a2abe4..9ee6acb96 100644 --- a/inject/src/main/java/io/avaje/inject/External.java +++ b/inject/src/main/java/io/avaje/inject/External.java @@ -1,5 +1,6 @@ package io.avaje.inject; +import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -10,13 +11,14 @@ import java.lang.reflect.Type; /** - * Marks this dependency as an external bean not managed by avaje inject. - * Compile-time validation will be disabled for this type. - *

- * The external dependency is expected to be provided by - * {@link BeanScopeBuilder#bean(String, Type, Object)}. + * Marks dependencies as an external beans potentially not managed by avaje inject. Compile-time + * validation will be disabled for types annotated. + * + *

The external dependency is usually expected to be provided by {@link + * BeanScopeBuilder#bean(String, Type, Object)} or by other modules in cases where ordering is + * irregular. */ @Documented @Retention(SOURCE) -@Target({FIELD, PARAMETER}) +@Target({FIELD, PARAMETER, CONSTRUCTOR}) public @interface External {}