diff --git a/README.md b/README.md index 88cf9437..e8bcc0cc 100644 --- a/README.md +++ b/README.md @@ -493,7 +493,7 @@ A runnable example demonstrating package-scoped builder generation and usage: ### MapStruct Example -A runnable example of the MapStruct `BuilderProvider` integration - no configuration needed beyond putting mapstruct-processor on the same annotation processor path. A bundled `AccessorNamingStrategy` marks the generated helper methods (`add2*`, `*Update`, `Supplier`/`Consumer`/`format` overloads, `conditional(...)`) as non-setters, honoring per-bean naming configuration like `setterSuffix`, so only direct property setters participate in bean mapping - no phantom "unmapped target property" warnings. +A runnable example of the MapStruct `BuilderProvider` integration - no configuration needed beyond putting mapstruct-processor on the same annotation processor path. A bundled `AccessorNamingStrategy` marks the generated helper methods (`add2*`, `*Update`, `Supplier`/`Consumer`/`format` overloads, `conditional(...)`) as non-setters, honoring per-bean naming configuration like `setterPrefix`, so only direct property setters participate in bean mapping - no phantom "unmapped target property" warnings. - **Mapper**: [`PersonDtoMapper.java`](example/src/main/java/org/javahelpers/simple/builders/example/PersonDtoMapper.java) - Plain `@Mapper` interface; MapStruct resolves `PersonDtoBuilder` automatically - **Generated implementation**: [`PersonDtoMapperImpl.java`](example/generated-example-builder/org/javahelpers/simple/builders/example/PersonDtoMapperImpl.java) - Uses `PersonDtoBuilder.create()`, the plain setter overloads, and `build()` diff --git a/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleBuilder.java b/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleBuilder.java index a25aa35d..0ff272c3 100644 --- a/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleBuilder.java +++ b/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleBuilder.java @@ -637,7 +637,7 @@ /** * Add Jackson annotations to the generated builder class.
* Adds {@code @JsonPOJOBuilder(withPrefix = "...")} to the builder class. The prefix matches - * the configured {@link #setterSuffix()}. + * the configured {@link #setterPrefix()}. * *

Example: * @@ -858,15 +858,15 @@ String builderUsageSuffix() default ""; /** - * Suffix to append to setter method names in the generated builder.
- * For example, with suffix "with", a field named "name" will generate "withName()".
- * When a suffix is set, the field name is capitalized after the suffix. + * Prefix to prepend to setter method names in the generated builder.
+ * For example, with prefix "with", a field named "name" will generate "withName()".
+ * When a prefix is set, the field name is capitalized after the prefix. * *

Example: * *

{@code
      * @SimpleBuilder(options = @SimpleBuilder.Options(
-     *     setterSuffix = "with"
+     *     setterPrefix = "with"
      * ))
      * public class PersonDto {
      *     // Generates: withName(String) instead of name(String)
@@ -878,12 +878,12 @@
      *     .build();
      * }
* - * Default: "" (empty - no suffix)
- * Compiler option: -Asimplebuilder.setterSuffix + * Default: "" (empty - no prefix)
+ * Compiler option: -Asimplebuilder.setterPrefix * - * @return the suffix for setter method names + * @return the prefix for setter method names */ - String setterSuffix() default ""; + String setterPrefix() default ""; /** * Formatting mode for the generated source code.
diff --git a/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleMinimalBuilder.java b/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleMinimalBuilder.java index 937900bb..9f8ba2b6 100644 --- a/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleMinimalBuilder.java +++ b/core/src/main/java/org/javahelpers/simple/builders/core/annotations/SimpleMinimalBuilder.java @@ -97,7 +97,7 @@ usingExistingBuilders = OptionState.DISABLED, usingFieldFunctionPrefill = OptionState.DISABLED, builderSuffix = "Builder", - setterSuffix = "", + setterPrefix = "", formattingMode = "lightweight")) @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index e89ae3bb..dc187388 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -1175,15 +1175,15 @@ public class ExternalBuilders { } --- -#### `setterSuffix` +#### `setterPrefix` -**Default**: `""` (empty) | **Compiler Option**: `-Asimplebuilder.setterSuffix=customPrefix` +**Default**: `""` (empty) | **Compiler Option**: `-Asimplebuilder.setterPrefix=customPrefix` Adds a prefix to all setter method names. **Example**: ```java -@SimpleBuilder.Options(setterSuffix = "with") +@SimpleBuilder.Options(setterPrefix = "with") public class PersonDto { private String name; } @@ -1720,7 +1720,7 @@ methodAccess = AccessModifier.PRIVATE # Naming -Asimplebuilder.builderSuffix=CustomSuffix --Asimplebuilder.setterSuffix=customPrefix +-Asimplebuilder.setterPrefix=customPrefix # Reliability -Asimplebuilder.strict=ENABLED|DISABLED @@ -1784,7 +1784,7 @@ methodAccess = AccessModifier.PRIVATE // Naming builderSuffix = "Builder", - setterSuffix = "" + setterPrefix = "" ) public class ExampleDto { private String name; diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/BuilderProcessor.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/BuilderProcessor.java index d0117fb8..24718188 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/BuilderProcessor.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/BuilderProcessor.java @@ -550,7 +550,7 @@ private void registerGeneratedTypes(List elementsToGenerate) .ifPresent( resolvedBuilder -> SimpleBuildersSpiIntegration.registerBuilder( - beanType, resolvedBuilder, elementToGenerate.config().getSetterSuffix())); + beanType, resolvedBuilder, elementToGenerate.config().getSetterPrefix())); } } diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegration.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegration.java index e27ca206..86730706 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegration.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegration.java @@ -36,7 +36,7 @@ * The builders {@link BuilderProcessor} generates, published to SPI adapters of other frameworks * sharing the annotation processor path (and therefore the classloader). Each entry carries the * resolved builder's type, creation and build method names plus the bean's configured {@code - * setterSuffix}, so adapters do not scan candidates or read annotation configuration themselves. + * setterPrefix}, so adapters do not scan candidates or read annotation configuration themselves. * *

The lifecycle reports where {@link BuilderProcessor}'s builder generation stands and is * transitioned by that processor alone — SPI adapters only ever read this holder, they never @@ -74,7 +74,7 @@ public enum State { /** * One bean-to-builder pair resolved at registration time: the type this processor emits for - * {@code beanType} plus its creation/build method names and the bean's {@code setterSuffix} + * {@code beanType} plus its creation/build method names and the bean's {@code setterPrefix} * naming option — flattened to names so SPI adapters never touch the resolution model. */ public record PublishedBuilder( @@ -82,7 +82,7 @@ public record PublishedBuilder( TypeName builderType, String creationMethodName, String buildMethodName, - String setterSuffix) {} + String setterPrefix) {} private static volatile State state = State.INIT; @@ -151,7 +151,7 @@ public static boolean isSimpleBuildersFinishedForIntegration(Elements observed) * Publishes the builder {@link BuilderProcessor} resolved for {@code beanType} in this * compilation — generated builders always create via a static factory. */ - static void registerBuilder(TypeName beanType, ResolvedBuilder builder, String setterSuffix) { + static void registerBuilder(TypeName beanType, ResolvedBuilder builder, String setterPrefix) { if (!(builder.funcForEmptyBuilder() instanceof StaticFactoryCall factory)) { return; } @@ -161,7 +161,7 @@ static void registerBuilder(TypeName beanType, ResolvedBuilder builder, String s builder.typeName(), factory.methodName(), builder.buildMethodName(), - setterSuffix); + setterPrefix); BY_BEAN.put(publishedBuilder.beanType().getFullQualifiedName(), publishedBuilder); BY_BUILDER.put(publishedBuilder.builderType().getFullQualifiedName(), publishedBuilder); } diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/JacksonAnnotationEnhancer.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/JacksonAnnotationEnhancer.java index e38948b5..f15f3dae 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/JacksonAnnotationEnhancer.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/builder/JacksonAnnotationEnhancer.java @@ -118,7 +118,7 @@ private AnnotationDto createJsonPOJOBuilderAnnotation(BuilderDefinitionDto build new TypeName("com.fasterxml.jackson.databind.annotation", "JsonPOJOBuilder")); // Add withPrefix member with the setter prefix from configuration - String setterPrefix = builderDto.getConfiguration().getSetterSuffix(); + String setterPrefix = builderDto.getConfiguration().getSetterPrefix(); if (setterPrefix != null) { annotation.addMember("withPrefix", "\"" + setterPrefix + "\""); } else { diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/AddToCollectionGenerator.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/AddToCollectionGenerator.java index 8407de81..fc1ff40d 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/AddToCollectionGenerator.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/AddToCollectionGenerator.java @@ -47,7 +47,7 @@ * *

This generator creates methods that add single elements to collection fields, supporting both * List and Set types. The generated methods follow the pattern "add2{#FieldName}" and always use - * this naming convention regardless of setter suffix configuration. + * this naming convention regardless of setter prefix configuration. * *

Important behavior: The generated methods preserve immutability by creating a new * collection instance. If the field already has a value, the method creates a copy of the existing diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/BasicSetterGenerator.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/BasicSetterGenerator.java index 9f66352f..a5545cb7 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/BasicSetterGenerator.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/field/BasicSetterGenerator.java @@ -37,8 +37,8 @@ * Generates basic setter methods for all fields of the builder. * *

This generator creates the primary setter method for each field, which accepts the field type - * directly and stores it in the builder. The method name follows the configured setter - * prefix/suffix pattern (default is field name without prefix). + * directly and stores it in the builder. The method name follows the configured setter prefix + * pattern (default is field name without prefix). * *

Important behavior: The generated setter wraps the value using {@code changedValue()} * to track that the field has been explicitly set. This allows distinguishing between fields that @@ -48,7 +48,7 @@ * builder field must have. * *

This generator cannot be deactivated as it provides the core builder functionality. However, - * the method naming can be configured using the setter prefix/suffix configuration options. + * the method naming can be configured using the setter prefix configuration option. * *

Example to demonstrate the generated methods

* diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java index fc7607ed..a04afbe7 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/generators/util/MethodGeneratorUtil.java @@ -85,12 +85,12 @@ private MethodGeneratorUtil() { * @return the method name with prefix applied */ public static String generateBuilderMethodName(String fieldName, ProcessingContext context) { - return generateBuilderMethodName(fieldName, context.getConfiguration().getSetterSuffix()); + return generateBuilderMethodName(fieldName, context.getConfiguration().getSetterPrefix()); } /** * Generates a builder method name by prepending the given setter prefix to the capitalized field - * name — the same name derivation the context-based overload resolves from {@code setterSuffix}, + * name — the same name derivation the context-based overload resolves from {@code setterPrefix}, * for callers without a {@link ProcessingContext} (e.g. SPI adapters). * * @param fieldName the field name diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructAccessorNamingStrategy.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructAccessorNamingStrategy.java index b4552f54..27073c86 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructAccessorNamingStrategy.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructAccessorNamingStrategy.java @@ -55,9 +55,9 @@ * ({@code (Supplier)}, {@code (String, Object...)}, {@code (Consumer)}) * compete with the direct setter. For methods declared on a builder published by {@code * BuilderProcessor} this strategy returns {@link MethodType#OTHER} for everything that is not the - * direct property setter ({@code } — the option is applied as a prefix — + * direct property setter ({@code } — the option is applied as a prefix — * taking a single argument of the field type). The property set is read off the builder's own - * tracked fields and the setter suffix comes from the published {@link PublishedBuilder} + * tracked fields and the setter prefix comes from the published {@link PublishedBuilder} * descriptors, so builders produced by earlier compilations and foreign types keep the {@link * DefaultAccessorNamingStrategy} behaviour. */ @@ -136,12 +136,12 @@ private Map directSettersOf(TypeElement builderType) { return Map.of(); } Map directSetters = new HashMap<>(); - String setterSuffix = published.get().setterSuffix(); + String setterPrefix = published.get().setterPrefix(); for (VariableElement field : ElementFilter.fieldsIn(builderType.getEnclosedElements())) { if (!field.getModifiers().contains(Modifier.STATIC)) { directSetters.put( MethodGeneratorUtil.generateBuilderMethodName( - field.getSimpleName().toString(), setterSuffix), + field.getSimpleName().toString(), setterPrefix), trackedPropertyType(field.asType())); } } diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructBuilderProvider.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructBuilderProvider.java index fe32bf4c..518986db 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructBuilderProvider.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/mapstruct/MapStructBuilderProvider.java @@ -56,7 +56,7 @@ * itself as builder-creation candidates. simple-builders keeps the factory on the generated builder * class ({@code PersonDtoBuilder.create()}), so beans are paired with builders exclusively through * the registry {@code BuilderProcessor} publishes — a constant-time lookup of already-resolved - * {@link PublishedBuilder} descriptors (builder type, creation and build method, setter suffix), + * {@link PublishedBuilder} descriptors (builder type, creation and build method, setter prefix), * covering custom packages and {@code @SimpleBuilderFor} targets. Builders produced by earlier * compilations are not discovered: only the beans the processor plans in the current run get * builder mapping. diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/model/core/BuilderConfiguration.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/model/core/BuilderConfiguration.java index 45edb180..75d1ee04 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/model/core/BuilderConfiguration.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/model/core/BuilderConfiguration.java @@ -79,7 +79,7 @@ * @param builderSuffix Suffix for builder class name * @param builderUsageSuffix Suffix for builder class name when referencing builders from the usage * scope; null means fall back to {@code builderSuffix} - * @param setterSuffix Suffix for setter method names + * @param setterPrefix Prefix for setter method names * @param formattingMode Formatting mode for generated source code (null = inherit from compiler * arg) * @param strict Strict/fail-fast generation mode @@ -118,7 +118,7 @@ public record BuilderConfiguration( OptionState usingFieldFunctionPrefill, String builderSuffix, String builderUsageSuffix, - String setterSuffix, + String setterPrefix, String formattingMode, OptionState strict) { @@ -162,7 +162,7 @@ public record BuilderConfiguration( .usingExistingBuilders(ENABLED) .usingFieldFunctionPrefill(ENABLED) .builderSuffix("Builder") - .setterSuffix("") + .setterPrefix("") .formattingMode(FormattingMode.JDT.getOptionValue()) .strict(DISABLED) .build(); @@ -322,8 +322,8 @@ public String getBuilderUsageSuffix() { return StringUtils.defaultIfBlank(builderUsageSuffix, builderSuffix); } - public String getSetterSuffix() { - return setterSuffix; + public String getSetterPrefix() { + return setterPrefix; } public boolean isStrictModeEnabled() { @@ -411,7 +411,7 @@ public BuilderConfiguration merge(BuilderConfiguration other) { mergeOptionState(other.usingFieldFunctionPrefill, this.usingFieldFunctionPrefill)) .builderSuffix(mergeString(other.builderSuffix, this.builderSuffix)) .builderUsageSuffix(mergeString(other.builderUsageSuffix, this.builderUsageSuffix)) - .setterSuffix(mergeString(other.setterSuffix, this.setterSuffix)) + .setterPrefix(mergeString(other.setterPrefix, this.setterPrefix)) .formattingMode(mergeString(other.formattingMode, this.formattingMode)) .strict(mergeOptionState(other.strict, this.strict)) .build(); @@ -502,7 +502,7 @@ public String toString() { .appendValueIfSet("usingFieldFunctionPrefill", usingFieldFunctionPrefill) .appendIfNotEmpty("builderSuffix", builderSuffix) .appendIfNotEmpty("builderUsageSuffix", builderUsageSuffix) - .appendIfNotEmpty("setterSuffix", setterSuffix) + .appendIfNotEmpty("setterPrefix", setterPrefix) .appendIfNotEmpty("formattingMode", formattingMode) .appendValueIfSet("strict", strict) .toString(); @@ -587,7 +587,7 @@ public static class Builder { // === Naming === private String builderSuffix = null; private String builderUsageSuffix = null; - private String setterSuffix = null; + private String setterPrefix = null; // === Formatting === private String formattingMode = null; @@ -912,8 +912,8 @@ public Builder builderUsageSuffix(String value) { return this; } - public Builder setterSuffix(String value) { - this.setterSuffix = value == null ? null : value.trim(); + public Builder setterPrefix(String value) { + this.setterPrefix = value == null ? null : value.trim(); return this; } @@ -967,7 +967,7 @@ public BuilderConfiguration build() { usingFieldFunctionPrefill, builderSuffix, builderUsageSuffix, - setterSuffix, + setterPrefix, formattingMode, strict); } diff --git a/processor/src/main/java/org/javahelpers/simple/builders/processor/processing/CompilerArgumentsEnum.java b/processor/src/main/java/org/javahelpers/simple/builders/processor/processing/CompilerArgumentsEnum.java index 8dfa6118..368c5bfc 100644 --- a/processor/src/main/java/org/javahelpers/simple/builders/processor/processing/CompilerArgumentsEnum.java +++ b/processor/src/main/java/org/javahelpers/simple/builders/processor/processing/CompilerArgumentsEnum.java @@ -179,8 +179,8 @@ public enum CompilerArgumentsEnum { /** Option for builder class name suffix when referencing usage-scope builders. */ BUILDER_USAGE_SUFFIX("builderUsageSuffix", string(Builder::builderUsageSuffix)), - /** Option for setter method name suffix. */ - SETTER_SUFFIX("setterSuffix", string(Builder::setterSuffix)), + /** Option for setter method name prefix. */ + SETTER_PREFIX("setterPrefix", string(Builder::setterPrefix)), // === Component Filtering === /** diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/AddToCollectionTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/AddToCollectionTest.java index b051593f..6f11ecf9 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/AddToCollectionTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/AddToCollectionTest.java @@ -162,7 +162,7 @@ public java.util.List getTasks() { } @Test - void add2Method_ignoresSetterSuffix() { + void add2Method_ignoresSetterPrefix() { JavaFileObject dto = com.google.testing.compile.JavaFileObjects.forSourceLines( "test.PersonDto", @@ -170,7 +170,7 @@ void add2Method_ignoresSetterSuffix() { "import java.util.List;", "@org.javahelpers.simple.builders.core.annotations.SimpleBuilder(", " options = @org.javahelpers.simple.builders.core.annotations.SimpleBuilder.Options(", - " setterSuffix = \"with\"", + " setterPrefix = \"with\"", " )", ")", "public class PersonDto {", @@ -195,13 +195,13 @@ void add2Method_ignoresSetterSuffix() { String generatedCode = loadGeneratedSource(compilation, "PersonDtoBuilder"); assertGenerationSucceeded(compilation, "PersonDtoBuilder", generatedCode); - // Verify regular setter respects setterSuffix + // Verify regular setter respects setterPrefix ProcessorAsserts.assertContaining( generatedCode, "public PersonDtoBuilder withName(String name)"); ProcessorAsserts.assertContaining( generatedCode, "public PersonDtoBuilder withNicknames(List nicknames)"); - // Verify add2 method does NOT respect setterSuffix - always uses add2FieldName pattern + // Verify add2 method does NOT respect setterPrefix - always uses add2FieldName pattern ProcessorAsserts.assertContaining( generatedCode, "public PersonDtoBuilder add2Nicknames(String element)"); diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/BuilderConfigurationReaderTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/BuilderConfigurationReaderTest.java index e50451be..be8600e7 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/BuilderConfigurationReaderTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/BuilderConfigurationReaderTest.java @@ -80,7 +80,7 @@ void readFromOptions_WithOptionsAnnotation_AppliesAllOptions() { builderAccess = AccessModifier.PACKAGE_PRIVATE, methodAccess = AccessModifier.PACKAGE_PRIVATE, builderSuffix = "Factory", - setterSuffix = "with" + setterPrefix = "with" )) public class PersonDto { private String name; @@ -107,7 +107,7 @@ public class PersonDto { // Verify class access is PACKAGE_PRIVATE ProcessorAsserts.assertNotContaining(generatedCode, "public class PersonDtoFactory"); - // Verify setterSuffix="with" + // Verify setterPrefix="with" ProcessorAsserts.assertContaining(generatedCode, "PersonDtoFactory withName(String name)"); ProcessorAsserts.assertContaining(generatedCode, "PersonDtoFactory withTags("); @@ -211,7 +211,7 @@ void readFromTemplate_InlineTemplateDefinition_AppliesTemplateConfiguration() { generateConditionalHelper = OptionState.DISABLED, generateWithInterface = OptionState.DISABLED, builderSuffix = "InlineBuilder", - setterSuffix = "update" + setterPrefix = "update" )) @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) @@ -268,7 +268,7 @@ void resolveConfiguration_OptionsOverridesTemplate_AppliesPriorityCorrectly() { @MyBuliderForTestAnnotation @SimpleBuilder(options = @SimpleBuilder.Options( builderSuffix = "OptionsBuilder", - setterSuffix = "set" + setterPrefix = "set" )) public class PersonDto { private String name; @@ -329,7 +329,7 @@ public class PersonDto { ProcessorTestUtils.createCompiler() .withOptions( "-Asimplebuilder.builderSuffix=CustomBuilder", - "-Asimplebuilder.setterSuffix=set", + "-Asimplebuilder.setterPrefix=set", "-Asimplebuilder.generateVarArgsHelpers=false") .compile(source); @@ -400,7 +400,7 @@ public class PersonDto { * helpers, unboxed optional, collection builders, annotations * (@Generated, @BuilderImplementation) *
  • Compiler args: Disable conditional helper, with interface, string format helpers - *
  • Inline options: Custom naming (builderSuffix, setterSuffix) + *
  • Inline options: Custom naming (builderSuffix, setterPrefix) *
  • Template: Ignored (because @SimpleBuilder is present) * */ @@ -429,7 +429,7 @@ void resolveConfiguration_AllLayersTogether_CompleteChain() { usingBuilderImplementationAnnotation = OptionState.DISABLED, usingJacksonDeserializerAnnotation = OptionState.DISABLED, builderSuffix = "MinimalBuilder", - setterSuffix = "with" + setterPrefix = "with" )) public class PersonDto { private String name; diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/CompilerArgumentsReaderTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/CompilerArgumentsReaderTest.java index c1928de6..7b931f3e 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/CompilerArgumentsReaderTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/CompilerArgumentsReaderTest.java @@ -267,7 +267,7 @@ void readBuilderConfiguration_NoArguments_ReturnsDefaults() { assertEquals(AccessModifier.DEFAULT, config.getBuilderConstructorAccess()); assertEquals(AccessModifier.DEFAULT, config.getMethodAccess()); assertNull(config.getBuilderSuffix(), "Builder suffix should be null when not set"); - assertNull(config.getSetterSuffix(), "Setter suffix should be null when not set"); + assertNull(config.getSetterPrefix(), "Setter prefix should be null when not set"); assertTrue( config.getBuilderGenerationPackagesSet().isEmpty(), "Builder generation packages should be empty when not set"); @@ -291,7 +291,7 @@ void readBuilderConfiguration_AllOptionsSet_ReadsCorrectly() { .put("simplebuilder.generateUpdateHelpers", "enabled") .put("simplebuilder.copyTypeAnnotations", "enabled") .put("simplebuilder.builderSuffix", "Factory") - .put("simplebuilder.setterSuffix", "with") + .put("simplebuilder.setterPrefix", "with") .put("simplebuilder.builderGenerationPackages", "a.b, c.d") .put("simplebuilder.builderUsagePackages", "x.y") .build(); @@ -310,7 +310,7 @@ void readBuilderConfiguration_AllOptionsSet_ReadsCorrectly() { assertEquals(OptionState.ENABLED, config.generateUpdateHelpers()); assertEquals(OptionState.ENABLED, config.copyTypeAnnotations()); assertEquals("Factory", config.getBuilderSuffix()); - assertEquals("with", config.getSetterSuffix()); + assertEquals("with", config.getSetterPrefix()); assertEquals(Set.of("a.b", "c.d"), config.getBuilderGenerationPackagesSet()); assertEquals(Set.of("x.y"), config.getBuilderUsagePackagesSet()); } @@ -347,7 +347,7 @@ void readBuilderConfiguration_EmptyStringValues_HandlesGracefully() { .put("simplebuilder.generateFieldSupplier", "") .put("simplebuilder.builderAccess", "") .put("simplebuilder.builderSuffix", "") - .put("simplebuilder.setterSuffix", "") + .put("simplebuilder.setterPrefix", "") .build(); CompilerArgumentsReader reader = new CompilerArgumentsReader(env); @@ -357,6 +357,6 @@ void readBuilderConfiguration_EmptyStringValues_HandlesGracefully() { assertEquals(OptionState.UNSET, config.generateFieldSupplier(), "Empty should be UNSET"); assertEquals(AccessModifier.DEFAULT, config.getBuilderAccess(), "Empty should be DEFAULT"); assertEquals("", config.getBuilderSuffix(), "Empty string should be preserved for suffix"); - assertEquals("", config.getSetterSuffix(), "Empty string should be preserved for suffix"); + assertEquals("", config.getSetterPrefix(), "Empty string should be preserved for prefix"); } } diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/ConfigurationProcessingTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/ConfigurationProcessingTest.java index 24801cb5..bc03df33 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/ConfigurationProcessingTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/ConfigurationProcessingTest.java @@ -89,7 +89,7 @@ void allConfigurationOptions_AccessNamingAndFormatting_MustBeReadable() { assertEquals(AccessModifier.PRIVATE, config.getBuilderConstructorAccess()); assertEquals(AccessModifier.PACKAGE_PRIVATE, config.getMethodAccess()); assertEquals("Builder", config.getBuilderSuffix()); - assertEquals("", config.getSetterSuffix()); + assertEquals("", config.getSetterPrefix()); assertEquals("lightweight", config.formattingMode()); assertEquals(Set.of("a.b"), config.getBuilderGenerationPackagesSet()); assertEquals(Set.of("c.d"), config.getBuilderUsagePackagesSet()); @@ -158,7 +158,7 @@ private static BuilderConfiguration buildFullyConfigured() { .generateJavaDoc(OptionState.ENABLED) // Naming .builderSuffix("Builder") - .setterSuffix("") + .setterPrefix("") // Formatting .formattingMode("lightweight") // Builder scoping @@ -271,7 +271,7 @@ public Address() {} "-Asimplebuilder.usingJacksonDeserializerAnnotation=false", "-Asimplebuilder.generateJavaDoc=false", "-Asimplebuilder.builderSuffix=CustomBuilder", - "-Asimplebuilder.setterSuffix=with") + "-Asimplebuilder.setterPrefix=with") .compile(nestedDto, addressDto, source); // Then: Compilation should succeed @@ -361,7 +361,7 @@ public Address() {} ProcessorAsserts.assertNotContaining( generatedCode, "public MinimalDtoCustomBuilder withName(String name)"); - // But package-private methods should exist - with setterSuffix="with", methods are prefixed + // But package-private methods should exist - with setterPrefix="with", methods are prefixed ProcessorAsserts.assertContaining( generatedCode, "MinimalDtoCustomBuilder withName(String name)", @@ -387,7 +387,7 @@ public Address() {} "MinimalDtoCustomBuilder withProperties(Consumer> propertiesBuilderConsumer)"); // Still generates: basic setters and build method - // With setterSuffix="with", all setter methods should be prefixed with "with" and capitalized + // With setterPrefix="with", all setter methods should be prefixed with "with" and capitalized ProcessorAsserts.assertContaining( generatedCode, "class MinimalDtoCustomBuilder", @@ -566,7 +566,7 @@ void configurationMerge_MustRespectPriority() { .generateSupplier(OptionState.ENABLED) .generateConsumer(OptionState.ENABLED) .builderAccess(AccessModifier.PUBLIC) - .setterSuffix("") + .setterPrefix("") .builderGenerationPackages("base.pkg") .builderUsagePackages("base.lib") .build(); @@ -576,7 +576,7 @@ void configurationMerge_MustRespectPriority() { BuilderConfiguration.builder() .generateSupplier(OptionState.DISABLED) // Override .generateBuilderConsumer(OptionState.DISABLED) // New value - .setterSuffix("with") // Override setterSuffix + .setterPrefix("with") // Override setterPrefix .builderGenerationPackages("override.pkg") // generateConsumer not set, should keep base value .build(); @@ -598,7 +598,7 @@ void configurationMerge_MustRespectPriority() { AccessModifier.PUBLIC, merged.getBuilderAccess(), "Base value should be kept when override is DEFAULT"); - assertEquals("with", merged.getSetterSuffix(), "Override should win for setterSuffix"); + assertEquals("with", merged.getSetterPrefix(), "Override should win for setterPrefix"); assertEquals(Set.of("override.pkg"), merged.getBuilderGenerationPackagesSet()); assertEquals(Set.of("base.lib"), merged.getBuilderUsagePackagesSet()); } @@ -660,7 +660,7 @@ void configurationToString_MustBeHumanReadable() { .generateConsumer(OptionState.ENABLED) .builderAccess(AccessModifier.PRIVATE) .methodAccess(AccessModifier.PACKAGE_PRIVATE) - .setterSuffix("with") + .setterPrefix("with") .build(); String configString = config.toString(); @@ -675,9 +675,9 @@ void configurationToString_MustBeHumanReadable() { assertTrue( configString.contains("PACKAGE_PRIVATE"), "toString should show AccessModifier values"); assertTrue( - configString.contains("setterSuffix"), - "toString should mention setterSuffix when non-default"); - assertTrue(configString.contains("with"), "toString should show setterSuffix value"); + configString.contains("setterPrefix"), + "toString should mention setterPrefix when non-default"); + assertTrue(configString.contains("with"), "toString should show setterPrefix value"); // Verify it's not just a hash code assertTrue(configString.length() > 100, "toString should be detailed, not just class@hashcode"); diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/JacksonSupportTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/JacksonSupportTest.java index e77850dc..3a6a604a 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/JacksonSupportTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/JacksonSupportTest.java @@ -58,7 +58,7 @@ void usingJacksonDeserializerAnnotation_WhenEnabled_ShouldGenerateAnnotation() { ProcessorTestUtils.createCompiler() .withOptions( "-Asimplebuilder.usingJacksonDeserializerAnnotation=true", - "-Asimplebuilder.setterSuffix=with") + "-Asimplebuilder.setterPrefix=with") .compile(source); // Then diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/MapStructSpiProbeTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/MapStructSpiProbeTest.java index 2cc11a55..f7469f29 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/MapStructSpiProbeTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/MapStructSpiProbeTest.java @@ -69,7 +69,7 @@ void probe_shouldDriveSpiAgainstEmittedElements() { Compilation compilation = Compiler.javac() .withProcessors(new SpiProbeProcessor(), new BuilderProcessor()) - .compile(personDto(), foreignDto(), ignoredDto(), templateDto(), suffixDto()); + .compile(personDto(), foreignDto(), ignoredDto(), templateDto(), prefixDto()); assertThat(compilation).succeeded(); ProbeResults results = ProbeResults.instance; @@ -102,12 +102,12 @@ void probe_shouldDriveSpiAgainstEmittedElements() { assertEquals(MethodType.OTHER, results.methodTypes.get("build")); assertEquals(MethodType.OTHER, results.methodTypes.get("create")); - // A configured setterSuffix is applied as a prefix: only the exact direct setter stays a + // A configured setterPrefix is applied as a prefix: only the exact direct setter stays a // write accessor — every prefixed helper and lifecycle method resolves to OTHER. - assertEquals(MethodType.SETTER, results.suffixMethodTypes.get("withName(java.lang.String)")); + assertEquals(MethodType.SETTER, results.prefixMethodTypes.get("withName(java.lang.String)")); assertEquals( 1, - results.suffixMethodTypes.values().stream() + results.prefixMethodTypes.values().stream() .filter(type -> type == MethodType.SETTER) .count()); @@ -139,7 +139,7 @@ private static final class ProbeResults { static final ProbeResults instance = new ProbeResults(); final Map methodTypes = new LinkedHashMap<>(); - final Map suffixMethodTypes = new LinkedHashMap<>(); + final Map prefixMethodTypes = new LinkedHashMap<>(); Throwable unregisteredDeferral; Throwable templateDeferral; Throwable skippedBeanDeferred; @@ -158,7 +158,7 @@ private static final class ProbeResults { void reset() { methodTypes.clear(); - suffixMethodTypes.clear(); + prefixMethodTypes.clear(); unregisteredDeferral = null; templateDeferral = null; skippedBeanDeferred = null; @@ -290,11 +290,11 @@ public boolean process(Set annotations, RoundEnvironment for (ExecutableElement method : ElementFilter.methodsIn(builder.getEnclosedElements())) { results.methodTypes.put(method.getSimpleName().toString(), naming.getMethodType(method)); } - TypeElement suffixBuilder = element("test.SuffixDtoBuilder"); - if (suffixBuilder != null) { + TypeElement prefixBuilder = element("test.PrefixDtoBuilder"); + if (prefixBuilder != null) { for (ExecutableElement method : - ElementFilter.methodsIn(suffixBuilder.getEnclosedElements())) { - results.suffixMethodTypes.put(signatureKey(method), naming.getMethodType(method)); + ElementFilter.methodsIn(prefixBuilder.getEnclosedElements())) { + results.prefixMethodTypes.put(signatureKey(method), naming.getMethodType(method)); } } TypeElement foreignBean = element("test.ForeignDto"); @@ -401,15 +401,15 @@ public class ScopedDto { """); } - private static JavaFileObject suffixDto() { + private static JavaFileObject prefixDto() { return ProcessorTestUtils.forSource( """ package test; import org.javahelpers.simple.builders.core.annotations.SimpleBuilder; - @SimpleBuilder(options = @SimpleBuilder.Options(setterSuffix = "with")) - public class SuffixDto { + @SimpleBuilder(options = @SimpleBuilder.Options(setterPrefix = "with")) + public class PrefixDto { private String name; public void setName(String name) { diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegrationTest.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegrationTest.java index ec15d772..bd6fbf50 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegrationTest.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/SimpleBuildersSpiIntegrationTest.java @@ -122,7 +122,7 @@ void registry_publishesBothDirections() { assertEquals("test.PersonDtoBuilder", PERSON.builderType().getFullQualifiedName()); assertEquals("create", PERSON.creationMethodName()); assertEquals("build", PERSON.buildMethodName()); - assertEquals("", PERSON.setterSuffix()); + assertEquals("", PERSON.setterPrefix()); } @Test diff --git a/processor/src/test/java/org/javahelpers/simple/builders/processor/testing/MyBuliderForTestAnnotation.java b/processor/src/test/java/org/javahelpers/simple/builders/processor/testing/MyBuliderForTestAnnotation.java index 94e82ec2..42ceb817 100644 --- a/processor/src/test/java/org/javahelpers/simple/builders/processor/testing/MyBuliderForTestAnnotation.java +++ b/processor/src/test/java/org/javahelpers/simple/builders/processor/testing/MyBuliderForTestAnnotation.java @@ -14,7 +14,7 @@ generateConditionalHelper = OptionState.DISABLED, generateWithInterface = OptionState.DISABLED, builderSuffix = "MiniBuilder", - setterSuffix = "set")) + setterPrefix = "set")) @Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface MyBuliderForTestAnnotation {}