Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@
package org.javahelpers.simple.builders.processor;

import static org.javahelpers.simple.builders.processor.processing.BuilderDefinitionCreator.extractFromElement;
import static org.javahelpers.simple.builders.processor.processing.logging.PerformanceTracker.PHASE_BUILDER_DEFINITION_EXTRACTION;
import static org.javahelpers.simple.builders.processor.processing.logging.PerformanceTracker.PHASE_CODE_GENERATION;
import static org.javahelpers.simple.builders.processor.processing.logging.PerformanceTracker.PHASE_CONFIGURATION_RESOLUTION;
import static org.javahelpers.simple.builders.processor.processing.logging.PerformanceTracker.PHASE_DTO_MAPPING;
import static org.javahelpers.simple.builders.processor.processing.logging.PerformanceTracker.PHASE_ELEMENT_COLLECTION;
import static org.javahelpers.simple.builders.processor.processing.ProcessingPhases.PHASE_BUILDER_DEFINITION_EXTRACTION;
import static org.javahelpers.simple.builders.processor.processing.ProcessingPhases.PHASE_CODE_GENERATION;
import static org.javahelpers.simple.builders.processor.processing.ProcessingPhases.PHASE_CONFIGURATION_RESOLUTION;
import static org.javahelpers.simple.builders.processor.processing.ProcessingPhases.PHASE_DTO_MAPPING;
import static org.javahelpers.simple.builders.processor.processing.ProcessingPhases.PHASE_ELEMENT_COLLECTION;

import com.google.auto.service.AutoService;
import java.util.ArrayList;
Expand Down Expand Up @@ -63,6 +63,8 @@
import org.javahelpers.simple.builders.processor.analysis.BuilderScopeResolver;
import org.javahelpers.simple.builders.processor.analysis.JavaLangAnalyser;
import org.javahelpers.simple.builders.processor.analysis.JavaLangMapper;
import org.javahelpers.simple.builders.processor.classgen.ClassCodeGenerator;
import org.javahelpers.simple.builders.processor.classgen.GenerationEnvironment;
import org.javahelpers.simple.builders.processor.classgen.roaster.RoasterCodeGenerator;
import org.javahelpers.simple.builders.processor.exceptions.BuilderException;
import org.javahelpers.simple.builders.processor.generators.integration.JacksonModuleGenerator;
Expand Down Expand Up @@ -95,25 +97,36 @@ public class BuilderProcessor extends AbstractProcessor {

private ProcessingContext context;
private ProcessingLogger logger;
private RoasterCodeGenerator codeGenerator;
private ClassCodeGenerator codeGenerator;
private JacksonModuleGenerator jacksonModuleGenerator;
private boolean supportedJdk = true;

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.logger = new ProcessingLogger(processingEnv);
logger.debug("Starting BuilderProcessor...");

// Read global configuration from compiler arguments
CompilerArgumentsReader reader = new CompilerArgumentsReader(processingEnv);
BuilderConfiguration globalConfig = reader.readBuilderConfiguration(logger);
this.logger =
reader.readBooleanValue(CompilerArgumentsEnum.VERBOSE)
? ProcessingLogger.verbose(processingEnv)
: new ProcessingLogger(processingEnv);
logger.debug("Starting BuilderProcessor...");

BuilderConfiguration globalConfig =
BuilderConfigurationReader.readBuilderConfiguration(reader, logger);
logger.debug("Loaded global configuration from compiler arguments: %s", globalConfig);

SimpleBuildersSpiIntegration.initCompilation(processingEnv.getElementUtils());

this.context = new ProcessingContext(logger, globalConfig, processingEnv);
this.codeGenerator = new RoasterCodeGenerator(context, processingEnv);
this.codeGenerator =
new RoasterCodeGenerator(
new GenerationEnvironment(
processingEnv,
logger,
context.getPerformanceTracker(),
context::reportBasedOnStrictMode),
context::createSourceFormatter);
this.jacksonModuleGenerator = new JacksonModuleGenerator(processingEnv, logger, globalConfig);

// Initialize GeneratorRegistry once during processor initialization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Strings;
import org.javahelpers.simple.builders.core.annotations.SimpleBuilderConstructor;
import org.javahelpers.simple.builders.processor.model.type.TypeName;
import org.javahelpers.simple.builders.processor.processing.ProcessingContext;

Expand Down Expand Up @@ -847,24 +846,28 @@ public static Optional<ExecutableElement> findSetterForField(

/**
* Determines which constructor to use for builder initialization. Prioritizes constructors
* annotated with {@link SimpleBuilderConstructor}. If none is annotated, selects the constructor
* annotated with the given constructor annotation. If none is annotated, selects the constructor
* with the highest number of parameters. Returns empty if no constructor has parameters (i.e.,
* only default constructor or none found).
*
* @param annotatedType the type element to search for constructors
* @param constructorAnnotation the marker annotation selecting a constructor explicitly; may be
* {@code null} to skip the annotation check
* @param context the processing context providing access to elements and types utilities
* @return Optional containing the selected constructor, or empty if none suitable
*/
public static Optional<ExecutableElement> findConstructorForBuilder(
TypeElement annotatedType, ProcessingContext context) {
TypeElement annotatedType,
Class<? extends Annotation> constructorAnnotation,
ProcessingContext context) {
List<ExecutableElement> ctors =
ElementFilter.constructorsIn(context.getAllMembers(annotatedType)).stream()
.filter(context::isMemberAccessibleFromBuilderPackage)
.toList();

// First, check if any constructor is annotated with @SimpleBuilderConstructor
// First, check if any constructor is annotated with the constructor annotation
for (ExecutableElement ctor : ctors) {
if (ctor.getAnnotation(SimpleBuilderConstructor.class) != null) {
if (constructorAnnotation != null && ctor.getAnnotation(constructorAnnotation) != null) {
return Optional.of(ctor);
}
}
Expand Down
Loading
Loading