Skip to content

Commit 830a34c

Browse files
committed
#117 Fix auto completion for nested records
1 parent feec705 commit 830a34c

File tree

7 files changed

+98
-3
lines changed

7 files changed

+98
-3
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ PsiType resolvedType() {
130130
else if ( element instanceof PsiParameter ) {
131131
return ( (PsiParameter) element ).getType();
132132
}
133+
else if ( element instanceof PsiRecordComponent ) {
134+
return ( (PsiRecordComponent) element ).getType();
135+
}
133136

134137
return null;
135138
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ PsiType resolvedType() {
163163
else if ( element instanceof PsiParameter ) {
164164
return ( (PsiParameter) element ).getType();
165165
}
166+
else if ( element instanceof PsiRecordComponent ) {
167+
return ( (PsiRecordComponent) element ).getType();
168+
}
166169
return null;
167170
}
168171

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.psi.PsiRecordComponent;
1313

1414
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.mapstruct.intellij.testutil.TestUtils.createParameter;
1516
import static org.mapstruct.intellij.testutil.TestUtils.createVariable;
1617

1718
/**
@@ -57,7 +58,7 @@ private void assertCarDtoRecordAutoComplete() {
5758
createVariable( "make", "String" ),
5859
createVariable( "seatCount", "int" ),
5960
createVariable( "manufacturingYear", "String" ),
60-
createVariable( "myDriver", "PersonDto" ),
61+
createVariable( "myDriver", "PersonDtoRecord" ),
6162
createVariable( "passengers", "List<PersonDto>" ),
6263
createVariable( "price", "Long" ),
6364
createVariable( "category", "String" ),
@@ -96,12 +97,14 @@ private void assertCarRecordAutoComplete() {
9697

9798
public void testCarMapperReturnTargetCarDtoRecord() {
9899
myFixture.copyFileToProject( "CarDtoRecord.java", "org/example/dto/CarDtoRecord.java" );
100+
myFixture.copyFileToProject( "PersonDtoRecord.java", "org/example/dto/PersonDtoRecord.java" );
99101
configureByTestName();
100102
assertCarDtoRecordAutoComplete();
101103
}
102104

103105
public void testTargetPropertyReferencesRecordComponent() {
104106
myFixture.copyFileToProject( "CarDtoRecord.java", "org/example/dto/CarDtoRecord.java" );
107+
myFixture.copyFileToProject( "PersonDtoRecord.java", "org/example/dto/PersonDtoRecord.java" );
105108
myFixture.configureByFile( "CarMapperReferenceRecordTargetProperty.java" );
106109
PsiElement reference = myFixture.getElementAtCaret();
107110
assertThat( reference )
@@ -112,6 +115,25 @@ public void testTargetPropertyReferencesRecordComponent() {
112115
} );
113116
}
114117

118+
public void testNestedSecondLevelAutoCompleteRecordTargetProperty() {
119+
myFixture.copyFileToProject( "CarDtoRecord.java", "org/example/dto/CarDtoRecord.java" );
120+
myFixture.copyFileToProject( "PersonDtoRecord.java", "org/example/dto/PersonDtoRecord.java" );
121+
configureByTestName();
122+
assertThat( myItems )
123+
.extracting( LookupElement::getLookupString )
124+
.containsExactlyInAnyOrder(
125+
"name"
126+
);
127+
128+
assertThat( myItems )
129+
.extracting( LookupElementPresentation::renderElement )
130+
.usingRecursiveFieldByFieldElementComparator()
131+
.usingElementComparatorIgnoringFields( "myIcon", "myTail" )
132+
.containsExactlyInAnyOrder(
133+
createParameter( "name", "String" )
134+
);
135+
}
136+
115137
public void testCarMapperSimpleSingleSourceCarRecord() {
116138
myFixture.copyFileToProject( "CarRecord.java", "org/example/dto/CarRecord.java" );
117139
configureByTestName();
@@ -129,4 +151,22 @@ public void testSourcePropertyReferencesRecordComponent() {
129151
assertThat( recordComponent.getType().getPresentableText() ).isEqualTo( "int" );
130152
} );
131153
}
154+
155+
public void testNestedSecondLevelAutoCompleteRecordSourceProperty() {
156+
myFixture.copyFileToProject( "CarDtoRecord.java", "org/example/dto/CarDtoRecord.java" );
157+
myFixture.copyFileToProject( "PersonDtoRecord.java", "org/example/dto/PersonDtoRecord.java" );
158+
configureByTestName();
159+
assertThat( myItems )
160+
.extracting( LookupElement::getLookupString )
161+
.containsExactlyInAnyOrder(
162+
"name"
163+
);
164+
165+
assertThat( myItems )
166+
.extracting( LookupElementPresentation::renderElement )
167+
.usingRecursiveFieldByFieldElementComparator()
168+
.containsExactlyInAnyOrder(
169+
createVariable( "name", "String" )
170+
);
171+
}
132172
}

testData/mapping/CarDtoRecord.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import java.util.ArrayList;
99
import java.util.List;
1010

11-
import org.example.dto.PersonDto;
11+
import org.example.dto.PersonDtoRecord;
1212

13-
public record CarDtoRecord(String make, int seatCount, String manufacturingYear, PersonDto myDriver,
13+
public record CarDtoRecord(String make, int seatCount, String manufacturingYear, PersonDtoRecord myDriver,
1414
List<PersonDto> passengers, Long price, String category, boolean available) {
1515
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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.CarDtoRecord;
9+
import org.example.dto.CarDto;
10+
import org.mapstruct.Mapper;
11+
import org.mapstruct.Mapping;
12+
13+
@Mapper
14+
public interface CarMapper {
15+
16+
@Mapping(source = "myDriver.<caret>name", target = "myDriver.name")
17+
CarDto carToCarDto(CarDtoRecord car);
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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.CarDtoRecord;
10+
import org.mapstruct.Mapper;
11+
import org.mapstruct.Mapping;
12+
13+
@Mapper
14+
public interface CarMapper {
15+
16+
@Mapping(source = "driver.name", target = "myDriver.<caret>name")
17+
CarDtoRecord carToCarDto(Car car);
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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.example.dto;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
12+
public record PersonDtoRecord(String name) {
13+
}

0 commit comments

Comments
 (0)