|
3 | 3 | import javax.lang.model.element.*;
|
4 | 4 | import javax.lang.model.type.TypeMirror;
|
5 | 5 | import javax.lang.model.util.ElementFilter;
|
| 6 | +import javax.lang.model.util.Elements; |
6 | 7 |
|
7 | 8 | import static java.util.stream.Collectors.toSet;
|
8 | 9 |
|
@@ -263,18 +264,48 @@ private void readMethod(Element element, List<FieldReader> localFields) {
|
263 | 264 | }
|
264 | 265 | }
|
265 | 266 | // for getter/accessor methods only, not setters
|
266 |
| - PropertyPrism.getOptionalOn(methodElement).ifPresent(propertyPrism -> { |
267 |
| - if (!methodElement.getParameters().isEmpty()) { |
268 |
| - logError(errorContext + baseType + ", @Json.Property can only be placed on Getter Methods, but on %s", methodElement); |
269 |
| - return; |
270 |
| - } |
271 |
| - |
272 |
| - // getter property as simulated read-only field with getter method |
273 |
| - final var frequency = frequency(propertyPrism.value()); |
274 |
| - final var reader = new FieldReader(element, namingConvention, currentSubType, genericTypeParams, frequency); |
275 |
| - reader.getterMethod(new MethodReader(methodElement)); |
276 |
| - localFields.add(reader); |
277 |
| - }); |
| 267 | + PropertyPrism.getOptionalOn(methodElement) |
| 268 | + .filter(p -> !hasRecordPropertyAnnotation(methodElement)) |
| 269 | + .ifPresent( |
| 270 | + propertyPrism -> { |
| 271 | + if (!methodElement.getParameters().isEmpty()) { |
| 272 | + logError( |
| 273 | + errorContext |
| 274 | + + baseType |
| 275 | + + ", @Json.Property can only be placed on Getter Methods, but on %s", |
| 276 | + methodElement); |
| 277 | + return; |
| 278 | + } |
| 279 | + |
| 280 | + // getter property as simulated read-only field with getter method |
| 281 | + final var frequency = frequency(propertyPrism.value()); |
| 282 | + final var reader = |
| 283 | + new FieldReader( |
| 284 | + element, namingConvention, currentSubType, genericTypeParams, frequency); |
| 285 | + reader.getterMethod(new MethodReader(methodElement)); |
| 286 | + localFields.add(reader); |
| 287 | + }); |
| 288 | + } |
| 289 | + |
| 290 | + private boolean hasRecordPropertyAnnotation(ExecutableElement methodElement) { |
| 291 | + |
| 292 | + try { |
| 293 | + return APContext.jdkVersion() < 16 |
| 294 | + || Optional.ofNullable( |
| 295 | + Elements.class |
| 296 | + .getMethod("recordComponentFor", ExecutableElement.class) |
| 297 | + .invoke(APContext.elements(), methodElement)) |
| 298 | + .map(Element.class::cast) |
| 299 | + .flatMap( |
| 300 | + e -> |
| 301 | + ElementFilter.fieldsIn(e.getEnclosingElement().getEnclosedElements()).stream() |
| 302 | + .filter(f -> f.getSimpleName().contentEquals(e.getSimpleName())) |
| 303 | + .findAny()) |
| 304 | + .filter(PropertyPrism::isPresent) |
| 305 | + .isPresent(); |
| 306 | + } catch (Exception e) { |
| 307 | + return false; |
| 308 | + } |
278 | 309 | }
|
279 | 310 |
|
280 | 311 | private boolean checkMethod2(ExecutableElement methodElement) {
|
|
0 commit comments