use of org.mapstruct.ap.internal.model.assignment.SetterWrapperForCollectionsAndMapsWithNullCheck in project mapstruct by mapstruct.
the class CollectionAssignmentBuilder method build.
public Assignment build() {
Assignment result = assignment;
CollectionMappingStrategyGem cms = method.getOptions().getMapper().getCollectionMappingStrategy();
boolean targetImmutable = cms == CollectionMappingStrategyGem.TARGET_IMMUTABLE || targetReadAccessor == null;
if (targetAccessorType == AccessorType.SETTER || targetAccessorType.isFieldAssignment()) {
if (result.isCallingUpdateMethod() && !targetImmutable) {
// call to an update method
if (targetReadAccessor == null) {
ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_READ_ACCESSOR_FOR_TARGET_TYPE, targetPropertyName);
}
Assignment factoryMethod = ObjectFactoryMethodResolver.getFactoryMethod(method, targetType, SelectionParameters.forSourceRHS(sourceRHS), ctx);
result = new UpdateWrapper(result, method.getThrownTypes(), factoryMethod, targetAccessorType.isFieldAssignment(), targetType, true, nvpms == SET_TO_NULL && !targetType.isPrimitive(), nvpms == SET_TO_DEFAULT);
} else if (method.isUpdateMethod() && !targetImmutable) {
result = new ExistingInstanceSetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, nvcs, nvpms, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
} else if (setterWrapperNeedsSourceNullCheck(result) && canBeMappedOrDirectlyAssigned(result)) {
result = new SetterWrapperForCollectionsAndMapsWithNullCheck(result, method.getThrownTypes(), targetType, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
} else if (canBeMappedOrDirectlyAssigned(result)) {
// TODO init default value
// target accessor is setter, so wrap the setter in setter map/ collection handling
result = new SetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, targetAccessorType.isFieldAssignment());
} else if (hasNoArgsConstructor()) {
result = new NewInstanceSetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, ctx.getTypeFactory(), targetAccessorType.isFieldAssignment());
} else {
ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_SUITABLE_COLLECTION_OR_MAP_CONSTRUCTOR, targetType);
}
} else {
if (targetImmutable) {
ctx.getMessager().printMessage(method.getExecutable(), Message.PROPERTYMAPPING_NO_WRITE_ACCESSOR_FOR_TARGET_TYPE, targetPropertyName);
}
// target accessor is getter, so wrap the setter in getter map/ collection handling
result = new GetterWrapperForCollectionsAndMaps(result, method.getThrownTypes(), targetType, targetAccessorType.isFieldAssignment());
}
return result;
}
Aggregations