Skip to content

Commit 6b79ab7

Browse files
committed
#235: Add a regression test for an enum implementing an interface
1 parent c7f77a4 commit 6b79ab7

File tree

8 files changed

+312
-4
lines changed

8 files changed

+312
-4
lines changed

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.intellij.psi.PsiClass;
1919
import com.intellij.psi.PsiElement;
2020
import com.intellij.psi.PsiMethod;
21+
import com.intellij.psi.PsiModifier;
2122
import com.intellij.psi.PsiParameter;
2223
import com.intellij.psi.PsiReference;
2324
import com.intellij.psi.PsiType;
@@ -110,15 +111,41 @@ private Stream<PsiMethod> findAllNamedMethodsFromThisAndReferencedMappers(@NotNu
110111
return Stream.empty();
111112
}
112113

113-
Stream<PsiMethod> internalMethods = Stream.of( containingClass.getMethods() )
114-
.filter( MapstructUtil::isNamedMethod );
114+
Stream<PsiMethod> internalMethods = Stream.of( containingClass.getAllMethods() )
115+
.filter( MapstructUtil::isNamedMethod )
116+
.filter( m -> !m.hasModifierProperty( PsiModifier.PRIVATE ) );
115117

116-
Stream<PsiMethod> externalMethods = findNamedMethodsInUsedMappers( containingClass );
118+
Stream<PsiMethod> externalMethods = findNamedMethodsInUsedMappers( containingClass )
119+
.filter( method -> methodIsAccessibleFrom( method, containingClass ) );
117120

118121
return Stream.concat( internalMethods, externalMethods )
119122
.filter( this::methodHasReturnType );
120123
}
121124

125+
private boolean methodIsAccessibleFrom(PsiMethod method, PsiClass containingClass) {
126+
PsiClass methodClass = method.getContainingClass();
127+
if ( methodClass == null ) {
128+
return false;
129+
}
130+
131+
if ( method.hasModifierProperty( PsiModifier.PRIVATE ) ) {
132+
return false;
133+
}
134+
135+
if ( method.hasModifierProperty( PsiModifier.PUBLIC ) ) {
136+
return true;
137+
}
138+
139+
return haveSamePackage( containingClass, methodClass );
140+
}
141+
142+
private boolean haveSamePackage(PsiClass firstClass, PsiClass secondClass) {
143+
return Objects.equals(
144+
StringUtil.getPackageName( Objects.requireNonNull( firstClass.getQualifiedName() ) ),
145+
StringUtil.getPackageName( Objects.requireNonNull( secondClass.getQualifiedName() ) )
146+
);
147+
}
148+
122149
@NotNull
123150
private Stream<PsiMethod> findNamedMethodsInUsedMappers(@Nullable PsiClass containingClass) {
124151

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.intellij.bugs._235;
7+
8+
import org.jetbrains.annotations.NotNull;
9+
import org.mapstruct.intellij.inspection.BaseInspectionTest;
10+
import org.mapstruct.intellij.inspection.MapstructReferenceInspection;
11+
12+
/**
13+
* @author Oliver Erhart
14+
*/
15+
public class EnumImplementingInterfaceTest extends BaseInspectionTest {
16+
17+
@Override
18+
protected String getTestDataPath() {
19+
return "testData/bugs/_235";
20+
}
21+
22+
@NotNull
23+
@Override
24+
protected Class<MapstructReferenceInspection> getInspection() {
25+
return MapstructReferenceInspection.class;
26+
}
27+
28+
public void testEnumImplementingInterface() {
29+
doTest();
30+
}
31+
}

src/test/java/org/mapstruct/intellij/completion/MappingQualifiedByNameCompletionTestCase.java

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,77 @@ private void assertQualifiedByNameInsideMapperConfigAutoComplete() {
8383
assertThat( myItems )
8484
.extracting( LookupElementPresentation::renderElement )
8585
.usingRecursiveFieldByFieldElementComparator()
86+
.describedAs( "methods of mappers from @MapperConfig(uses = ...)" )
8687
.containsOnly(
87-
// methods of mappers from @MapperConfig(uses = ...)
8888
createMethod( "unwrapOptional", "T", " OptionalMapper#unwrapOptional(Optional<T>)" )
8989
);
9090
}
9191

92+
public void testMappingQualifiedByNameWithAllPossibleVisibilities() {
93+
configureByTestName();
94+
assertAutoCompleteOfValidVisibilities();
95+
}
96+
97+
private void assertAutoCompleteOfValidVisibilities() {
98+
99+
assertThat( myItems )
100+
.extracting( LookupElement::getLookupString )
101+
.containsExactlyInAnyOrder(
102+
"internalModifierPackagePrivate",
103+
"internalModifierProtected",
104+
"internalModifierPublic",
105+
"superClassModifierPackagePrivate",
106+
"superClassModifierProtected",
107+
"superClassModifierPublic",
108+
"samePackageModifierPackagePrivate",
109+
"samePackageModifierProtected",
110+
"samePackageModifierPublic",
111+
"externalPackageModifierPublic"
112+
);
113+
114+
assertThat( myItems )
115+
.extracting( LookupElementPresentation::renderElement )
116+
.usingRecursiveFieldByFieldElementComparator()
117+
.containsExactlyInAnyOrder(
118+
createMethod(
119+
"internalModifierPackagePrivate",
120+
"String",
121+
" CarMapper#internalModifierPackagePrivate(String)"
122+
),
123+
createMethod( "internalModifierProtected", "String", " CarMapper#internalModifierProtected(String)" ),
124+
createMethod( "internalModifierPublic", "String", " CarMapper#internalModifierPublic(String)" ),
125+
createMethod(
126+
"superClassModifierPackagePrivate",
127+
"String",
128+
" BaseMapper#superClassModifierPackagePrivate(String)"
129+
),
130+
createMethod(
131+
"superClassModifierProtected",
132+
"String",
133+
" BaseMapper#superClassModifierProtected(String)"
134+
),
135+
createMethod( "superClassModifierPublic", "String", " BaseMapper#superClassModifierPublic(String)" ),
136+
createMethod(
137+
"samePackageModifierPackagePrivate",
138+
"String",
139+
" SamePackageMapper#samePackageModifierPackagePrivate(String)"
140+
),
141+
createMethod(
142+
"samePackageModifierProtected",
143+
"String",
144+
" SamePackageMapper#samePackageModifierProtected(String)"
145+
),
146+
createMethod(
147+
"samePackageModifierPublic",
148+
"String",
149+
" SamePackageMapper#samePackageModifierPublic(String)"
150+
),
151+
createMethod(
152+
"externalPackageModifierPublic",
153+
"String",
154+
" ExternalMapper#externalPackageModifierPublic(String)"
155+
)
156+
);
157+
}
158+
92159
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
7+
import org.mapstruct.Mapper;
8+
9+
interface DbEnum<T> {
10+
T getDbValue();
11+
}
12+
13+
@Mapper
14+
abstract class MyMapper {
15+
16+
enum CheeseType implements DbEnum<Integer> {
17+
BRIE(1),
18+
ROQUEFORT(2);
19+
20+
private final Integer dbValue;
21+
22+
CheeseType(Integer dbValue) {
23+
this.dbValue = dbValue;
24+
}
25+
26+
@Override
27+
public Integer getDbValue() {
28+
return dbValue;
29+
}
30+
}
31+
32+
public enum OtherCheeseType {
33+
BRIE,
34+
ROQUEFORT
35+
}
36+
37+
public abstract CheeseType map(OtherCheeseType cheese);
38+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.complex;
7+
8+
import org.example.dto.Car;
9+
import org.example.dto.CarDto;
10+
import org.mapstruct.Mapper;
11+
import org.mapstruct.Mapping;
12+
import org.mapstruct.Named;
13+
import org.mapstruct.ap.test.complex.BaseMapper;
14+
import org.mapstruct.ap.test.complex.SamePackageMapper;
15+
import org.mapstruct.helper.qualifiedbyname.external.ExternalMapper;
16+
17+
@Mapper(uses = { ExternalMapper.class, SamePackageMapper.class })
18+
public abstract class CarMapper extends BaseMapper {
19+
20+
@Mapping(target = "make", qualifiedByName = "<caret>")
21+
public abstract CarDto carToCarDto(Car car);
22+
23+
@Named("internalModifierPackagePrivate")
24+
String internalModifierPackagePrivate(String value) {
25+
return "";
26+
}
27+
28+
@Named("internalModifierPrivate")
29+
private String internalModifierPrivate(String value) {
30+
return "";
31+
}
32+
33+
@Named("internalModifierProtected")
34+
protected String internalModifierProtected(String value) {
35+
return "";
36+
}
37+
38+
@Named("internalModifierPublic")
39+
public String internalModifierPublic(String value) {
40+
return "";
41+
}
42+
43+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.complex;
7+
8+
import org.mapstruct.Mapper;
9+
import org.mapstruct.Named;
10+
11+
@Mapper
12+
public abstract class BaseMapper {
13+
14+
@Named("superClassModifierPackagePrivate")
15+
String superClassModifierPackagePrivate(String value) {
16+
return "";
17+
}
18+
19+
@Named("superClassModifierPrivate")
20+
private String superClassModifierPrivate(String value) {
21+
return "";
22+
}
23+
24+
@Named("superClassModifierProtected")
25+
protected String superClassModifierProtected(String value) {
26+
return "";
27+
}
28+
29+
@Named("superClassModifierPublic")
30+
public String superClassModifierPublic(String value) {
31+
return "";
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.helper.qualifiedbyname.external;
7+
8+
import org.mapstruct.Mapper;
9+
import org.mapstruct.Named;
10+
11+
@Mapper
12+
public abstract class ExternalMapper {
13+
14+
@Named("externalPackageModifierPackagePrivate")
15+
String externalPackageModifierPackagePrivate(String value) {
16+
return "";
17+
}
18+
19+
@Named("externalPackageModifierPrivate")
20+
private String externalPackageModifierPrivate(String value) {
21+
return "";
22+
}
23+
24+
@Named("externalPackageModifierProtected")
25+
protected String externalPackageModifierProtected(String value) {
26+
return "";
27+
}
28+
29+
@Named("externalPackageModifierPublic")
30+
public String externalPackageModifierPublic(String value) {
31+
return "";
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.complex;
7+
8+
import org.mapstruct.Mapper;
9+
import org.mapstruct.Named;
10+
11+
@Mapper
12+
public abstract class SamePackageMapper {
13+
14+
@Named("samePackageModifierPackagePrivate")
15+
String samePackageModifierPackagePrivate(String value) {
16+
return "";
17+
}
18+
19+
@Named("samePackageModifierPrivate")
20+
private String samePackageModifierPrivate(String value) {
21+
return "";
22+
}
23+
24+
@Named("samePackageModifierProtected")
25+
protected String samePackageModifierProtected(String value) {
26+
return "";
27+
}
28+
29+
@Named("samePackageModifierPublic")
30+
public String samePackageModifierPublic(String value) {
31+
return "";
32+
}
33+
34+
}

0 commit comments

Comments
 (0)