Use Optional.ofNullable() to check for null values

Fixes #107
This commit is contained in:
Lovro Pandžić
2022-05-10 17:05:40 +02:00
committed by Jordan Zimmerman
parent 661d0818c0
commit c3719326c9
4 changed files with 45 additions and 12 deletions

View File

@@ -15,8 +15,13 @@
*/
package io.soabase.recordbuilder.processor;
import com.squareup.javapoet.*;
import io.soabase.recordbuilder.core.RecordBuilder;
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.EXCLUDE_WILDCARD_TYPES;
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.lang.model.element.*;
@@ -29,11 +34,8 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static io.soabase.recordbuilder.processor.CollectionBuilderUtils.SingleItemsMetaDataMode.*;
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 com.squareup.javapoet.*;
import io.soabase.recordbuilder.core.RecordBuilder;
class InternalRecordBuilderProcessor {
private final RecordBuilder.Options metaData;
@@ -993,12 +995,21 @@ class InternalRecordBuilderProcessor {
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())
.addStatement("this.$L = $T.of($L)", component.name(), type.typeName(), component.name());
.addStatement(getOptionalStatement(type), component.name(), type.typeName(), component.name());
addConstructorAnnotations(component, parameterSpecBuilder);
methodSpec.addStatement("return this").addParameter(parameterSpecBuilder.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() {
var variables = new ArrayList<TypeVariableName>();
variables.add(rType);

View File

@@ -19,6 +19,7 @@ import java.util.Optional;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
@@ -58,4 +59,8 @@ public record OptionalType(TypeName typeName, TypeName valueType) {
}
return Optional.empty();
}
public boolean isOptional() {
return typeName.equals(optionalType);
}
}

View File

@@ -15,6 +15,8 @@
*/
package io.soabase.recordbuilder.test;
import javax.validation.constraints.NotNull;
import io.soabase.recordbuilder.core.RecordBuilder;
import java.util.Optional;
@@ -24,4 +26,4 @@ import java.util.OptionalLong;
@RecordBuilder.Options(emptyDefaultForOptional = true, addConcreteSettersForOptional = true)
@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) {}

View File

@@ -15,14 +15,14 @@
*/
package io.soabase.recordbuilder.test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
class TestOptional {
@Test
void testDefaultEmpty() {
@@ -65,4 +65,19 @@ class TestOptional {
Assertions.assertEquals(OptionalLong.of(424242L), record.l());
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());
}
}