Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
170 commits
Select commit Hold shift + click to select a range
7bf1e52
processing: generalize ProcessingTarget to a typed per-element carrier
devin-ai-integration[bot] Oct 25, 2026
96fb495
processing: extract AnnotationElementSpec — declarative element selec…
devin-ai-integration[bot] Oct 25, 2026
1eceace
processing: extract ProcessorOptionRegistry — supported options deriv…
devin-ai-integration[bot] Oct 25, 2026
7fcd807
processing: generalize SourceFormatterResolver — profile and formatte…
devin-ai-integration[bot] Oct 25, 2026
903e63e
processing: hoist GeneratedTypes registry onto AnnotationProcessingCo…
devin-ai-integration[bot] Oct 25, 2026
b3b39e3
processing: introduce AbstractCodegenProcessor — generic collect-plan…
devin-ai-integration[bot] Oct 25, 2026
80df0d7
processing: claim annotations via claimsAnnotations derived from the …
devin-ai-integration[bot] Oct 25, 2026
cf8d586
analysis: share array-attribute reading and class-value resolution vi…
devin-ai-integration[bot] Oct 25, 2026
75574b9
processing: declare supported types via supportedAnnotationTypes() me…
devin-ai-integration[bot] Oct 25, 2026
25021b3
processing: drop redundant @SupportedAnnotationTypes — framework defa…
devin-ai-integration[bot] Oct 25, 2026
309fae3
processing: common CodegenConfiguration/CodegenDefinition contracts —…
devin-ai-integration[bot] Oct 25, 2026
7292afd
processing: option registry gains verbose and formatter-profile contract
devin-ai-integration[bot] Oct 25, 2026
3919597
processing: backend registry resolves engine and formatter via Servic…
devin-ai-integration[bot] Oct 25, 2026
c262024
processing: minimum abstract set — SourceVersion-typed source level, …
devin-ai-integration[bot] Oct 25, 2026
4582bf7
processing: registerPlannedOutputs generalized — domain supplies only…
devin-ai-integration[bot] Oct 25, 2026
b9c0e24
processing: deferredTargets hook — deferred outputs run the generic l…
devin-ai-integration[bot] Oct 25, 2026
08d4251
processing: fluent builders for AnnotationElementSpec and ElementSele…
devin-ai-integration[bot] Oct 25, 2026
4c28779
processing: javadoc spine marks implement-required hooks
devin-ai-integration[bot] Oct 25, 2026
b6afc43
processing: resolve codegen backends via the processor-path classloader
devin-ai-integration[bot] Oct 25, 2026
5a16341
processing: emit processor start marker from base logger creation
devin-ai-integration[bot] Oct 25, 2026
5f33384
test: pin verbose flag in resolved configuration log line
devin-ai-integration[bot] Oct 25, 2026
584e6b3
example: regenerate PersonDtoMapperImpl with builder-based mapping
devin-ai-integration[bot] Oct 25, 2026
6b27c6f
processing: drop unreachable -verbose detection — javac exposes only …
devin-ai-integration[bot] Oct 25, 2026
0e7688c
processing: static processor declarations as CodegenProcessorConfigur…
devin-ai-integration[bot] Oct 25, 2026
afb6105
processing: isFinished defaults to one-shot — first planned round mar…
devin-ai-integration[bot] Oct 25, 2026
8c2e101
processing: rename predictedTypeName to predictedGeneratedTypeName
devin-ai-integration[bot] Oct 25, 2026
3a2fd4d
processing: SPI registration decorates the predicted name directly — …
devin-ai-integration[bot] Oct 25, 2026
fc7ca06
processing: selector declaration via consumer — less builder boilerpl…
devin-ai-integration[bot] Oct 25, 2026
4fa9764
processing: fold onInit into createContext — one init hook fewer, no …
devin-ai-integration[bot] Oct 25, 2026
eb0c172
processing: claimsAnnotations takes the supported set; fail-fast retu…
devin-ai-integration[bot] Oct 25, 2026
0a4b151
processing: supported types derive from the element spec — '*' only w…
devin-ai-integration[bot] Oct 25, 2026
1e6878a
processing: collection/generation phases are framework constants, not…
devin-ai-integration[bot] Oct 25, 2026
7d97195
processing: registration predicts a name list; SPI publish moves to o…
devin-ai-integration[bot] Oct 25, 2026
4578d76
processing: task carries its output package; the driver initializes P…
devin-ai-integration[bot] Oct 25, 2026
e2d4451
processing: driver wraps analyse/map in phase calls — domains name th…
devin-ai-integration[bot] Oct 25, 2026
35db203
processing: afterGenerate is an event, not a step — renamed onTaskGen…
devin-ai-integration[bot] Oct 25, 2026
ab103e7
processing: specification and generation are two sequential loops, no…
devin-ai-integration[bot] Oct 25, 2026
5f7c89e
processing: deferred outputs are pushed onto the context — an event, …
devin-ai-integration[bot] Oct 25, 2026
69f42b6
processing: the logger carries the tag; domain nouns live in domain code
devin-ai-integration[bot] Oct 25, 2026
f4efd83
processing: required source version by name — the graceful-guard prop…
devin-ai-integration[bot] Oct 25, 2026
93ccf4d
processing: plan is the management function — gate and registration l…
devin-ai-integration[bot] Oct 25, 2026
d227a0c
processing: the SPI lifecycle is generic — the domain delegates and k…
devin-ai-integration[bot] Oct 25, 2026
eb3f290
processor: expected log gains the generation-loop header the two loop…
devin-ai-integration[bot] Oct 25, 2026
84a578f
processing: revert SPI split — the lifecycle holder is builder domain…
devin-ai-integration[bot] Oct 25, 2026
b9c3c8d
analysis: findAnnotationAttributeArray — name the array-shaped result
devin-ai-integration[bot] Oct 25, 2026
6721ada
processing: analyse yields a definition list — one task may spawn sev…
devin-ai-integration[bot] Oct 25, 2026
806cb60
processing: one definition maps to exactly one target — mapToTargetSp…
devin-ai-integration[bot] Oct 25, 2026
8376aa1
processing: supported types come from the annotation, not the spec — …
devin-ai-integration[bot] Oct 25, 2026
79d16a2
processing: unsupported-JDK reporting extracted into a helper
devin-ai-integration[bot] Oct 25, 2026
d51abcc
processing: log when the required source-version name is unknown to t…
devin-ai-integration[bot] Oct 25, 2026
1d32eb2
processing: phase names are framework literals at their single use sites
devin-ai-integration[bot] Oct 25, 2026
71d02da
processing: generated units are targets — the domain's noun leaves th…
devin-ai-integration[bot] Oct 25, 2026
566d361
processing: the tag-prefix pattern lives inside the logger; provideLo…
devin-ai-integration[bot] Oct 25, 2026
9f0ffe1
processing: deferred outputs push the target DTO itself; the domain l…
devin-ai-integration[bot] Oct 25, 2026
2a2e8ec
processing: the management function registers task results, not outputs
devin-ai-integration[bot] Oct 25, 2026
a3e82dd
processing: a task's prediction is its result type names
devin-ai-integration[bot] Oct 25, 2026
38ca043
processing: it collects elements, it does not specify them — ElementC…
devin-ai-integration[bot] Oct 25, 2026
7d68150
processing: backend wiring is the domain's business — back to direct …
devin-ai-integration[bot] Oct 25, 2026
a904a1b
tests: the drain error is generic 'target'; the domain's plan-time no…
devin-ai-integration[bot] Oct 25, 2026
13adec5
processing: the per-target carrier resolves the output package — Proc…
devin-ai-integration[bot] Oct 25, 2026
df6ba02
processing: dead PHASE_* constants left over from the literal pass
devin-ai-integration[bot] Oct 26, 2026
40c0479
processing: the whole JDK-gate block moves into verifySupportedJdk
devin-ai-integration[bot] Oct 26, 2026
d3ef8cb
processing: findElements needs no context — the collector signature c…
devin-ai-integration[bot] Oct 26, 2026
3827a42
processing: options come from the declared registry — no second channel
devin-ai-integration[bot] Oct 26, 2026
d658d07
processing: declared options are a set — duplicates cannot be declare…
devin-ai-integration[bot] Oct 26, 2026
ac76e2c
processing: the wired verbose/formatter-profile options are supported…
devin-ai-integration[bot] Oct 26, 2026
aa79d60
processing: the selector's key is a group name — name renamed to grou…
devin-ai-integration[bot] Oct 26, 2026
48877eb
processing: the collection is groups — ElementGroups keyed by selecto…
devin-ai-integration[bot] Oct 26, 2026
10e196d
the constant holds an ElementCollector — ELEMENT_COLLECTOR
devin-ai-integration[bot] Oct 26, 2026
b7b9ab4
processing: PlannedWork → PlannedGeneration — protected so domain cal…
devin-ai-integration[bot] Oct 26, 2026
55cae31
processing: the generated-task callback consumes the whole planned ge…
devin-ai-integration[bot] Oct 26, 2026
cffc6fe
no deferred-target mechanism — the domain generates its last-round ou…
devin-ai-integration[bot] Oct 26, 2026
1086235
processing: a definition knows its target type's name — the contract …
devin-ai-integration[bot] Oct 26, 2026
d61326f
processing: generationEnvironment wires env/logger/tracker/reporter o…
devin-ai-integration[bot] Oct 26, 2026
da69848
processing: formatter factory is a static declaration — base resolves…
devin-ai-integration[bot] Oct 26, 2026
fcf2ab1
processing: metaMarked names what the check is — meta-annotation on t…
devin-ai-integration[bot] Oct 26, 2026
7d23ac9
processing: onRoundStart/onTasksPlanned hooks; in-body extension-poin…
devin-ai-integration[bot] Oct 26, 2026
8b0d6ba
processing: inline codeql dismissal on intentional extension-point si…
devin-ai-integration[bot] Oct 26, 2026
3504a9b
docs: performance report phase names follow the driver's literals
devin-ai-integration[bot] Oct 26, 2026
1b3cf59
processing: javadoc leftovers — stale links, wrong param names, missi…
devin-ai-integration[bot] Oct 26, 2026
fe76011
processing: tag the last untagged driver messages — error via prefixe…
devin-ai-integration[bot] Oct 26, 2026
1c989aa
logging: tag every emitted message inside the logger — drop the tagge…
devin-ai-integration[bot] Oct 26, 2026
3725f42
logging: tag renamed to loggingPrefix — names what it is
devin-ai-integration[bot] Oct 26, 2026
42c85de
logging: prefix sits between the level marker and tree markers
devin-ai-integration[bot] Oct 26, 2026
8cc3655
collector: drop redundant direct-match in matchingAnnotations — Class…
devin-ai-integration[bot] Oct 26, 2026
abb997b
formatter resolver: keep it in the processing package — the codegen m…
devin-ai-integration[bot] Oct 26, 2026
1cc7185
context: generatedPackageName dropped — processingTargetPackage alrea…
devin-ai-integration[bot] Oct 26, 2026
c5961c7
scope resolver: read the generated-types registry off the context at …
devin-ai-integration[bot] Oct 26, 2026
295b605
registration: planned names registered via context.addGeneratedType —…
devin-ai-integration[bot] Oct 26, 2026
77779db
target-package record: javadoc back in the original's shape — clearer…
devin-ai-integration[bot] Oct 26, 2026
21de6f0
tests: formatter-resolver import follows the class back to the proces…
devin-ai-integration[bot] Oct 26, 2026
3860594
tests: pin the complete tagged performance-report layout — timings no…
devin-ai-integration[bot] Oct 26, 2026
fa6473f
docs: warning examples and prefix wording to the real emitted shape
devin-ai-integration[bot] Oct 27, 2026
1acd60a
context: drop the orphaned field comment the generatedPackageName rem…
devin-ai-integration[bot] Oct 27, 2026
31322f8
tests: perf-report pin as a text block — one full compare, normalizat…
devin-ai-integration[bot] Oct 27, 2026
0ff60e3
context: store the current task — ProcessingTargetPackage only re-wra…
devin-ai-integration[bot] Oct 27, 2026
05864fa
context: initProcessingTask -> setCurrentTask — it is called per task…
devin-ai-integration[bot] Oct 27, 2026
ac4f49b
javadoc: re-attach dangling docs — orphan comments removed, codeql ta…
devin-ai-integration[bot] Oct 29, 2026
1a7ed2d
driver: drop the wildcard in onTasksPlanned — the list is already Cod…
devin-ai-integration[bot] Oct 29, 2026
4a6ed4b
driver: rename local logger in createLogger — it shadowed the process…
devin-ai-integration[bot] Oct 29, 2026
f095f57
driver: suppress S112 on analyse/map — extension points cannot enumer…
devin-ai-integration[bot] Oct 29, 2026
338767b
context: suppress S1452 on getCurrentTask — the task's config type va…
devin-ai-integration[bot] Oct 29, 2026
2861494
processor: globalConfig is only used inside createContext — make it a…
devin-ai-integration[bot] Oct 29, 2026
55679da
analyser: List<?> -> List<Object> in findAnnotationAttributeArray ret…
devin-ai-integration[bot] Oct 29, 2026
d8bcff7
test: cover flagged new lines — config defaults, registry null paths,…
devin-ai-integration[bot] Oct 29, 2026
be94808
model: @Override on getTypeName (CodeQL java/missing-override-annotat…
devin-ai-integration[bot] Oct 31, 2026
3b830d5
test: builder created outside assertThrows lambda (Sonar S5778)
devin-ai-integration[bot] Oct 31, 2026
5a9f357
processing: drop trailing codeql comments — not recognized; alerts di…
devin-ai-integration[bot] Oct 31, 2026
5c34636
processing: drop CodegenConfiguration — re-added below as a new file …
devin-ai-integration[bot] Oct 31, 2026
13052a3
processing: restore ProcessingTarget from main — keeps its file history
devin-ai-integration[bot] Oct 31, 2026
46ccbd5
processing: drop CodegenTask — re-created from ProcessingTarget below
devin-ai-integration[bot] Oct 31, 2026
e8e03b1
processing: git mv ProcessingTarget to CodegenTask — CodegenTask is i…
devin-ai-integration[bot] Oct 31, 2026
38037c6
processing: CodegenTask generalizes the per-target state for any code…
devin-ai-integration[bot] Oct 31, 2026
d321dff
processing: add CodegenConfiguration — common strict/verbose contract
devin-ai-integration[bot] Oct 31, 2026
e013723
processing: matchingAnnotations early-out when no metaMarker — guard …
devin-ai-integration[bot] Oct 31, 2026
f023c4f
processing: drop FormatterFactory — SourceFormatterResolver creates i…
devin-ai-integration[bot] Oct 31, 2026
c12da7a
processing: javadoc for the two element-group names
devin-ai-integration[bot] Oct 31, 2026
3b025ce
processing: loggerPrefix is a static declaration on CodegenProcessorC…
devin-ai-integration[bot] Oct 31, 2026
f374caa
processing: Roaster is the default code generator — domain overrides …
devin-ai-integration[bot] Oct 31, 2026
f36ab8e
processing: initGeneratorRegistry — the warmup is an init, not a get
devin-ai-integration[bot] Oct 31, 2026
f7febbd
processing: planTasks locals named after what they hold — annotatedEl…
devin-ai-integration[bot] Oct 31, 2026
bc9af17
processing: hold the annotation attribute array in a named local befo…
devin-ai-integration[bot] Oct 31, 2026
20a882a
processing: gate planning before planTasks — no point planning a roun…
devin-ai-integration[bot] Oct 31, 2026
e721eb5
processing: predictTaskResultTypeNames — name says it is a prediction…
devin-ai-integration[bot] Oct 31, 2026
de894a7
tests/docs: round 2 now logs the planning gate, not the empty collection
devin-ai-integration[bot] Oct 31, 2026
70dd9bf
processing: unset requiredSourceVersion means no JDK gate — domains w…
devin-ai-integration[bot] Oct 31, 2026
9cd9bc9
processing: option registry without wired options no longer NPEs on L…
devin-ai-integration[bot] Oct 31, 2026
1afb4ac
processing: minimal codegen processor test — one file shows the domai…
devin-ai-integration[bot] Oct 31, 2026
d42ce12
processing: getGeneratorRegistry renamed initGeneratorRegistry — the …
devin-ai-integration[bot] Oct 31, 2026
9f296bf
processing: ElementGroups.all() — collect without caring about group …
devin-ai-integration[bot] Oct 31, 2026
67ac07d
processing: selector(annotationTypes…) convenience on the collector b…
devin-ai-integration[bot] Oct 31, 2026
75d2681
processing: CodegenConfiguration.DEFAULT — the framework ships the pl…
devin-ai-integration[bot] Oct 31, 2026
461319c
processing: CodegenTask.builder() — reportingElement defaults to the …
devin-ai-integration[bot] Oct 31, 2026
fc6b7ed
test: minimal processor reworked on the framework conveniences — sele…
devin-ai-integration[bot] Oct 31, 2026
1a4a9bb
test: guard non-type task elements instead of casting — a domain plan…
devin-ai-integration[bot] Oct 31, 2026
333f18b
test: pin the whole generated PersonBuilder as one expected textblock
devin-ai-integration[bot] Oct 31, 2026
22391b7
test: reuse ctx.getPackageName for builder package extraction
devin-ai-integration[bot] Oct 31, 2026
5918ac7
test: use Strings.CI.removeStart for setter prefix like elsewhere
devin-ai-integration[bot] Oct 31, 2026
8eb1f2d
test: assertThrows with single-call lambda (Sonar S5778)
devin-ai-integration[bot] Oct 31, 2026
57b5170
test: add missing license header to MinimalCodegenProcessorTest
devin-ai-integration[bot] Oct 31, 2026
a54c992
test: literal tabs in expected textblock, closing delimiter at column 0
devin-ai-integration[bot] Oct 31, 2026
84789b6
test: full compare via assertNormalizedEquals, normal indentation
devin-ai-integration[bot] Oct 31, 2026
4e19074
test: de-flake classMetrics ordering asserts (timing-dependent positi…
devin-ai-integration[bot] Oct 31, 2026
b89d5ac
Update DEBUG_LOGGING example to real emitted messages
devin-ai-integration[bot] Nov 1, 2026
3b45063
Update CONTRIBUTING verbose log excerpt to real emitted messages
devin-ai-integration[bot] Nov 1, 2026
a9d4dfd
Make predictTaskResultTypeNames a default-empty hook
devin-ai-integration[bot] Nov 1, 2026
4ca396a
Make debug log reflect reality: real file path, per-generator contrib…
devin-ai-integration[bot] Nov 1, 2026
c51fa0b
Rewrite doc log excerpts as verbatim capture of a real verbose run
devin-ai-integration[bot] Nov 1, 2026
4aa5d14
Inline logger-prefix resolution: prefix is configuration, not an exte…
devin-ai-integration[bot] Nov 1, 2026
b3a8664
Close the 'Generating targets' operation after onTaskGenerated: summa…
devin-ai-integration[bot] Nov 1, 2026
823c489
Show full Jackson module generation tail in debug log example
devin-ai-integration[bot] Nov 1, 2026
de06203
Log before creating JavaFileObject so a filer failure has a preceding…
devin-ai-integration[bot] Nov 1, 2026
dd9c3c8
Skip codegen phase logging when the phase has nothing to emit
devin-ai-integration[bot] Nov 1, 2026
2e37f03
CodegenTask builder: preassign reportingElement default and require n…
devin-ai-integration[bot] Nov 1, 2026
41103c8
Require groupName when building an ElementSelector
devin-ai-integration[bot] Nov 1, 2026
5d69428
Normalize trailing spaces in expected report and extract metric asser…
devin-ai-integration[bot] Nov 1, 2026
8734293
Let the post-generation summary close the generation scope
devin-ai-integration[bot] Nov 1, 2026
d002851
Emit the generation summary as a child line inside the open scope
devin-ai-integration[bot] Nov 1, 2026
ef06f39
Log why a round or element generates nothing
devin-ai-integration[bot] Nov 1, 2026
9a1d005
Remove unused private test helpers (java:S1144)
devin-ai-integration[bot] Nov 1, 2026
583b010
Extract per-task specification to drop process() cognitive complexity…
devin-ai-integration[bot] Nov 1, 2026
9e91d2f
Use guard clauses to skip empty codegen phases
devin-ai-integration[bot] Nov 1, 2026
0c518af
Restore metric assert helpers and wire them into the JSON tests
devin-ai-integration[bot] Nov 1, 2026
8a70563
Default reportingElement to the task element in build()
devin-ai-integration[bot] Nov 1, 2026
5af51ed
Drop duplicate builder-name line before definition-extracted close
devin-ai-integration[bot] Nov 1, 2026
6a56de3
Close the generation scope with the builder summary line
devin-ai-integration[bot] Nov 1, 2026
25beded
Log enhancer count also when none applied
devin-ai-integration[bot] Nov 1, 2026
afc244e
Default task configuration to CodegenConfiguration.DEFAULT
devin-ai-integration[bot] Nov 1, 2026
6e8acf2
Default task configuration in build(), checked against the domain type
devin-ai-integration[bot] Nov 1, 2026
36b97bb
processing: finish the round on an empty plan — out-of-scope beans mu…
devin-ai-integration[bot] Nov 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/CONFIGURATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ processing. A summary report is logged to the compiler output at the end of proc

**When enabled**: A hierarchical performance report is printed to the compiler log, including:
- Total processing time and average time per class
- Phase breakdown (Element Collection, Configuration Resolution, Builder Definition Extraction, DTO Mapping, Code Generation)
- Phase breakdown (Element Collection, Configuration Resolution, Analysis, Target Mapping, Code Generation)
- Top 20 slowest classes with field and collection counts
- Top 5 slowest MethodGenerators and BuilderEnhancers

Expand Down
44 changes: 32 additions & 12 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,19 +242,39 @@ For complete documentation, see [DEBUG_LOGGING.md](DEBUG_LOGGING.md).
[DEBUG] simple-builders: Processing round started.
[DEBUG] simple-builders: Found 1 annotated elements.
[DEBUG] simple-builders: Found 0 type(s) for generation with @SimpleBuilderFor.
[DEBUG] simple-builders: Processing element: Project
[DEBUG] simple-builders: ├─ Resolving configuration for element: Project
[DEBUG] simple-builders: │ └─ Resulting configuration resolved: BuilderConfiguration[builderSuffix=Builder,...]
[DEBUG] simple-builders: 1 of 1 annotated element(s) are inside the builderGenerationPackages scope.
[DEBUG] Processing element: Project
[DEBUG] ├─ Extracting builder definition from: test.Project
[DEBUG] │ ├─ Builder will be generated as: test.ProjectBuilder
[DEBUG] │ ├─ Analysing setters for finding fields
[DEBUG] │ │ ├─ Analyzing method: setName(java.lang.String)
[DEBUG] │ │ │ └─ Adding field: name (type: java.lang.String)
[DEBUG] │ └─ Processed 1 possible setters: added 1 fields, skipped 0
[DEBUG] ├─ Code generation for builder: ProjectBuilder
[DEBUG] │ ├─ Adding Methods for 4 candidates
[DEBUG] │ │ └─ 4 Methods added
[DEBUG] │ └─ Successfully generated builder: ProjectBuilder
simple-builders: Successfully generated 1 builder(s) in this processing round
[DEBUG] simple-builders: Processing element: Project
[DEBUG] simple-builders: ├─ Extracting builder definition from: test.Project
[DEBUG] simple-builders: │ ├─ Builder will be generated as: test.ProjectBuilder
[DEBUG] simple-builders: │ ├─ Analysing setters for finding fields
[DEBUG] simple-builders: │ │ ├─ Analyzing method: setName(java.lang.String)
[DEBUG] simple-builders: │ │ │ ├─ Processing method generators
[DEBUG] simple-builders: │ │ │ │ ├─ Applied: BasicSetterGenerator (priority: 100): +1 methods
[DEBUG] simple-builders: │ │ │ │ └─ Generated 6 methods
[DEBUG] simple-builders: │ │ │ └─ Adding field: name (type: java.lang.String)
[DEBUG] simple-builders: │ │ └─ Processed 1 possible setters: added 1 fields, skipped 0
[DEBUG] simple-builders: │ ├─ Processing class based enhancer
[DEBUG] simple-builders: │ │ ├─ Applied: CoreMethodsEnhancer (priority: 100): +3 methods
[DEBUG] simple-builders: │ │ ├─ Applied: ConstructorEnhancer (priority: 95): +2 constructors
[DEBUG] simple-builders: │ │ └─ Applied 8 builder enhancers
[DEBUG] simple-builders: │ ├─ Finalizing builder definition
[DEBUG] simple-builders: │ │ └─ Finalized: 1 class fields, 4 builder-level methods, 2 constructors
[DEBUG] simple-builders: │ └─ Builder definition extracted: ProjectBuilder
[DEBUG] simple-builders: Generating targets for: Project
[DEBUG] simple-builders: ├─ Code generation for class: ProjectBuilder
[DEBUG] simple-builders: │ ├─ Generating 1 fields
[DEBUG] simple-builders: │ │ └─ Fields added: 1 fields
[DEBUG] simple-builders: │ ├─ Generating 4 method candidates
[DEBUG] simple-builders: │ │ ├─ Resolved to 4 methods after conflict resolution
[DEBUG] simple-builders: │ │ └─ Methods added: 4
[DEBUG] simple-builders: │ ├─ Creating JavaFileObject: test.ProjectBuilder
[DEBUG] simple-builders: │ ├─ Writing class to file: /SOURCE_OUTPUT/test/ProjectBuilder.java
[DEBUG] simple-builders: │ ├─ Successfully generated class: ProjectBuilder
[DEBUG] simple-builders: │ └─ Generated builder with 1 fields and 4 methods for ProjectBuilder
simple-builders: Successfully generated 1 target(s) in this processing round
=============================================

========== Generated Source Files ==========
Expand Down
147 changes: 102 additions & 45 deletions docs/DEBUG_LOGGING.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,67 +73,124 @@ The Simple Builders processor provides **conditional hierarchical logging** to b
### **When Debug Mode is DISABLED (Default):**
- INFO and WARNING messages appear flat without indentation
- Suitable for production systems where log noise should be minimized
- Example: `simple-builders: Successfully generated 3 builder(s) in this processing round`
- Example: `simple-builders: Successfully generated 3 target(s) in this processing round`

### **When Debug Mode is ENABLED (-Averbose=true):**
- INFO and WARNING messages have no extra prefix, DEBUG messages are posted on `[INFO]` chanel so they have the prefix `[INFO] [DEBUG]`
- Every message carries the `simple-builders:` logger prefix; DEBUG messages are posted on the `[INFO]` channel so they show as `[INFO] [DEBUG]`
- Provides full visibility into the processing hierarchy
- Example: `[INFO] │ └─ simple-builders: Successfully generated 3 builder(s) in this processing round`
- Example: `[WARNING] │ │ ├─ Builder field conflict: field 'name'...`
- Example: `[INFO] [DEBUG] │ │ │ └─ Processing method: setName`
- Example: `[INFO] simple-builders: │ └─ Successfully generated 3 target(s) in this processing round`
- Example: `[WARNING] simple-builders: │ │ ├─ Builder field conflict: field 'name'...`
- Example: `[INFO] [DEBUG] simple-builders: │ │ │ └─ Processing method: setName`
- All message types align vertically despite different prefix lengths

This approach ensures clean production logs while maintaining full debugging capabilities when needed.

## Example Debug Output

When debug logging is enabled, you'll see detailed output with visual separators:
The following is a verbatim excerpt of a real run (`mvn -pl example clean compile -Dsimplebuilder.verbose=true` on the `example` module, slightly truncated where marked with `…`). It follows `SponsorDto`, the smallest annotated class (one field). Every annotated element produces the same step structure — extraction, enhancer pass, finalize, code generation:

```
[INFO] [DEBUG] simple-builders: Starting BuilderProcessor...
[INFO] [DEBUG] simple-builders: Loaded global configuration from compiler arguments: BuilderConfiguration[verbose=ENABLED]
[INFO] [DEBUG] simple-builders: Initializing generator registry
[INFO] [DEBUG] simple-builders: ├─ Loaded 16 method generators and 10 builder enhancers total
[INFO] [DEBUG] simple-builders: └─ Initialized GeneratorRegistry with 16 method generators and 10 builder enhancers
[INFO] simple-builders: PROCESSING ROUND START
[INFO] [DEBUG] simple-builders: Processing round started.
[INFO] [DEBUG] simple-builders: Found 3 annotated elements.
[INFO] [DEBUG] simple-builders: Found 0 type(s) for generation with @SimpleBuilderFor.
[INFO] [DEBUG] simple-builders: 3 of 3 annotated element(s) are inside the builderGenerationPackages scope.
[INFO] [DEBUG] Processing element: PersonDto
[INFO] [DEBUG] ├─ Extracting builder definition from: org.example.PersonDto
[INFO] [DEBUG] │ ├─ Builder will be generated as: org.example.PersonDtoBuilder
[INFO] [DEBUG] │ ├─ Analysing setters for finding fields
[INFO] [DEBUG] │ │ ├─ Analyzing method: setName(java.lang.String)
[INFO] [DEBUG] │ │ │ └─ Adding field: name (type: java.lang.String)
[INFO] [DEBUG] │ │ ├─ Analyzing method: setAge(int)
[INFO] [DEBUG] │ │ │ └─ Adding field: age (type: int)
[INFO] [DEBUG] │ └─ Processed 2 possible setters: added 2 fields, skipped 0
[INFO] [DEBUG] ├─ Code generation for builder: PersonDtoBuilder
[INFO] [DEBUG] │ ├─ Class builder created
[INFO] [DEBUG] │ ├─ Generating 0 constructor fields and 2 setter fields
[INFO] [DEBUG] │ │ └─ Fields added: 2 fields
[INFO] [DEBUG] │ ├─ Adding Methods for 4 candidates
[INFO] [DEBUG] │ │ └─ 4 Methods added
[INFO] [DEBUG] │ ├─ Using JDT source formatting with Eclipse formatter profile 'eclipse-java-format.xml'.
[INFO] [DEBUG] │ ├─ Writing builder class to file: org.example.PersonDtoBuilder
[INFO] [DEBUG] │ └─ Successfully generated builder: PersonDtoBuilder
[INFO] [DEBUG] Processing element: OrderDto
[INFO] [DEBUG] ├─ Extracting builder definition from: org.example.OrderDto
[INFO] [DEBUG] │ └─ Builder will be generated as: org.example.OrderDtoBuilder
[INFO] [DEBUG] │ └─ Processed 1 possible setters: added 1 fields, skipped 0
[INFO] [DEBUG] ├─ Code generation for builder: OrderDtoBuilder
[INFO] [DEBUG] │ └─ Successfully generated builder: OrderDtoBuilder
[INFO] [DEBUG] Processing element: CustomerDto (with conflicts)
[INFO] [DEBUG] ├─ Extracting builder definition from: org.example.CustomerDto
[INFO] [DEBUG] │ └─ Builder will be generated as: org.example.CustomerDtoBuilder
[INFO] [DEBUG] │ └─ Processed 2 possible setters: added 2 fields, skipped 0
[WARNING] │ │ └─ Builder field conflict: field 'name' (type Optional) renamed to 'nameOptional' to avoid conflict
[INFO] [DEBUG] ├─ Code generation for builder: CustomerDtoBuilder
[INFO] [DEBUG] │ └─ Successfully generated builder: CustomerDtoBuilder
[INFO] simple-builders: Successfully generated 3 builder(s) in this processing round
[INFO] [DEBUG] simple-builders: Found 12 annotated elements.
[INFO] [DEBUG] simple-builders: Found 1 type(s) for generation with @SimpleBuilderFor.
[INFO] [DEBUG] simple-builders: Processing element: SponsorDto
[INFO] [DEBUG] simple-builders: ├─ Resolving configuration for element: SponsorDto
[INFO] [DEBUG] simple-builders: │ ├─ Built-in template @SimpleBuilder found in DIRECT scope
[INFO] [DEBUG] simple-builders: │ └─ Resulting configuration resolved: BuilderConfiguration[generateFieldSupplier=ENABLED,…,builderSuffix=Builder,formattingMode=jdt,strict=DISABLED,verbose=ENABLED]
… (the same configuration-resolution steps repeat for each of the 12 elements)
[INFO] [DEBUG] simple-builders: 12 of 12 annotated element(s) are inside the builderGenerationPackages scope.
[INFO] [DEBUG] simple-builders: ├─ Processing element: SponsorDto
[INFO] [DEBUG] simple-builders: │ ├─ Extracting builder definition from: org.javahelpers.simple.builders.example.SponsorDto
[INFO] [DEBUG] simple-builders: │ │ ├─ Builder will be generated as: org.javahelpers.simple.builders.example.SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ ├─ Analysing setters for finding fields
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Analyzing method: setName(java.lang.String)
[INFO] [DEBUG] simple-builders: │ │ │ │ ├─ Processing method generators
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: BasicSetterGenerator (priority: 100): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: StringFormatHelperGenerator (priority: 80): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: SupplierMethodGenerator (priority: 60): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: StringValidationGenerator (priority: 60): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: StringBuilderConsumerGenerator (priority: 45): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ ├─ Applied: UpdateHelperGenerator (priority: 31): +1 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ │ └─ Generated 6 methods
[INFO] [DEBUG] simple-builders: │ │ │ │ └─ Adding field: name (type: java.lang.String)
[INFO] [DEBUG] simple-builders: │ │ │ └─ Processed 1 possible setters: added 1 fields, skipped 0
[INFO] [DEBUG] simple-builders: │ │ ├─ Processing class based enhancer
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: GeneratedAnnotationEnhancer (priority: 120): +1 annotations
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Added @BuilderImplementation annotation to builder SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: BuilderImplementationAnnotationEnhancer (priority: 115): +1 annotations
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: CoreMethodsEnhancer (priority: 100): +3 methods
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: ConstructorEnhancer (priority: 95): +2 constructors
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: WithInterfaceEnhancer (priority: 95): +1 nested types
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: InterfaceEnhancer (priority: 90): +1 interfaces
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Added conditional methods to builder SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: ConditionalEnhancer (priority: 80): +2 methods
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Applied: ClassJavaDocEnhancer (priority: 10): javadoc added
[INFO] [DEBUG] simple-builders: │ │ │ └─ Applied 8 builder enhancers
[INFO] [DEBUG] simple-builders: │ │ ├─ Finalizing builder definition
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Resolving method conflicts
[INFO] [DEBUG] simple-builders: │ │ │ │ └─ Resolved: 11 signatures, 0 conflicts, 0 methods removed
[INFO] [DEBUG] simple-builders: │ │ │ └─ Finalized: 1 class fields, 5 builder-level methods, 2 constructors
[INFO] [DEBUG] simple-builders: │ │ └─ Builder definition extracted: SponsorDtoBuilder
… (the same extraction steps repeat for each remaining element)
[INFO] [DEBUG] simple-builders: ├─ Generating targets for: SponsorDto
[INFO] [DEBUG] simple-builders: │ ├─ Code generation for class: SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ ├─ JavaClassSource created
[INFO] [DEBUG] simple-builders: │ │ ├─ Class metadata added
[INFO] [DEBUG] simple-builders: │ │ ├─ Generating 1 fields
[INFO] [DEBUG] simple-builders: │ │ │ └─ Fields added: 1 fields
[INFO] [DEBUG] simple-builders: │ │ ├─ Generating 2 constructors
[INFO] [DEBUG] simple-builders: │ │ │ └─ Constructors added: 2
[INFO] [DEBUG] simple-builders: │ │ ├─ Generating 11 method candidates
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Resolved to 11 methods after conflict resolution
[INFO] [DEBUG] simple-builders: │ │ │ └─ Methods added: 11
[INFO] [DEBUG] simple-builders: │ │ ├─ Generating 1 nested type(s)
[INFO] [DEBUG] simple-builders: │ │ │ ├─ Generated nested type: With
[INFO] [DEBUG] simple-builders: │ │ │ └─ Nested types added
[INFO] [DEBUG] simple-builders: │ │ ├─ Class-level annotations added
[INFO] [DEBUG] simple-builders: │ │ ├─ Creating JavaFileObject: org.javahelpers.simple.builders.example.SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ ├─ Writing class to file: …/example/generated-example-builder/org/javahelpers/simple/builders/example/SponsorDtoBuilder.java
[INFO] [DEBUG] simple-builders: │ │ ├─ Successfully generated class: SponsorDtoBuilder
[INFO] [DEBUG] simple-builders: │ │ └─ Generated builder with 1 fields and 11 methods for SponsorDtoBuilder
… (the same code-generation steps repeat for each remaining element; elements whose
configuration enables the Jackson module additionally emit a registration line inside the
same generation scope:)
[INFO] [DEBUG] simple-builders: │ │ ├─ Registered JacksonIntegrationDtoBuilder for Jackson module in package 'org.javahelpers.simple.builders.example'
[INFO] simple-builders: Successfully generated 12 target(s) in this processing round
[INFO] simple-builders: PROCESSING ROUND START
[INFO] [DEBUG] simple-builders: Processing round started.
[INFO] [DEBUG] simple-builders: Found 0 annotated elements.
[INFO] [DEBUG] simple-builders: Found 0 type(s) for generation with @SimpleBuilderFor.
[INFO] [DEBUG] simple-builders: 0 of 0 annotated element(s) are inside the builderGenerationPackages scope.
[INFO] [DEBUG] simple-builders: No matching elements collected — skipping planning for this round.
… (empty rounds repeat until processing finishes)
[INFO] simple-builders: Processing OVER. JacksonModuleEnabled: true, Packages: 1
[INFO] simple-builders: Generating Jackson module in package 'org.javahelpers.simple.builders.example'
[INFO] [DEBUG] simple-builders: Code generation for class: SimpleBuildersJacksonModule
Comment thread
AndreasIgel marked this conversation as resolved.
Resolved
[INFO] [DEBUG] simple-builders: ├─ JavaClassSource created
[INFO] [DEBUG] simple-builders: ├─ Class metadata added
[INFO] [DEBUG] simple-builders: ├─ Generating 1 constructors
[INFO] [DEBUG] simple-builders: │ └─ Constructors added: 1
[INFO] [DEBUG] simple-builders: ├─ Generating 1 nested type(s)
[INFO] [DEBUG] simple-builders: │ ├─ Generated nested type: JacksonIntegrationDtoMixin
[INFO] [DEBUG] simple-builders: │ └─ Nested types added
[INFO] [DEBUG] simple-builders: ├─ Creating JavaFileObject: org.javahelpers.simple.builders.example.SimpleBuildersJacksonModule
[WARNING] File for type 'org.javahelpers.simple.builders.example.SimpleBuildersJacksonModule' created in the last round will not be subject to annotation processing.
[INFO] [DEBUG] simple-builders: ├─ Writing class to file: …/example/generated-example-builder/org/javahelpers/simple/builders/example/SimpleBuildersJacksonModule.java
[INFO] [DEBUG] simple-builders: ├─ Successfully generated class: SimpleBuildersJacksonModule
```

Notes on individual lines:

- `Applied: <generator/enhancer> (priority: N): +M <contribution>` — logged **after** each generator/enhancer ran, with what it actually contributed (methods, constructors, nested types, annotations, interfaces, or javadoc). An enhancer that adds nothing measurable prints just `Applied: <name> (priority: N)` with no suffix.
- `Writing class to file:` — the real path of the generated source file, resolved via the filer's `JavaFileObject.toUri()`.
- `Registered <Builder> for Jackson module in package '<pkg>'` — emitted inside the class's generation scope by the Jackson module generator, only when the builder actually registered for module generation (i.e. `generateJacksonModule` enabled on that element's configuration and Jackson on the classpath). It is not a generation step of its own.
- `Generated builder with N fields and M methods for <Builder>` — the domain's summary line, emitted as the closing line (`└─`) of the `Code generation for class` scope, which stays open until the post-generation step ran.
- A round or element that generates nothing logs why, for error analysis: `No matching elements collected — skipping planning for this round.`, `Processing is already finished — skipping planning for this round.`, `Planning produced no tasks — nothing to generate this round.`, or per element `Analysis produced no targets for <Element>`.
- Code-generation phases with nothing to emit log nothing — a class without fields, methods or nested types (like `SimpleBuildersJacksonModule`, which only has a constructor and a mixin) produces no `Generating 0 …` / `added: 0` noise.

**Note**: Debug messages are prefixed with `[DEBUG]` and use `Diagnostic.Kind.OTHER` which appears as `[INFO]` in Maven output.

## Normal Output (Without Debug)
Expand All @@ -142,7 +199,7 @@ Without debug logging enabled, you only see the INFO-level messages:

```
[INFO] simple-builders: PROCESSING ROUND START
[INFO] simple-builders: Successfully generated 3 builder(s) in this processing round
[INFO] simple-builders: Successfully generated 3 target(s) in this processing round
```

## Troubleshooting
Expand Down
Loading
Loading