use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.
the class AbstractBaseBuilder method createForgedAssignment.
/**
* Creates a forged assignment from the provided {@code sourceRHS} and {@code forgedMethod}. If a mapping method
* for the {@code forgedMethod} already exists, then this method used for the assignment.
*
* @param sourceRHS that needs to be used for the assignment
* @param forgedMethod the forged method for which we want to create an {@link Assignment}
*
* @return See above
*/
Assignment createForgedAssignment(SourceRHS sourceRHS, ForgedMethod forgedMethod) {
if (ctx.getForgedMethodsUnderCreation().containsKey(forgedMethod)) {
return createAssignment(sourceRHS, ctx.getForgedMethodsUnderCreation().get(forgedMethod));
} else {
ctx.getForgedMethodsUnderCreation().put(forgedMethod, forgedMethod);
}
MappingMethod forgedMappingMethod;
if (MappingMethodUtils.isEnumMapping(forgedMethod)) {
forgedMappingMethod = new ValueMappingMethod.Builder().method(forgedMethod).valueMappings(forgedMethod.getMappingOptions().getValueMappings()).mappingContext(ctx).build();
} else {
forgedMappingMethod = new BeanMappingMethod.Builder().forgedMethod(forgedMethod).mappingContext(ctx).build();
}
Assignment forgedAssignment = createForgedAssignment(sourceRHS, forgedMethod, forgedMappingMethod);
ctx.getForgedMethodsUnderCreation().remove(forgedMethod);
return forgedAssignment;
}
use of org.mapstruct.ap.internal.model.common.Assignment 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;
}
use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.
the class ContainerMappingMethodBuilder method build.
@Override
public final M build() {
Type sourceParameterType = first(method.getSourceParameters()).getType();
Type resultType = method.getResultType();
Type sourceElementType = getElementType(sourceParameterType);
Type targetElementType = getElementType(resultType);
String loopVariableName = Strings.getSafeVariableName(sourceElementType.getName(), method.getParameterNames());
SourceRHS sourceRHS = new SourceRHS(loopVariableName, sourceElementType, new HashSet<>(), errorMessagePart);
SelectionCriteria criteria = SelectionCriteria.forMappingMethods(selectionParameters, method.getOptions().getIterableMapping().getMappingControl(ctx.getElementUtils()), callingContextTargetPropertyName, false);
Assignment assignment = ctx.getMappingResolver().getTargetAssignment(method, getDescription(), targetElementType, formattingParameters, criteria, sourceRHS, positionHint, () -> forge(sourceRHS, sourceElementType, targetElementType));
if (assignment == null) {
if (method instanceof ForgedMethod) {
// leave messaging to calling property mapping
return null;
} else {
reportCannotCreateMapping(method, String.format("%s \"%s\"", sourceRHS.getSourceErrorMessagePart(), sourceRHS.getSourceType().describe()), sourceRHS.getSourceType(), targetElementType, "");
}
} else {
ctx.getMessager().note(2, Message.ITERABLEMAPPING_SELECT_ELEMENT_NOTE, assignment);
if (method instanceof ForgedMethod) {
ForgedMethod forgedMethod = (ForgedMethod) method;
forgedMethod.addThrownTypes(assignment.getThrownTypes());
}
}
assignment = getWrapper(assignment, method);
// mapNullToDefault
boolean mapNullToDefault = method.getOptions().getIterableMapping().getNullValueMappingStrategy().isReturnDefault();
MethodReference factoryMethod = null;
if (!method.isUpdateMethod()) {
factoryMethod = ObjectFactoryMethodResolver.getFactoryMethod(method, null, ctx);
}
Set<String> existingVariables = new HashSet<>(method.getParameterNames());
existingVariables.add(loopVariableName);
List<LifecycleCallbackMethodReference> beforeMappingMethods = LifecycleMethodResolver.beforeMappingMethods(method, selectionParameters, ctx, existingVariables);
List<LifecycleCallbackMethodReference> afterMappingMethods = LifecycleMethodResolver.afterMappingMethods(method, selectionParameters, ctx, existingVariables);
return instantiateMappingMethod(method, existingVariables, assignment, factoryMethod, mapNullToDefault, loopVariableName, beforeMappingMethods, afterMappingMethods, selectionParameters);
}
use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.
the class AbstractBaseBuilder method createAssignment.
private Assignment createAssignment(SourceRHS source, ForgedMethod methodRef) {
Assignment assignment = MethodReference.forForgedMethod(methodRef, ParameterBinding.fromParameters(methodRef.getParameters()));
assignment.setAssignment(source);
return assignment;
}
use of org.mapstruct.ap.internal.model.common.Assignment in project mapstruct by mapstruct.
the class AbstractBaseBuilder method createForgedAssignment.
/**
* Creates a forged assignment from the provided {@code sourceRHS} and {@code forgedMethod}. If a mapping method
* for the {@code forgedMethod} already exists, then this method used for the assignment.
*
* @param sourceRHS that needs to be used for the assignment
* @param forgedMethod the forged method for which we want to create an {@link Assignment}
*
* @return See above
*/
Assignment createForgedAssignment(SourceRHS sourceRHS, BuilderType builderType, ForgedMethod forgedMethod) {
if (ctx.getForgedMethodsUnderCreation().containsKey(forgedMethod)) {
return createAssignment(sourceRHS, ctx.getForgedMethodsUnderCreation().get(forgedMethod));
} else {
ctx.getForgedMethodsUnderCreation().put(forgedMethod, forgedMethod);
}
MappingMethod forgedMappingMethod;
if (MappingMethodUtils.isEnumMapping(forgedMethod)) {
forgedMappingMethod = new ValueMappingMethod.Builder().method(forgedMethod).valueMappings(forgedMethod.getOptions().getValueMappings()).enumMapping(forgedMethod.getOptions().getEnumMappingOptions()).mappingContext(ctx).build();
} else {
forgedMappingMethod = new BeanMappingMethod.Builder().forgedMethod(forgedMethod).returnTypeBuilder(builderType).mappingContext(ctx).build();
}
Assignment forgedAssignment = createForgedAssignment(sourceRHS, forgedMethod, forgedMappingMethod);
ctx.getForgedMethodsUnderCreation().remove(forgedMethod);
return forgedAssignment;
}
Aggregations