committed by
Jordan Zimmerman
parent
661d0818c0
commit
c3719326c9
@@ -15,8 +15,13 @@
|
|||||||
*/
|
*/
|
||||||
package io.soabase.recordbuilder.processor;
|
package io.soabase.recordbuilder.processor;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.EXCLUDE_WILDCARD_TYPES;
|
||||||
import io.soabase.recordbuilder.core.RecordBuilder;
|
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.STANDARD;
|
||||||
|
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.STANDARD_FOR_SETTER;
|
||||||
|
import static io.soabase.recordbuilder.processor.ElementUtils.getBuilderName;
|
||||||
|
import static io.soabase.recordbuilder.processor.ElementUtils.getWithMethodName;
|
||||||
|
import static io.soabase.recordbuilder.processor.RecordBuilderProcessor.generatedRecordBuilderAnnotation;
|
||||||
|
import static io.soabase.recordbuilder.processor.RecordBuilderProcessor.recordBuilderGeneratedAnnotation;
|
||||||
|
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
import javax.annotation.processing.ProcessingEnvironment;
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
@@ -29,11 +34,8 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.stream.IntStream;
|
import java.util.stream.IntStream;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.*;
|
import com.squareup.javapoet.*;
|
||||||
import static io.soabase.recordbuilder.processor.ElementUtils.getBuilderName;
|
import io.soabase.recordbuilder.core.RecordBuilder;
|
||||||
import static io.soabase.recordbuilder.processor.ElementUtils.getWithMethodName;
|
|
||||||
import static io.soabase.recordbuilder.processor.RecordBuilderProcessor.generatedRecordBuilderAnnotation;
|
|
||||||
import static io.soabase.recordbuilder.processor.RecordBuilderProcessor.recordBuilderGeneratedAnnotation;
|
|
||||||
|
|
||||||
class InternalRecordBuilderProcessor {
|
class InternalRecordBuilderProcessor {
|
||||||
private final RecordBuilder.Options metaData;
|
private final RecordBuilder.Options metaData;
|
||||||
@@ -993,12 +995,21 @@ class InternalRecordBuilderProcessor {
|
|||||||
|
|
||||||
var parameterSpecBuilder = ParameterSpec.builder(type.valueType(), component.name());
|
var parameterSpecBuilder = ParameterSpec.builder(type.valueType(), component.name());
|
||||||
methodSpec.addJavadoc("Set a new value for the {@code $L} record component in the builder\n", component.name())
|
methodSpec.addJavadoc("Set a new value for the {@code $L} record component in the builder\n", component.name())
|
||||||
.addStatement("this.$L = $T.of($L)", component.name(), type.typeName(), component.name());
|
.addStatement(getOptionalStatement(type), component.name(), type.typeName(), component.name());
|
||||||
addConstructorAnnotations(component, parameterSpecBuilder);
|
addConstructorAnnotations(component, parameterSpecBuilder);
|
||||||
methodSpec.addStatement("return this").addParameter(parameterSpecBuilder.build());
|
methodSpec.addStatement("return this").addParameter(parameterSpecBuilder.build());
|
||||||
builder.addMethod(methodSpec.build());
|
builder.addMethod(methodSpec.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getOptionalStatement(OptionalType type) {
|
||||||
|
|
||||||
|
if(type.isOptional()) {
|
||||||
|
return "this.$L = $T.ofNullable($L)";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "this.$L = $T.of($L)";
|
||||||
|
}
|
||||||
|
|
||||||
private List<TypeVariableName> typeVariablesWithReturn() {
|
private List<TypeVariableName> typeVariablesWithReturn() {
|
||||||
var variables = new ArrayList<TypeVariableName>();
|
var variables = new ArrayList<TypeVariableName>();
|
||||||
variables.add(rType);
|
variables.add(rType);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import java.util.Optional;
|
|||||||
import java.util.OptionalDouble;
|
import java.util.OptionalDouble;
|
||||||
import java.util.OptionalInt;
|
import java.util.OptionalInt;
|
||||||
import java.util.OptionalLong;
|
import java.util.OptionalLong;
|
||||||
|
|
||||||
import com.squareup.javapoet.ParameterizedTypeName;
|
import com.squareup.javapoet.ParameterizedTypeName;
|
||||||
import com.squareup.javapoet.TypeName;
|
import com.squareup.javapoet.TypeName;
|
||||||
|
|
||||||
@@ -58,4 +59,8 @@ public record OptionalType(TypeName typeName, TypeName valueType) {
|
|||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isOptional() {
|
||||||
|
return typeName.equals(optionalType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package io.soabase.recordbuilder.test;
|
package io.soabase.recordbuilder.test;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
import io.soabase.recordbuilder.core.RecordBuilder;
|
import io.soabase.recordbuilder.core.RecordBuilder;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -24,4 +26,4 @@ import java.util.OptionalLong;
|
|||||||
|
|
||||||
@RecordBuilder.Options(emptyDefaultForOptional = true, addConcreteSettersForOptional = true)
|
@RecordBuilder.Options(emptyDefaultForOptional = true, addConcreteSettersForOptional = true)
|
||||||
@RecordBuilder
|
@RecordBuilder
|
||||||
public record RecordWithOptional(Optional<String> value, Optional raw, OptionalInt i, OptionalLong l, OptionalDouble d) {}
|
public record RecordWithOptional(@NotNull Optional<String> value, Optional raw, OptionalInt i, OptionalLong l, OptionalDouble d) {}
|
||||||
|
|||||||
@@ -15,14 +15,14 @@
|
|||||||
*/
|
*/
|
||||||
package io.soabase.recordbuilder.test;
|
package io.soabase.recordbuilder.test;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.OptionalDouble;
|
import java.util.OptionalDouble;
|
||||||
import java.util.OptionalInt;
|
import java.util.OptionalInt;
|
||||||
import java.util.OptionalLong;
|
import java.util.OptionalLong;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
class TestOptional {
|
class TestOptional {
|
||||||
@Test
|
@Test
|
||||||
void testDefaultEmpty() {
|
void testDefaultEmpty() {
|
||||||
@@ -65,4 +65,19 @@ class TestOptional {
|
|||||||
Assertions.assertEquals(OptionalLong.of(424242L), record.l());
|
Assertions.assertEquals(OptionalLong.of(424242L), record.l());
|
||||||
Assertions.assertEquals(OptionalDouble.of(42.42), record.d());
|
Assertions.assertEquals(OptionalDouble.of(42.42), record.d());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldAcceptNullForOptionalRawSetter() {
|
||||||
|
// given
|
||||||
|
String value = null;
|
||||||
|
|
||||||
|
// when
|
||||||
|
var record = RecordWithOptionalBuilder.builder()
|
||||||
|
.value(value)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// then
|
||||||
|
Assertions.assertEquals(Optional.empty(), record.value());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user