#1660 Consider only public not static accessor methods as possible getter, setter, presence check and / or adder methods

This commit is contained in:
Filip Hrisafov 2018-12-01 18:20:31 +01:00
parent 9a43b210d3
commit d1fe65dbad
6 changed files with 147 additions and 5 deletions

View File

@ -18,7 +18,7 @@ import org.mapstruct.ap.internal.util.accessor.ExecutableElementAccessor;
import org.mapstruct.ap.spi.AccessorNamingStrategy;
import org.mapstruct.ap.spi.MethodType;
import static org.mapstruct.ap.internal.util.Executables.isPublic;
import static org.mapstruct.ap.internal.util.Executables.isPublicNotStatic;
/**
* Utils for working with the {@link AccessorNamingStrategy}.
@ -35,7 +35,7 @@ public final class AccessorNamingUtils {
public boolean isGetterMethod(Accessor method) {
ExecutableElement executable = method.getExecutable();
return executable != null && isPublic( method ) &&
return executable != null && isPublicNotStatic( method ) &&
executable.getParameters().isEmpty() &&
accessorNamingStrategy.getMethodType( executable ) == MethodType.GETTER;
}
@ -46,7 +46,7 @@ public final class AccessorNamingUtils {
}
ExecutableElement executable = method.getExecutable();
return executable != null
&& isPublic( method )
&& isPublicNotStatic( method )
&& executable.getParameters().isEmpty()
&& ( executable.getReturnType().getKind() == TypeKind.BOOLEAN ||
"java.lang.Boolean".equals( getQualifiedName( executable.getReturnType() ) ) )
@ -56,7 +56,7 @@ public final class AccessorNamingUtils {
public boolean isSetterMethod(Accessor method) {
ExecutableElement executable = method.getExecutable();
return executable != null
&& isPublic( method )
&& isPublicNotStatic( method )
&& executable.getParameters().size() == 1
&& accessorNamingStrategy.getMethodType( executable ) == MethodType.SETTER;
}
@ -64,7 +64,7 @@ public final class AccessorNamingUtils {
public boolean isAdderMethod(Accessor method) {
ExecutableElement executable = method.getExecutable();
return executable != null
&& isPublic( method )
&& isPublicNotStatic( method )
&& executable.getParameters().size() == 1
&& accessorNamingStrategy.getMethodType( executable ) == MethodType.ADDER;
}

View File

@ -67,6 +67,10 @@ public class Executables {
return executable == null && isPublic( accessor ) && isNotStatic( accessor );
}
static boolean isPublicNotStatic(Accessor accessor) {
return isPublic( accessor ) && isNotStatic( accessor );
}
static boolean isPublic(Accessor method) {
return method.getModifiers().contains( Modifier.PUBLIC );
}

View File

@ -0,0 +1,21 @@
/*
* Copyright MapStruct Authors.
*
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package org.mapstruct.ap.test.bugs._1660;
import org.mapstruct.CollectionMappingStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author Filip Hrisafov
*/
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface Issue1660Mapper {
Issue1660Mapper INSTANCE = Mappers.getMapper( Issue1660Mapper.class );
Target map(Source source);
}

View File

@ -0,0 +1,38 @@
/*
* Copyright MapStruct Authors.
*
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package org.mapstruct.ap.test.bugs._1660;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mapstruct.ap.testutil.IssueKey;
import org.mapstruct.ap.testutil.WithClasses;
import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Filip Hrisafov
*/
@RunWith(AnnotationProcessorTestRunner.class)
@IssueKey("1660")
@WithClasses({
Issue1660Mapper.class,
Source.class,
Target.class,
})
public class Issue1660Test {
@Test
public void shouldNotUseStaticMethods() {
Source source = new Source();
source.setValue( "source" );
Target target = Issue1660Mapper.INSTANCE.map( source );
assertThat( target.getValue() ).isEqualTo( "source" );
assertThat( Target.getStaticValue() ).isEqualTo( "targetStatic" );
assertThat( Target.getOtherStaticValues() ).containsExactly( "targetOtherStatic" );
}
}

View File

@ -0,0 +1,30 @@
/*
* Copyright MapStruct Authors.
*
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package org.mapstruct.ap.test.bugs._1660;
/**
* @author Filip Hrisafov
*/
public class Source {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static String getStaticValue() {
return "sourceStatic";
}
public String getOtherStaticValue() {
return "sourceOtherStatic";
}
}

View File

@ -0,0 +1,49 @@
/*
* Copyright MapStruct Authors.
*
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
*/
package org.mapstruct.ap.test.bugs._1660;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Filip Hrisafov
*/
public class Target {
private static String staticValue = "targetStatic";
private static List<String> otherStaticValues = new ArrayList<>( Collections.singletonList( "targetOtherStatic" ) );
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static String getStaticValue() {
return staticValue;
}
public static void setStaticValue(String staticValue) {
Target.staticValue = staticValue;
}
public static List<String> getOtherStaticValues() {
return otherStaticValues;
}
public static void addOtherStaticValue(String otherStaticValue) {
Target.otherStaticValues.add( otherStaticValue );
}
public static void setOtherStaticValues(List<String> otherStaticValues) {
Target.otherStaticValues = otherStaticValues;
}
}