#2350 Generate core string to enum mapping when AnyRemaining or AnyUnmapped is not used

This commit is contained in:
Filip Hrisafov 2021-02-06 09:05:40 +01:00
parent 07f5189a72
commit 85af901ea7
2 changed files with 18 additions and 7 deletions

View File

@ -262,8 +262,8 @@ public class ValueMappingMethod extends MappingMethod {
List<MappingEntry> mappings = new ArrayList<>();
List<String> unmappedSourceConstants = new ArrayList<>( targetType.getEnumConstants() );
boolean sourceErrorOccurred = !reportErrorIfMappedTargetEnumConstantsDontExist( method, targetType );
boolean mandatoryMissing = !reportErrorIfAnyRemainingOrAnyUnMappedMissing( method );
if ( sourceErrorOccurred || mandatoryMissing ) {
reportWarningIfAnyRemainingOrAnyUnMappedMissing( method );
if ( sourceErrorOccurred ) {
return mappings;
}
Set<String> mappedSources = new LinkedHashSet<>();
@ -344,17 +344,14 @@ public class ValueMappingMethod extends MappingMethod {
return !foundIncorrectMapping;
}
private boolean reportErrorIfAnyRemainingOrAnyUnMappedMissing(Method method) {
boolean foundIncorrectMapping = false;
private void reportWarningIfAnyRemainingOrAnyUnMappedMissing(Method method) {
if ( !( valueMappings.hasMapAnyUnmapped || valueMappings.hasMapAnyRemaining ) ) {
ctx.getMessager().printMessage(
method.getExecutable(),
Message.VALUEMAPPING_ANY_REMAINING_OR_UNMAPPED_MISSING
);
foundIncorrectMapping = true;
}
return !foundIncorrectMapping;
}
private boolean reportErrorIfMappedTargetEnumConstantsDontExist(Method method, Type targetType) {

View File

@ -16,6 +16,7 @@ import org.mapstruct.ap.testutil.compilation.annotation.ExpectedCompilationOutco
import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@IssueKey( "1557" )
@WithClasses({ OrderType.class, OrderMapper.class })
@ -53,7 +54,20 @@ public class StringToEnumMappingTest {
"type String to an enum type." )
}
)
public void shouldRaiseErrorWhenUsingAnyRemaining() {
public void shouldRaiseWarningWhenNotUsingAnyRemainingOrAnyUnmapped() {
assertThatThrownBy( () -> ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "unknown" ) )
.isInstanceOf( IllegalArgumentException.class )
.hasMessage( "Unexpected enum constant: unknown" );
assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( null ) )
.isEqualTo( OrderType.STANDARD );
assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "STANDARD" ) )
.isNull();
assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "RETAIL" ) )
.isEqualTo( OrderType.RETAIL );
}
}