Skip to content

Commit 0a3a9cb

Browse files
committed
handle record properties eclipse failures
1 parent 4157ad2 commit 0a3a9cb

File tree

1 file changed

+37
-13
lines changed

1 file changed

+37
-13
lines changed

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

Lines changed: 37 additions & 13 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

@@ -262,19 +263,42 @@ private void readMethod(Element element, List<FieldReader> localFields) {
262263
}
263264
}
264265
}
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+
}
278302
}
279303

280304
private boolean checkMethod2(ExecutableElement methodElement) {

0 commit comments

Comments
 (0)