From f4326545d56fb61ab00ef09b4d1e06f68220397c Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:43:29 -0500 Subject: [PATCH 1/4] Generate component before the last round --- .../io/avaje/jsonb/generator/JsonbProcessor.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java index e081aa78..ec445a50 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java @@ -70,6 +70,9 @@ public final class JsonbProcessor extends AbstractProcessor { private SimpleComponentWriter componentWriter; private boolean readModuleInfo; + private boolean finished; + private boolean generateComponent; + private int rounds; @Override public SourceVersion getSupportedSourceVersion() { @@ -112,7 +115,8 @@ private void readModule() { @Override public boolean process(Set annotations, RoundEnvironment round) { - if (round.errorRaised()) { + generateComponent = rounds++ > 0; + if (finished || round.errorRaised()) { return false; } APContext.setProjectModuleElement(annotations, round); @@ -127,12 +131,14 @@ public boolean process(Set annotations, RoundEnvironment metaData.fullName(false); cascadeTypes(); - writeComponent(round.processingOver()); + writeComponent(generateComponent); return false; } // Optional because annotations are not guaranteed to exist private Optional> getElements(RoundEnvironment round, String name) { + var op= Optional.ofNullable(typeElement(name)).map(round::getElementsAnnotatedWith).filter(n->!n.isEmpty()); + generateComponent = generateComponent && op.isEmpty(); return Optional.ofNullable(typeElement(name)).map(round::getElementsAnnotatedWith); } @@ -245,6 +251,7 @@ private void cascadeTypesInner() { } for (final String type : extraTypes) { if (!ignoreType(type)) { + generateComponent = false; final TypeElement element = typeElement(type); if (element != null && element.getKind() != ElementKind.ENUM @@ -312,6 +319,7 @@ private static TypeElement implementationType(ImportPrism importPrism) { private void writeComponent(boolean processingOver) { if (processingOver) { + this.finished = true; try { if (!metaData.isEmpty()) { componentWriter.initialise(false); From be6e4005a22967d64e42a812975cf21bb22f123a Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:46:48 -0500 Subject: [PATCH 2/4] Update JsonbProcessor.java --- .../io/avaje/jsonb/generator/JsonbProcessor.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java index ec445a50..1d3571bf 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java @@ -136,10 +136,14 @@ public boolean process(Set annotations, RoundEnvironment } // Optional because annotations are not guaranteed to exist - private Optional> getElements(RoundEnvironment round, String name) { - var op= Optional.ofNullable(typeElement(name)).map(round::getElementsAnnotatedWith).filter(n->!n.isEmpty()); - generateComponent = generateComponent && op.isEmpty(); - return Optional.ofNullable(typeElement(name)).map(round::getElementsAnnotatedWith); + private Optional> getElements( + RoundEnvironment round, String name) { + var op = + Optional.ofNullable(typeElement(name)) + .map(round::getElementsAnnotatedWith) + .filter(n -> !n.isEmpty()); + generateComponent = generateComponent && op.isEmpty(); + return op; } private void registerCustomAdapters(Set elements) { From d08027a11206595eb2a4c7f031f7352b83708842 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 28 Nov 2025 13:17:01 -0500 Subject: [PATCH 3/4] Update JsonbProcessor.java --- .../main/java/io/avaje/jsonb/generator/JsonbProcessor.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java index 1d3571bf..744fb7c5 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java @@ -70,7 +70,6 @@ public final class JsonbProcessor extends AbstractProcessor { private SimpleComponentWriter componentWriter; private boolean readModuleInfo; - private boolean finished; private boolean generateComponent; private int rounds; @@ -115,10 +114,10 @@ private void readModule() { @Override public boolean process(Set annotations, RoundEnvironment round) { - generateComponent = rounds++ > 0; - if (finished || round.errorRaised()) { + if (generateComponent || round.errorRaised()) { return false; } + generateComponent = rounds++ > 0; APContext.setProjectModuleElement(annotations, round); readModule(); getElements(round, ValuePrism.PRISM_TYPE).ifPresent(this::writeValueAdapters); @@ -323,7 +322,6 @@ private static TypeElement implementationType(ImportPrism importPrism) { private void writeComponent(boolean processingOver) { if (processingOver) { - this.finished = true; try { if (!metaData.isEmpty()) { componentWriter.initialise(false); From e4654ad37200042cd936ef46c74a1ca9c4206fce Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 1 Dec 2025 07:56:28 +1300 Subject: [PATCH 4/4] Add comments for generateComponent and format --- .../java/io/avaje/jsonb/generator/JsonbProcessor.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java index 744fb7c5..05d84b79 100644 --- a/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java +++ b/jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java @@ -135,12 +135,12 @@ public boolean process(Set annotations, RoundEnvironment } // Optional because annotations are not guaranteed to exist - private Optional> getElements( - RoundEnvironment round, String name) { + private Optional> getElements(RoundEnvironment round, String name) { var op = - Optional.ofNullable(typeElement(name)) - .map(round::getElementsAnnotatedWith) - .filter(n -> !n.isEmpty()); + Optional.ofNullable(typeElement(name)) + .map(round::getElementsAnnotatedWith) + .filter(n -> !n.isEmpty()); + // skip generateComponent if anything needs processing in this round generateComponent = generateComponent && op.isEmpty(); return op; } @@ -254,6 +254,7 @@ private void cascadeTypesInner() { } for (final String type : extraTypes) { if (!ignoreType(type)) { + // skip generateComponent for this round due to cascade generateComponent = false; final TypeElement element = typeElement(type); if (element != null