From c9584a3832b1d78f03a32e0146b9d692243d7b9d Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Sat, 27 Jan 2024 11:27:59 -0500 Subject: [PATCH] rebase --- .../inject/generator/ProcessingContext.java | 59 +++++++++++-------- .../io/avaje/inject/generator/Processor.java | 23 +++++++- .../io/avaje/inject/generator/ScopeInfo.java | 17 ++++-- 3 files changed, 65 insertions(+), 34 deletions(-) diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java b/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java index 0b6fc5168..f259e1cfa 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java @@ -1,30 +1,9 @@ package io.avaje.inject.generator; -import static io.avaje.inject.generator.APContext.elements; -import static io.avaje.inject.generator.APContext.filer; -import static io.avaje.inject.generator.APContext.getModuleInfoReader; -import static io.avaje.inject.generator.APContext.getProjectModuleElement; -import static io.avaje.inject.generator.APContext.logError; -import static io.avaje.inject.generator.APContext.logNote; -import static io.avaje.inject.generator.APContext.logWarn; -import static io.avaje.inject.generator.APContext.typeElement; -import static io.avaje.inject.generator.APContext.asTypeElement; -import static io.avaje.inject.generator.APContext.types; - import java.io.FileNotFoundException; import java.io.IOException; import java.io.LineNumberReader; import java.nio.file.NoSuchFileException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; import javax.annotation.processing.FilerException; import javax.annotation.processing.ProcessingEnvironment; @@ -32,12 +11,18 @@ import javax.lang.model.type.TypeMirror; import javax.tools.FileObject; import javax.tools.StandardLocation; +import java.util.*; + +import static io.avaje.inject.generator.APContext.*; +import static java.util.stream.Collectors.toSet; final class ProcessingContext { private static final ThreadLocal CTX = new ThreadLocal<>(); + private static boolean processingOver; - private ProcessingContext() {} + private ProcessingContext() { + } static final class Ctx { private final Set uniqueModuleNames = new HashSet<>(); @@ -45,6 +30,7 @@ static final class Ctx { private final Set optionalTypes = new LinkedHashSet<>(); private final Map aspectImportPrisms = new HashMap<>(); private final List avajeModules = new ArrayList<>(); + private final List delayQueue = new ArrayList<>(); private boolean validated; private boolean strictWiring; private String injectFqn; @@ -111,9 +97,9 @@ private static List loadMetaInf(String fullName) { static FileObject createMetaInfWriter(ScopeInfo.Type scopeType) throws IOException { final var serviceName = - scopeType == ScopeInfo.Type.DEFAULT - ? Constants.META_INF_MODULE - : Constants.META_INF_TESTMODULE; + scopeType == ScopeInfo.Type.DEFAULT + ? Constants.META_INF_MODULE + : Constants.META_INF_TESTMODULE; return createMetaInfWriterFor(serviceName); } @@ -207,7 +193,24 @@ static Optional getImportedAspect(String type) { return Optional.ofNullable(CTX.get().aspectImportPrisms.get(type)); } - public static void clear() { + static Set delayedElements() { + var set = + CTX.get().delayQueue.stream() + .map(t -> t.getQualifiedName().toString()) + .map(APContext::typeElement) + .collect(toSet()); + CTX.get().delayQueue.clear(); + return set; + } + + static boolean delayUntilNextRound(TypeElement element) { + if (!processingOver) { + CTX.get().delayQueue.add(element); + } + return !processingOver; + } + + static void clear() { CTX.remove(); APContext.clear(); } @@ -227,4 +230,8 @@ public static void strictWiring(boolean strictWiring) { public static boolean strictWiring() { return CTX.get().strictWiring; } + + static void processingOver(boolean over) { + processingOver = over; + } } diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/Processor.java b/inject-generator/src/main/java/io/avaje/inject/generator/Processor.java index c06ba177a..3d7d12a22 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/Processor.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/Processor.java @@ -2,6 +2,7 @@ import io.avaje.prism.GenerateAPContext; import io.avaje.prism.GenerateModuleInfoReader; +import io.avaje.prism.GenerateUtils; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -22,9 +23,11 @@ import static io.avaje.inject.generator.APContext.*; import static io.avaje.inject.generator.ProcessingContext.*; +@GenerateUtils @GenerateAPContext @GenerateModuleInfoReader @SupportedAnnotationTypes({ + AssistFactoryPrism.PRISM_TYPE, InjectModulePrism.PRISM_TYPE, FactoryPrism.PRISM_TYPE, SingletonPrism.PRISM_TYPE, @@ -107,6 +110,10 @@ public boolean process(Set annotations, RoundEnvironment APContext.setProjectModuleElement(annotations, roundEnv); readModule(roundEnv); + final var processingOver = roundEnv.processingOver(); + ProcessingContext.processingOver(processingOver); + + readBeans(delayedElements()); addImportedAspects(importedAspects(roundEnv)); maybeElements(roundEnv, ScopePrism.PRISM_TYPE).ifPresent(this::readScopes); maybeElements(roundEnv, FactoryPrism.PRISM_TYPE).ifPresent(this::readFactories); @@ -121,10 +128,11 @@ public boolean process(Set annotations, RoundEnvironment maybeElements(roundEnv, Constants.CONTROLLER).ifPresent(this::readBeans); maybeElements(roundEnv, ProxyPrism.PRISM_TYPE).ifPresent(this::readBeans); + maybeElements(roundEnv, AssistFactoryPrism.PRISM_TYPE).ifPresent(this::readAssisted); allScopes.readBeans(roundEnv); - defaultScope.write(roundEnv.processingOver()); - allScopes.write(roundEnv.processingOver()); + defaultScope.write(processingOver); + allScopes.write(processingOver); if (roundEnv.processingOver()) { @@ -195,6 +203,17 @@ private void readFactories(Set beans) { readChangedBeans(ElementFilter.typesIn(beans), true, false); } + private void readAssisted(Set beans) { + ElementFilter.typesIn(beans).forEach(t -> { + var reader = new AssistBeanReader(t); + try { + new SimpleAssistWriter(reader).write(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + private void readBeans(Set beans) { readChangedBeans(ElementFilter.typesIn(beans), false, false); } diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/ScopeInfo.java b/inject-generator/src/main/java/io/avaje/inject/generator/ScopeInfo.java index 6cb8b7c7a..dc715aa61 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/ScopeInfo.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/ScopeInfo.java @@ -127,7 +127,7 @@ private void read(Element element) { .forEach( require -> { requiresPackages.add(require); - requirePkg.add(Util.packageOf(require) + "."); + requirePkg.add(ProcessorUtils.packageOf(require) + "."); }); } @@ -305,7 +305,12 @@ private void readBeanMeta(TypeElement typeElement, boolean factory, boolean impo logNote("skipping annotation type " + typeElement); return; } - beanReaders.add(new BeanReader(typeElement, factory, importedComponent).read()); + var reader = new BeanReader(typeElement, factory, importedComponent).read(); + if (reader.isDelayed() && ProcessingContext.delayUntilNextRound(typeElement)) { + readBeans.remove(typeElement.toString()); + } else { + beanReaders.add(reader); + } } void readBuildMethodDependencyMeta(Element element) { @@ -487,10 +492,10 @@ private boolean providesDependencyRecursive(String dependency) { for (String require : requires) { final ScopeInfo requiredScope = scopes.get(require); // recursively search parent scope - if ((requiredScope != null) && requiredScope.providesDependencyRecursive(dependency)) { - // logWarn("dependency " + dependency + " provided by other scope " + requiredScope.name); - return true; - } + if ((requiredScope != null) && requiredScope.providesDependencyRecursive(dependency)) { + // logWarn("dependency " + dependency + " provided by other scope " + requiredScope.name); + return true; + } } return false; }