private void generateFinalAccessors() {
List<CtField<?>> finalFields = root.getMergedClass()
.getElements((CtField<?> field) -> field.hasModifier(FINAL));
finalFields.forEach(f -> {
CtType<?> declaringType = f.getDeclaringType();
if (declaringType.getMethodsByName(f.getSimpleName()).isEmpty()) {
Factory factory = f.getFactory();
CtMethod access = factory.Method().create(
declaringType, EnumSet.of(PUBLIC), f.getType(),
f.getSimpleName(), emptyList(), emptySet());
access.setParent(declaringType);
access.setBody((CtBlock) factory.Core().createBlock());
CtReturn fReturn = factory.Core().createReturn();
fReturn.setReturnedExpression(
factory.Code().createVariableRead(f.getReference(), false));
access.getBody().addStatement(fReturn);
access.setPosition(new LinedSourcePosition(
((LinedSourcePosition) f.getPosition()).delegate,
((LinedSourcePosition) f.getPosition()).line));
}
});
}