Skip to content

Commit feaf190

Browse files
#3202 Improve line location report for invalid qualifier for SubclassMapping
1 parent 89db26a commit feaf190

File tree

5 files changed

+22
-14
lines changed

5 files changed

+22
-14
lines changed

processor/src/main/java/org/mapstruct/ap/internal/model/BeanMappingMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ private SubclassMapping createSubclassMapping(SubclassMappingOptions subclassMap
412412
FormattingParameters.EMPTY,
413413
criteria,
414414
rightHandSide,
415-
null,
415+
subclassMappingOptions.getMirror(),
416416
() -> forgeSubclassMapping(
417417
rightHandSide,
418418
sourceType,

processor/src/main/java/org/mapstruct/ap/internal/model/source/SubclassMappingOptions.java

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

88
import java.util.ArrayList;
99
import java.util.List;
10+
import java.util.Optional;
1011
import java.util.Set;
12+
import javax.lang.model.element.AnnotationMirror;
1113
import javax.lang.model.element.ExecutableElement;
1214
import javax.lang.model.type.TypeMirror;
1315

@@ -34,14 +36,16 @@ public class SubclassMappingOptions extends DelegatingOptions {
3436
private final TypeMirror target;
3537
private final TypeUtils typeUtils;
3638
private final SelectionParameters selectionParameters;
39+
private final SubclassMappingGem subclassMappingGem;
3740

3841
public SubclassMappingOptions(TypeMirror source, TypeMirror target, TypeUtils typeUtils, DelegatingOptions next,
39-
SelectionParameters selectionParameters) {
42+
SelectionParameters selectionParameters, SubclassMappingGem subclassMappingGem) {
4043
super( next );
4144
this.source = source;
4245
this.target = target;
4346
this.typeUtils = typeUtils;
4447
this.selectionParameters = selectionParameters;
48+
this.subclassMappingGem = subclassMappingGem;
4549
}
4650

4751
@Override
@@ -124,6 +128,10 @@ public SelectionParameters getSelectionParameters() {
124128
return selectionParameters;
125129
}
126130

131+
public AnnotationMirror getMirror() {
132+
return Optional.ofNullable( subclassMappingGem ).map( SubclassMappingGem::mirror ).orElse( null );
133+
}
134+
127135
public static void addInstances(SubclassMappingsGem gem, ExecutableElement method,
128136
BeanMappingOptions beanMappingOptions, FormattingMessager messager,
129137
TypeUtils typeUtils, Set<SubclassMappingOptions> mappings,
@@ -143,13 +151,13 @@ public static void addInstances(SubclassMappingsGem gem, ExecutableElement metho
143151
}
144152
}
145153

146-
public static void addInstance(SubclassMappingGem subclassMapping, ExecutableElement method,
154+
public static void addInstance(SubclassMappingGem subclassMappingGem, ExecutableElement method,
147155
BeanMappingOptions beanMappingOptions, FormattingMessager messager,
148156
TypeUtils typeUtils, Set<SubclassMappingOptions> mappings,
149157
List<Parameter> sourceParameters, Type resultType,
150158
SubclassValidator subclassValidator) {
151159
if ( !isConsistent(
152-
subclassMapping,
160+
subclassMappingGem,
153161
method,
154162
messager,
155163
typeUtils,
@@ -159,11 +167,11 @@ public static void addInstance(SubclassMappingGem subclassMapping, ExecutableEle
159167
return;
160168
}
161169

162-
TypeMirror sourceSubclass = subclassMapping.source().getValue();
163-
TypeMirror targetSubclass = subclassMapping.target().getValue();
170+
TypeMirror sourceSubclass = subclassMappingGem.source().getValue();
171+
TypeMirror targetSubclass = subclassMappingGem.target().getValue();
164172
SelectionParameters selectionParameters = new SelectionParameters(
165-
subclassMapping.qualifiedBy().get(),
166-
subclassMapping.qualifiedByName().get(),
173+
subclassMappingGem.qualifiedBy().get(),
174+
subclassMappingGem.qualifiedByName().get(),
167175
targetSubclass,
168176
typeUtils
169177
);
@@ -175,7 +183,8 @@ public static void addInstance(SubclassMappingGem subclassMapping, ExecutableEle
175183
targetSubclass,
176184
typeUtils,
177185
beanMappingOptions,
178-
selectionParameters
186+
selectionParameters,
187+
subclassMappingGem
179188
) );
180189
}
181190

@@ -190,7 +199,8 @@ public static List<SubclassMappingOptions> copyForInverseInheritance(Set<Subclas
190199
subclassMapping.source,
191200
subclassMapping.typeUtils,
192201
beanMappingOptions,
193-
subclassMapping.selectionParameters
202+
subclassMapping.selectionParameters,
203+
subclassMapping.subclassMappingGem
194204
) );
195205
}
196206
return mappings;

processor/src/test/java/org/mapstruct/ap/test/subclassmapping/qualifier/ErroneousSubclassQualifiedByMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@
1111
@Mapper(uses = { RossiniMapper.class, VivaldiMapper.class })
1212
public interface ErroneousSubclassQualifiedByMapper {
1313
@SubclassMapping(source = Rossini.class, target = RossiniDto.class, qualifiedBy = NonExistent.class)
14-
@SubclassMapping(source = Vivaldi.class, target = VivaldiDto.class)
1514
ComposerDto toDto(Composer composer);
1615
}

processor/src/test/java/org/mapstruct/ap/test/subclassmapping/qualifier/ErroneousSubclassQualifiedByNameMapper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@
1111
@Mapper(uses = { RossiniMapper.class, VivaldiMapper.class })
1212
public interface ErroneousSubclassQualifiedByNameMapper {
1313
@SubclassMapping(source = Rossini.class, target = RossiniDto.class, qualifiedByName = "non-existent")
14-
@SubclassMapping(source = Vivaldi.class, target = VivaldiDto.class)
1514
ComposerDto toDto(Composer composer);
1615
}

processor/src/test/java/org/mapstruct/ap/test/subclassmapping/qualifier/SubclassQualifierMapperTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void subclassQualifiedByNameDoesNotContainUnused() {
230230
diagnostics = @Diagnostic(
231231
type = ErroneousSubclassQualifiedByMapper.class,
232232
kind = javax.tools.Diagnostic.Kind.ERROR,
233-
line = 15,
233+
line = 13,
234234
message = "Qualifier error. No method found annotated with: [ @NonExistent ]. " +
235235
"See https://mapstruct.org/faq/#qualifier for more info."
236236
)
@@ -245,7 +245,7 @@ void subclassQualifiedByErroneous() {
245245
diagnostics = @Diagnostic(
246246
type = ErroneousSubclassQualifiedByNameMapper.class,
247247
kind = javax.tools.Diagnostic.Kind.ERROR,
248-
line = 15,
248+
line = 13,
249249
message = "Qualifier error. No method found annotated with @Named#value: [ non-existent ]. " +
250250
"See https://mapstruct.org/faq/#qualifier for more info."
251251
)

0 commit comments

Comments
 (0)