From a490ba1e4501fdd81ca4fa8b224061e587785bf8 Mon Sep 17 00:00:00 2001 From: Graeme Rocher Date: Tue, 23 Jul 2024 08:41:57 -0400 Subject: [PATCH] Address #122 in SuperBuilder (#124) * Track processed classes. (#123) * address #122 in SuperBuilder --- .../visitors/BuilderAnnotationVisitor.java | 14 +++++++++++++- .../visitors/SuperBuilderAnnotationVisitor.java | 13 +++++++++++++ .../visitors/WitherAnnotationVisitor.java | 13 +++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/BuilderAnnotationVisitor.java b/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/BuilderAnnotationVisitor.java index 899f3b1a..f49ad254 100644 --- a/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/BuilderAnnotationVisitor.java +++ b/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/BuilderAnnotationVisitor.java @@ -41,6 +41,8 @@ import io.micronaut.sourcegen.model.TypeDef; import io.micronaut.sourcegen.model.VariableDef; +import java.util.HashSet; +import java.util.Set; import javax.lang.model.element.Modifier; import java.util.ArrayList; import java.util.Collection; @@ -51,7 +53,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; @@ -69,13 +70,23 @@ @Internal public final class BuilderAnnotationVisitor implements TypeElementVisitor { + private final Set processed = new HashSet<>(); + @Override public @NonNull VisitorKind getVisitorKind() { return VisitorKind.ISOLATING; } + @Override + public void start(VisitorContext visitorContext) { + processed.clear(); + } + @Override public void visitClass(ClassElement element, VisitorContext context) { + if (processed.contains(element.getName())) { + return; + } try { String simpleName = element.getSimpleName() + "Builder"; String builderClassName = element.getPackageName() + "." + simpleName; @@ -102,6 +113,7 @@ public void visitClass(ClassElement element, VisitorContext context) { } ClassDef builderDef = builder.build(); + processed.add(element.getName()); context.visitGeneratedSourceFile( builderDef.getPackageName(), builderDef.getSimpleName(), diff --git a/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/SuperBuilderAnnotationVisitor.java b/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/SuperBuilderAnnotationVisitor.java index 402f4c22..e0b3c8f2 100644 --- a/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/SuperBuilderAnnotationVisitor.java +++ b/sourcegen-generator/src/main/java/io/micronaut/sourcegen/generator/visitors/SuperBuilderAnnotationVisitor.java @@ -30,6 +30,8 @@ import io.micronaut.sourcegen.model.MethodDef; import io.micronaut.sourcegen.model.TypeDef; +import java.util.HashSet; +import java.util.Set; import javax.lang.model.element.Modifier; import java.util.List; @@ -44,6 +46,13 @@ @Internal public final class SuperBuilderAnnotationVisitor implements TypeElementVisitor { + private final Set processed = new HashSet<>(); + + @Override + public void start(VisitorContext visitorContext) { + processed.clear(); + } + @Override public @NonNull VisitorKind getVisitorKind() { return VisitorKind.ISOLATING; @@ -51,6 +60,9 @@ public final class SuperBuilderAnnotationVisitor implements TypeElementVisitor { + private final Set processed = new HashSet<>(); + @Override public @NonNull VisitorKind getVisitorKind() { return VisitorKind.ISOLATING; } + @Override + public void start(VisitorContext visitorContext) { + processed.clear(); + } + @Override public void visitClass(ClassElement recordElement, VisitorContext context) { + if (processed.contains(recordElement.getName())) { + return; + } try { if (!recordElement.isRecord()) { throw new ProcessingException(recordElement, "Only records can be annotated with @Wither"); @@ -105,6 +117,7 @@ public void visitClass(ClassElement recordElement, VisitorContext context) { } InterfaceDef witherDef = wither.build(); + processed.add(recordElement.getName()); context.visitGeneratedSourceFile( witherDef.getPackageName(), witherDef.getSimpleName(),