|
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 |
|
@@ -262,19 +263,42 @@ private void readMethod(Element element, List<FieldReader> localFields) {
|
262 | 263 | }
|
263 | 264 | }
|
264 | 265 | }
|
265 |
| - // 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 |
| - }); |
| 266 | + boolean recordAccessor = isRecordAccessor(methodElement); |
| 267 | + if (!recordAccessor) |
| 268 | + // for getter/accessor methods only, not setters |
| 269 | + PropertyPrism.getOptionalOn(methodElement) |
| 270 | + .ifPresent( |
| 271 | + propertyPrism -> { |
| 272 | + if (!methodElement.getParameters().isEmpty()) { |
| 273 | + logError( |
| 274 | + errorContext |
| 275 | + + baseType |
| 276 | + + ", @Json.Property can only be placed on Getter Methods, but on %s", |
| 277 | + methodElement); |
| 278 | + return; |
| 279 | + } |
| 280 | + |
| 281 | + // getter property as simulated read-only field with getter method |
| 282 | + final var frequency = frequency(propertyPrism.value()); |
| 283 | + final var reader = |
| 284 | + new FieldReader( |
| 285 | + element, namingConvention, currentSubType, genericTypeParams, frequency); |
| 286 | + reader.getterMethod(new MethodReader(methodElement)); |
| 287 | + localFields.add(reader); |
| 288 | + }); |
| 289 | + } |
| 290 | + |
| 291 | + private boolean isRecordAccessor(ExecutableElement methodElement) { |
| 292 | + |
| 293 | + try { |
| 294 | + return APContext.jdkVersion() >= 16 |
| 295 | + && Elements.class |
| 296 | + .getMethod("recordComponentFor", ExecutableElement.class) |
| 297 | + .invoke(APContext.elements(), methodElement) |
| 298 | + != null; |
| 299 | + } catch (Exception e) { |
| 300 | + return false; |
| 301 | + } |
278 | 302 | }
|
279 | 303 |
|
280 | 304 | private boolean checkMethod2(ExecutableElement methodElement) {
|
|
0 commit comments