Skip to content
Merged
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 @@ -556,12 +556,14 @@ private void configureMethod(

private void addParameter(
MethodSource<?> method, MethodParameterDto paramDto, boolean lastParameter) {
String parameterType =
lastParameter && paramDto.getParameterType() instanceof TypeNameArray arrayType
? mapType(arrayType.getTypeOfArray())
: mapType(paramDto.getParameterType());
ParameterSource<?> parameter = method.addParameter(parameterType, paramDto.getParameterName());
if (lastParameter && paramDto.getParameterType() instanceof TypeNameArray) {
boolean varArgs = lastParameter && paramDto.getParameterType() instanceof TypeNameArray;
TypeName parameterType =
varArgs
? ((TypeNameArray) paramDto.getParameterType()).getTypeOfArray()
: paramDto.getParameterType();
ParameterSource<?> parameter =
method.addParameter(mapType(parameterType), paramDto.getParameterName());
if (varArgs) {
parameter.setVarArgs(true);
}
applyAnnotations(parameter, paramDto.getAnnotations());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,61 +45,17 @@ class ConfigurationProcessingTest {
* <li>Add the parameter to BuilderConfiguration record
* <li>Add builder methods in BuilderConfiguration.Builder
* <li>Update DEFAULT configuration
* <li>Update this test to include the new option
* <li>Update these tests to include the new option
* </ol>
*/
@Test
void allConfigurationOptions_MustBeSettableViaBuilder() {
// This test will fail to compile if any builder method is missing
BuilderConfiguration config =
BuilderConfiguration.builder()
// Field setter generation options
.generateSupplier(OptionState.ENABLED)
.generateConsumer(OptionState.ENABLED)
.generateBuilderConsumer(OptionState.ENABLED)
// Conditional logic
.generateConditionalLogic(OptionState.ENABLED)
// Access control
.builderAccess(AccessModifier.PACKAGE_PRIVATE)
.builderConstructorAccess(AccessModifier.PRIVATE)
.methodAccess(AccessModifier.PACKAGE_PRIVATE)
// Helper method generation
.generateVarArgsHelpers(OptionState.ENABLED)
.generateStringFormatHelpers(OptionState.ENABLED)
.generateUnboxedOptional(OptionState.ENABLED)
.copyTypeAnnotations(OptionState.ENABLED)
// Collection builder options
.usingArrayListBuilder(OptionState.ENABLED)
.usingArrayListBuilderWithElementBuilders(OptionState.ENABLED)
.usingHashSetBuilder(OptionState.ENABLED)
.usingHashSetBuilderWithElementBuilders(OptionState.ENABLED)
.usingHashMapBuilder(OptionState.ENABLED)
// Annotations
.usingGeneratedAnnotation(OptionState.ENABLED)
.usingBuilderImplementationAnnotation(OptionState.ENABLED)
// Integration
.implementsBuilderBase(OptionState.ENABLED)
.generateWithInterface(OptionState.ENABLED)
.usingJacksonDeserializerAnnotation(OptionState.ENABLED)
.generateJacksonModule(OptionState.ENABLED)
// Documentation
.generateJavaDoc(OptionState.ENABLED)
// Naming
.builderSuffix("Builder")
.setterSuffix("")
// Formatting
.formattingMode("lightweight")
.build();

// Verify all options are accessible (this will fail to compile if accessors are missing)
BuilderConfiguration config = buildFullyConfigured();
assertNotNull(config);
assertEquals(OptionState.ENABLED, config.generateFieldSupplier());
assertEquals(OptionState.ENABLED, config.generateFieldConsumer());
assertEquals(OptionState.ENABLED, config.generateBuilderConsumer());
assertEquals(OptionState.ENABLED, config.generateConditionalHelper());
assertEquals(AccessModifier.PACKAGE_PRIVATE, config.getBuilderAccess());
assertEquals(AccessModifier.PRIVATE, config.getBuilderConstructorAccess());
assertEquals(AccessModifier.PACKAGE_PRIVATE, config.getMethodAccess());
assertEquals(OptionState.ENABLED, config.generateVarArgsHelpers());
assertEquals(OptionState.ENABLED, config.generateStringFormatHelpers());
assertEquals(OptionState.ENABLED, config.generateUnboxedOptional());
Expand All @@ -116,11 +72,61 @@ void allConfigurationOptions_MustBeSettableViaBuilder() {
assertEquals(OptionState.ENABLED, config.usingJacksonDeserializerAnnotation());
assertEquals(OptionState.ENABLED, config.generateJacksonModule());
assertEquals(OptionState.ENABLED, config.generateJavaDoc());
}

@Test
void allConfigurationOptions_AccessNamingAndFormatting_MustBeReadable() {
BuilderConfiguration config = buildFullyConfigured();

assertEquals(AccessModifier.PACKAGE_PRIVATE, config.getBuilderAccess());
assertEquals(AccessModifier.PRIVATE, config.getBuilderConstructorAccess());
assertEquals(AccessModifier.PACKAGE_PRIVATE, config.getMethodAccess());
assertEquals("Builder", config.getBuilderSuffix());
assertEquals("", config.getSetterSuffix());
assertEquals("lightweight", config.formattingMode());
}

private static BuilderConfiguration buildFullyConfigured() {
return BuilderConfiguration.builder()
// Field setter generation options
.generateSupplier(OptionState.ENABLED)
.generateConsumer(OptionState.ENABLED)
.generateBuilderConsumer(OptionState.ENABLED)
// Conditional logic
.generateConditionalLogic(OptionState.ENABLED)
// Access control
.builderAccess(AccessModifier.PACKAGE_PRIVATE)
.builderConstructorAccess(AccessModifier.PRIVATE)
.methodAccess(AccessModifier.PACKAGE_PRIVATE)
// Helper method generation
.generateVarArgsHelpers(OptionState.ENABLED)
.generateStringFormatHelpers(OptionState.ENABLED)
.generateUnboxedOptional(OptionState.ENABLED)
.copyTypeAnnotations(OptionState.ENABLED)
// Collection builder options
.usingArrayListBuilder(OptionState.ENABLED)
.usingArrayListBuilderWithElementBuilders(OptionState.ENABLED)
.usingHashSetBuilder(OptionState.ENABLED)
.usingHashSetBuilderWithElementBuilders(OptionState.ENABLED)
.usingHashMapBuilder(OptionState.ENABLED)
// Annotations
.usingGeneratedAnnotation(OptionState.ENABLED)
.usingBuilderImplementationAnnotation(OptionState.ENABLED)
// Integration
.implementsBuilderBase(OptionState.ENABLED)
.generateWithInterface(OptionState.ENABLED)
.usingJacksonDeserializerAnnotation(OptionState.ENABLED)
.generateJacksonModule(OptionState.ENABLED)
// Documentation
.generateJavaDoc(OptionState.ENABLED)
// Naming
.builderSuffix("Builder")
.setterSuffix("")
// Formatting
.formattingMode("lightweight")
.build();
}

/**
* Compiler arguments integration test: Verify generated builder with all options disabled.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@
*/
public final class ProcessorTestUtils {

private static final Pattern PACKAGE_PATTERN =
Pattern.compile("(?m)^\\s*package\\s+([a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)\\s*;");
private static final Pattern TOP_LEVEL_TYPE_PATTERN =
Pattern.compile(
"(?m)^[ \\t]*(?:(?:public|protected|private|abstract|final|static|sealed|non-sealed|strictfp)\\s+)*(?:@?interface|class|enum|record)\\s+([A-Za-z_]\\w*)\\b");

private ProcessorTestUtils() {}

/**
Expand Down Expand Up @@ -184,17 +190,12 @@ public static JavaFileObject forSource(String source) {
}

private static String extractPackageName(String source) {
Matcher m =
Pattern.compile("(?m)^\\s*package\\s+([a-zA-Z_]\\w*(?:\\.[a-zA-Z_]\\w*)*)\\s*;")
.matcher(source);
Matcher m = PACKAGE_PATTERN.matcher(source);
return m.find() ? m.group(1) : null;
}

private static String extractTopLevelTypeName(String source) {
Matcher m =
Pattern.compile(
"(?m)^\\s*(?:public|protected|private)?(?:\\s+(?:abstract|final|static|sealed|non-sealed|strictfp))*\\s*(?:@?interface|class|enum|record)\\s+([A-Za-z_]\\w*)\\b")
.matcher(source);
Matcher m = TOP_LEVEL_TYPE_PATTERN.matcher(source);
return m.find() ? m.group(1) : null;
}

Expand Down