Skip to content

Commit a2b48cc

Browse files
authored
#4 Provide smart completion for target in @Mapping
1 parent ed36713 commit a2b48cc

File tree

5 files changed

+36
-19
lines changed

5 files changed

+36
-19
lines changed

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

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
*/
66
package org.mapstruct.intellij.codeinsight.references;
77

8+
import java.util.Map;
89
import java.util.Objects;
910
import java.util.stream.Stream;
1011

12+
import com.intellij.codeInsight.AnnotationUtil;
1113
import com.intellij.codeInsight.lookup.LookupElement;
1214
import com.intellij.openapi.util.Pair;
1315
import com.intellij.openapi.util.TextRange;
@@ -18,16 +20,19 @@
1820
import com.intellij.psi.PsiParameter;
1921
import com.intellij.psi.PsiRecordComponent;
2022
import com.intellij.psi.PsiReference;
23+
import com.intellij.psi.PsiSubstitutor;
2124
import com.intellij.psi.PsiType;
2225
import com.intellij.psi.PsiVariable;
2326
import com.intellij.psi.util.PsiUtil;
2427
import org.jetbrains.annotations.NotNull;
2528
import org.jetbrains.annotations.Nullable;
29+
import org.mapstruct.Mapping;
2630
import org.mapstruct.intellij.util.MapStructVersion;
2731
import org.mapstruct.intellij.util.MapstructUtil;
2832
import org.mapstruct.intellij.util.TargetType;
2933
import org.mapstruct.intellij.util.TargetUtils;
3034

35+
import static org.mapstruct.intellij.util.MapstructAnnotationUtils.findAllDefinedMappingAnnotations;
3136
import static org.mapstruct.intellij.util.MapstructUtil.asLookup;
3237
import static org.mapstruct.intellij.util.MapstructUtil.findRecordComponent;
3338
import static org.mapstruct.intellij.util.MapstructUtil.isPublicModifiable;
@@ -139,12 +144,40 @@ PsiElement resolveInternal(@NotNull String value, @NotNull PsiMethod mappingMeth
139144
@NotNull
140145
@Override
141146
Object[] getVariantsInternal(@NotNull PsiType psiType) {
147+
148+
PsiMethod mappingMethod = getMappingMethod();
149+
150+
Map<String, Pair<? extends PsiElement, PsiSubstitutor>> accessors = publicWriteAccessors(
151+
psiType,
152+
mapStructVersion,
153+
mappingMethod
154+
);
155+
156+
if (mappingMethod != null) {
157+
Stream<String> allDefinedMappingTargets = findAllDefinedMappingTargets( mappingMethod );
158+
allDefinedMappingTargets.forEach( accessors::remove );
159+
}
160+
142161
return asLookup(
143-
publicWriteAccessors( psiType, mapStructVersion, getMappingMethod() ),
162+
accessors,
144163
MapstructTargetReference::memberPsiType
145164
);
146165
}
147166

167+
/**
168+
* Find all defined {@link Mapping#target()} for the given method
169+
*
170+
* @param method that needs to be checked
171+
*
172+
* @return see description
173+
*/
174+
private Stream<String> findAllDefinedMappingTargets(@NotNull PsiMethod method) {
175+
return findAllDefinedMappingAnnotations( method, mapStructVersion )
176+
.map( psiAnnotation -> AnnotationUtil.getDeclaredStringAttributeValue( psiAnnotation, "target" ) )
177+
.filter( Objects::nonNull )
178+
.filter( s -> !s.isEmpty() );
179+
}
180+
148181
@NotNull
149182
@Override
150183
Object[] getVariantsInternal(@NotNull PsiMethod mappingMethod) {

src/test/java/org/mapstruct/intellij/MapstructCompletionJdk17TestCase.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ private void assertCarDtoRecordAutoComplete() {
4343
.containsExactlyInAnyOrder(
4444
"make",
4545
"seatCount",
46-
"manufacturingYear",
4746
"myDriver",
4847
"passengers",
4948
"price",
@@ -57,7 +56,6 @@ private void assertCarDtoRecordAutoComplete() {
5756
.containsExactlyInAnyOrder(
5857
createVariable( "make", "String" ),
5958
createVariable( "seatCount", "int" ),
60-
createVariable( "manufacturingYear", "String" ),
6159
createVariable( "myDriver", "PersonDtoRecord" ),
6260
createVariable( "passengers", "List<PersonDto>" ),
6361
createVariable( "price", "Long" ),

src/test/java/org/mapstruct/intellij/MapstructCompletionTestCase.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ private void assertCarDtoAutoComplete() {
4242
.containsExactlyInAnyOrder(
4343
"make",
4444
"seatCount",
45-
"manufacturingYear",
4645
"myDriver",
4746
"passengers",
4847
"price",
@@ -56,7 +55,6 @@ private void assertCarDtoAutoComplete() {
5655
.containsExactlyInAnyOrder(
5756
createVariable( "make", "String" ),
5857
createVariable( "seatCount", "int" ),
59-
createVariable( "manufacturingYear", "String" ),
6058
createVariable( "myDriver", "PersonDto" ),
6159
createVariable( "passengers", "List<PersonDto>" ),
6260
createVariable( "price", "Long" ),
@@ -71,7 +69,6 @@ private void assertCarDtoAutoCompleteKt() {
7169
.containsExactlyInAnyOrder(
7270
"make",
7371
"seatCount",
74-
"manufacturingYear",
7572
"myDriver",
7673
"passengers",
7774
"price",
@@ -85,7 +82,6 @@ private void assertCarDtoAutoCompleteKt() {
8582
.containsExactlyInAnyOrder(
8683
createVariable( "make", "String" ),
8784
createVariable( "seatCount", "int" ),
88-
createVariable( "manufacturingYear", "String" ),
8985
createVariable( "myDriver", "PersonDtoKt" ),
9086
createVariable( "passengers", "List<PersonDtoKt>" ),
9187
createVariable( "price", "Long" ),
@@ -100,7 +96,6 @@ private void assertCarDtoWithBuilderAutoComplete() {
10096
.containsExactlyInAnyOrder(
10197
"make",
10298
"seatCount",
103-
"manufacturingYear",
10499
"myDriver",
105100
"passengers",
106101
"price",
@@ -114,7 +109,6 @@ private void assertCarDtoWithBuilderAutoComplete() {
114109
.containsExactlyInAnyOrder(
115110
createVariable( "make", "String" ),
116111
createVariable( "seatCount", "int" ),
117-
createVariable( "manufacturingYear", "String" ),
118112
createVariable( "myDriver", "PersonDtoWithBuilder" ),
119113
createVariable( "passengers", "List<PersonDtoWithBuilder>" ),
120114
createVariable( "price", "Long" ),
@@ -129,7 +123,6 @@ private void assertCarDtoPublicAutoComplete() {
129123
.containsExactlyInAnyOrder(
130124
"make",
131125
"seatCount",
132-
"manufacturingYear",
133126
"myDriver",
134127
"passengers",
135128
"price",
@@ -143,7 +136,6 @@ private void assertCarDtoPublicAutoComplete() {
143136
.containsExactlyInAnyOrder(
144137
createVariable( "make", "String" ),
145138
createVariable( "seatCount", "int" ),
146-
createVariable( "manufacturingYear", "String" ),
147139
createVariable( "myDriver", "PersonDto" ),
148140
createVariable( "passengers", "List<PersonDto>" ),
149141
createVariable( "price", "Long" ),
@@ -204,7 +196,6 @@ private void assertCarDtoWithConstructorAutoComplete() {
204196
.containsExactlyInAnyOrder(
205197
"make",
206198
"seatCount",
207-
"manufacturingYear",
208199
"myDriver",
209200
"passengers",
210201
"price",
@@ -219,7 +210,6 @@ private void assertCarDtoWithConstructorAutoComplete() {
219210
.containsExactlyInAnyOrder(
220211
createParameter( "make", "String" ),
221212
createParameter( "seatCount", "int" ),
222-
createParameter( "manufacturingYear", "String" ),
223213
createParameter( "myDriver", "PersonDtoWithConstructor" ),
224214
createParameter( "passengers", "List<PersonDtoWithConstructor>" ),
225215
createParameter( "price", "Long" ),
@@ -234,7 +224,6 @@ private void assertCarDtoWithConstructorAndSettersAutoComplete() {
234224
.containsExactlyInAnyOrder(
235225
"make",
236226
"seatCount",
237-
"manufacturingYear",
238227
"myDriver",
239228
"passengers",
240229
"price",
@@ -249,7 +238,6 @@ private void assertCarDtoWithConstructorAndSettersAutoComplete() {
249238
.containsExactlyInAnyOrder(
250239
createParameter( "make", "String" ),
251240
createParameter( "seatCount", "int" ),
252-
createParameter( "manufacturingYear", "String" ),
253241
createParameter( "myDriver", "PersonDtoWithConstructor" ),
254242
createParameter( "passengers", "List<PersonDtoWithConstructor>" ),
255243
createParameter( "price", "Long" ),
@@ -298,7 +286,6 @@ public void testCarMapperReturnTargetCarDtoWithConstructorAndEmptyConstructor()
298286
assertThat( myItems )
299287
.extracting( LookupElement::getLookupString )
300288
.containsExactlyInAnyOrder(
301-
"manufacturingYear",
302289
"price",
303290
"category"
304291
);
@@ -307,7 +294,6 @@ public void testCarMapperReturnTargetCarDtoWithConstructorAndEmptyConstructor()
307294
.extracting( LookupElementPresentation::renderElement )
308295
.usingRecursiveFieldByFieldElementComparator()
309296
.containsExactlyInAnyOrder(
310-
createVariable( "manufacturingYear", "String" ),
311297
createVariable( "price", "Long" ),
312298
createVariable( "category", "String" )
313299
);
@@ -320,7 +306,6 @@ public void testCarMapperReturnTargetCarDtoWithMultipleConstructorsAndAnnotatedW
320306
.containsExactlyInAnyOrder(
321307
"make",
322308
"seatCount",
323-
"manufacturingYear",
324309
"price"
325310
);
326311

@@ -331,7 +316,6 @@ public void testCarMapperReturnTargetCarDtoWithMultipleConstructorsAndAnnotatedW
331316
.containsExactlyInAnyOrder(
332317
createParameter( "make", "String" ),
333318
createParameter( "seatCount", "int" ),
334-
createParameter( "manufacturingYear", "String" ),
335319
createParameter( "price", "Long" )
336320
);
337321
}

testData/mapping/NestedFirstLevelAutoCompleteTargetProperty.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
public interface CarMapper {
1515

1616
@Mapping(source = "driver.name", target = "<caret>myDriver.name")
17+
@Mapping(source = "manufacturingDate", target = "manufacturingYear")
1718
CarDto carToCarDto(Car car);
1819
}

testData/mapping/TargetPropertyAutoCompleteAfterTargetParameter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
public interface CarMapper {
1616

1717
@Mapping(source = "source.free", target = "target.<caret>available")
18+
@Mapping(source = "manufacturingDate", target = "manufacturingYear")
1819
void update(@MappingTarget CarDto target, Car source);
1920
}

0 commit comments

Comments
 (0)