From 99c8ba285422cf26fd65af541210400475afd73e Mon Sep 17 00:00:00 2001 From: Chire Date: Thu, 1 Oct 2026 22:03:00 +0200 Subject: [PATCH] fix Java expression injection for record targets --- .../expression/JavaExpressionInjector.java | 4 ++ .../JavaExpressionInjectionTest.java | 46 +++++++++++++++++++ testData/expression/dto/CarDtoRecord.java | 9 ++++ 3 files changed, 59 insertions(+) create mode 100644 testData/expression/dto/CarDtoRecord.java diff --git a/src/main/java/org/mapstruct/intellij/expression/JavaExpressionInjector.java b/src/main/java/org/mapstruct/intellij/expression/JavaExpressionInjector.java index 9316763d..bee62ec8 100644 --- a/src/main/java/org/mapstruct/intellij/expression/JavaExpressionInjector.java +++ b/src/main/java/org/mapstruct/intellij/expression/JavaExpressionInjector.java @@ -34,6 +34,7 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiNameValuePair; import com.intellij.psi.PsiParameter; +import com.intellij.psi.PsiRecordComponent; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeParameter; @@ -190,6 +191,9 @@ else if ( resolved instanceof PsiParameter resolvedPsiParameter ) { else if ( resolved instanceof PsiField resolvedPsiField ) { targetType = resolvedPsiField.getType(); } + else if ( resolved instanceof PsiRecordComponent resolvedRecordComponent ) { + targetType = resolvedRecordComponent.getType(); + } } } break; diff --git a/src/test/java/org/mapstruct/intellij/expression/JavaExpressionInjectionTest.java b/src/test/java/org/mapstruct/intellij/expression/JavaExpressionInjectionTest.java index eb948dba..fb2cb296 100644 --- a/src/test/java/org/mapstruct/intellij/expression/JavaExpressionInjectionTest.java +++ b/src/test/java/org/mapstruct/intellij/expression/JavaExpressionInjectionTest.java @@ -177,6 +177,23 @@ public class JavaExpressionInjectionTest extends MapstructBaseCompletionTestCase " CarPlainDto carToCarPlainDto(Car car);\n" + "}"; + @Language("java") + private static final String CAR_MAPPER_TO_RECORD = "" + + "import java.util.List;\n" + + "\n" + + "import org.mapstruct.Mapper;\n" + + "import org.mapstruct.Mapping;\n" + + "import org.mapstruct.Mappings;\n" + + "import org.example.dto.CarDtoRecord;\n" + + "import org.example.dto.Car;\n" + + "\n" + + "@Mapper(" + MAPPER + ")\n" + + "public interface CarMapper {\n" + + "\n" + + " " + MAPPING + "\n" + + " CarDtoRecord carToCarDtoRecord(Car car);\n" + + "}"; + @Override protected String getTestDataPath() { return "testData/expression"; @@ -717,6 +734,35 @@ protected void withMapperToDtoWithoutAccessors(String attribute) { assertThat( elementAt.getText() ).isEqualTo( ";" ); } + public void testExpressionWithRecordTarget() { + withRecordTarget( "expression" ); + withRecordTarget( "defaultExpression" ); + withRecordTarget( "conditionExpression" ); + } + + protected void withRecordTarget(String attribute) { + String mapping = "@Mapping(target = \"manufacturingYear\", " + attribute + " = \"java(car.)\")\n"; + @Language("java") + String mapper = formatMapper( CAR_MAPPER_TO_RECORD, mapping ); + PsiFile file = configureMapperByText( mapper ); + + assertThat( myFixture.completeBasic() ) + .extracting( LookupElementPresentation::renderElement ) + .extracting( LookupElementPresentation::getItemText ) + .contains( "getMake", "getNumberOfSeats", "getManufacturingDate" ); + + assertThat( myFixture.complete( CompletionType.SMART ) ) + .extracting( LookupElementPresentation::renderElement ) + .extracting( LookupElementPresentation::getItemText ) + .containsExactlyInAnyOrder( "getMake", "toString" ); + + PsiElement elementAt = file.findElementAt( myFixture.getCaretOffset() ); + assertThat( elementAt ) + .isNotNull() + .isInstanceOf( PsiJavaToken.class ); + assertThat( elementAt.getText() ).isEqualTo( ";" ); + } + public void testWithTextBlockAndTargetDefined() { withTextBlockAndTargetDefined( "expression" ); withTextBlockAndTargetDefined( "defaultExpression" ); diff --git a/testData/expression/dto/CarDtoRecord.java b/testData/expression/dto/CarDtoRecord.java new file mode 100644 index 00000000..f3ebfe42 --- /dev/null +++ b/testData/expression/dto/CarDtoRecord.java @@ -0,0 +1,9 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0 + */ +package org.example.dto; + +public record CarDtoRecord(String manufacturingYear) { +}