Skip to content

Commit df09b11

Browse files
committed
Fix JDT records
Fixes error where records generate incorrectly on JDT
1 parent c3a1e40 commit df09b11

File tree

1 file changed

+43
-12
lines changed

1 file changed

+43
-12
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TypeReader.java

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import javax.lang.model.element.*;
44
import javax.lang.model.type.TypeMirror;
55
import javax.lang.model.util.ElementFilter;
6+
import javax.lang.model.util.Elements;
67

78
import static java.util.stream.Collectors.toSet;
89

@@ -263,18 +264,48 @@ private void readMethod(Element element, List<FieldReader> localFields) {
263264
}
264265
}
265266
// 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+
}
278309
}
279310

280311
private boolean checkMethod2(ExecutableElement methodElement) {

0 commit comments

Comments
 (0)