Skip to content

Commit bd6dfad

Browse files
authored
#136 Provide references for Mapping#qualifiedByName for used mappers inside @MapperConfig
1 parent 9c6ab9c commit bd6dfad

File tree

3 files changed

+80
-9
lines changed

3 files changed

+80
-9
lines changed

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

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.util.Arrays;
99
import java.util.Objects;
10+
import java.util.Optional;
1011
import java.util.stream.Collectors;
1112
import java.util.stream.Stream;
1213

@@ -27,6 +28,9 @@
2728
import static com.intellij.codeInsight.AnnotationUtil.findAnnotation;
2829
import static com.intellij.codeInsight.AnnotationUtil.getStringAttributeValue;
2930
import static org.mapstruct.intellij.util.MapstructAnnotationUtils.findReferencedMapperClasses;
31+
import static org.mapstruct.intellij.util.MapstructUtil.NAMED_ANNOTATION_FQN;
32+
import static org.mapstruct.intellij.util.MapstructUtil.MAPPER_ANNOTATION_FQN;
33+
import static org.mapstruct.intellij.util.MapstructUtil.MAPPER_CONFIG_ANNOTATION_FQN;
3034
import static org.mapstruct.intellij.util.MapstructUtil.asLookupWithRepresentableText;
3135

3236
/**
@@ -67,13 +71,13 @@ PsiElement resolveInternal(@NotNull String value, @NotNull PsiMethod mappingMeth
6771
@Nullable
6872
private String getNamedValue(PsiMethod method) {
6973

70-
PsiAnnotation annotation = findAnnotation( method, true, MapstructUtil.NAMED_ANNOTATION_FQN );
74+
PsiAnnotation namedAnnotation = findAnnotation( method, true, NAMED_ANNOTATION_FQN );
7175

72-
if ( annotation == null ) {
76+
if ( namedAnnotation == null ) {
7377
return null;
7478
}
7579

76-
return getStringAttributeValue( annotation, "value" );
80+
return getStringAttributeValue( namedAnnotation, "value" );
7781
}
7882

7983
@NotNull
@@ -116,16 +120,15 @@ private Stream<PsiMethod> findAllNamedMethodsFromThisAndReferencedMappers(@NotNu
116120
@NotNull
117121
private Stream<PsiMethod> findNamedMethodsInUsedMappers(@Nullable PsiClass containingClass) {
118122

119-
PsiAnnotation mapperAnnotation = findAnnotation(
120-
containingClass,
121-
MapstructUtil.MAPPER_ANNOTATION_FQN
122-
);
123+
PsiAnnotation mapperOrMapperConfigAnnotation =
124+
Optional.ofNullable( findAnnotation( containingClass, MAPPER_ANNOTATION_FQN ) )
125+
.orElseGet( () -> findAnnotation( containingClass, MAPPER_CONFIG_ANNOTATION_FQN ) );
123126

124-
if ( mapperAnnotation == null ) {
127+
if ( mapperOrMapperConfigAnnotation == null ) {
125128
return Stream.empty();
126129
}
127130

128-
return findReferencedMapperClasses( mapperAnnotation )
131+
return findReferencedMapperClasses( mapperOrMapperConfigAnnotation )
129132
.flatMap( psiClass -> Arrays.stream( psiClass.getMethods() ) )
130133
.filter( MapstructUtil::isNamedMethod );
131134
}

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,23 @@ private void assertQualifiedByNameLocalAndExternalReferenceAutoComplete() {
7070
);
7171
}
7272

73+
public void testMappingQualifiedByNameInsideMapperConfigCompletion() {
74+
configureByTestName();
75+
assertQualifiedByNameInsideMapperConfigAutoComplete();
76+
}
77+
78+
private void assertQualifiedByNameInsideMapperConfigAutoComplete() {
79+
assertThat( myItems )
80+
.extracting( LookupElement::getLookupString )
81+
.containsOnly( "unwrapOptional" );
82+
83+
assertThat( myItems )
84+
.extracting( LookupElementPresentation::renderElement )
85+
.usingRecursiveFieldByFieldElementComparator()
86+
.containsOnly(
87+
// methods of mappers from @MapperConfig(uses = ...)
88+
createMethod( "unwrapOptional", "T", " OptionalMapper#unwrapOptional(Optional<T>)" )
89+
);
90+
}
91+
7392
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://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.MapperConfig;
12+
import org.mapstruct.InheritConfiguration;
13+
import org.mapstruct.Mapping;
14+
import org.mapstruct.Named;
15+
import org.mapstruct.helper.qualifiedbyname.StringMapper;
16+
import org.mapstruct.helper.qualifiedbyname.OptionalMapper;
17+
18+
@Mapper(config = MapperConfigUsingOptionalMapper.class, uses = StringMapper.class)
19+
public interface CarMapper {
20+
21+
@InheritConfiguration
22+
CarDto carToCarDto(Car car);
23+
24+
@Named("doubleSeatCount")
25+
default int multiplyByFactor(Double input, int factor) {
26+
return (int) (input * 2);
27+
}
28+
29+
@Named("numberToZero")
30+
default Long setToZero(int ignore) {
31+
return 0L;
32+
}
33+
34+
@Named("someNamedAfterMapping")
35+
@AfterMapping
36+
default void someNamedAfterMapping(CarDto target) {
37+
target.setMake("...");
38+
}
39+
40+
}
41+
42+
@MapperConfig(uses = OptionalMapper.class)
43+
public class MapperConfigUsingOptionalMapper {
44+
45+
@Mapping(source = "numberOfSeats", target = "seatCount", qualifiedByName = "<caret>")
46+
@Mapping(source = "manufacturingDate", target = "manufacturingYear")
47+
CarDto carToCarDto(Car car);
48+
49+
}

0 commit comments

Comments
 (0)