[jOOQ/jOOQ#644] KotlinGenerator fixes for POJO hierarchy

In Kotlin, classes and attributes have to be open to be overridden, and their overriding attributes have to declare this. Also, the super constructor must be called explicitly
This commit is contained in:
Lukas Eder 2024-09-05 14:00:39 +02:00
parent 1cdf577120
commit 82d210d0d4

View File

@ -2302,7 +2302,7 @@ public class JavaGenerator extends AbstractGenerator {
}
}
private final boolean udtAttributeOverride(TypedElementDefinition<?> column) {
private final boolean udtAttributeOverride(Definition column) {
if (column instanceof AttributeDefinition a) {
UDTDefinition s = a.getContainer().getSupertype();
@ -2317,6 +2317,10 @@ public class JavaGenerator extends AbstractGenerator {
return definition instanceof UDTDefinition u ? u.getSupertype() : null;
}
private final List<UDTDefinition> udtSubtypes(Definition definition) {
return definition instanceof UDTDefinition u ? u.getSubtypes() : Collections.emptyList();
}
@FunctionalInterface
private interface EmbeddableFilter {
void accept(List<Definition> result, Set<EmbeddableDefinition> duplicates, int index, EmbeddableDefinition embeddable);
@ -5795,9 +5799,17 @@ public class JavaGenerator extends AbstractGenerator {
: "";
final String superName =
udtSupertype(tableUdtOrEmbeddable) != null
? out.ref(getStrategy().getFullJavaClassName(udtSupertype(tableUdtOrEmbeddable), Mode.POJO))
? out.ref(getStrategy().getFullJavaClassName(udtSupertype(tableUdtOrEmbeddable), Mode.POJO)) + (kotlin
? "(" + udtSupertype(tableUdtOrEmbeddable)
.getAttributes()
.stream()
.map(a -> getStrategy().getJavaMemberName(a, Mode.POJO))
.collect(joining(", ")) +
")"
: "")
: out.ref(getStrategy().getJavaClassExtends(tableUdtOrEmbeddable, Mode.POJO));
final List<String> interfaces = out.ref(getStrategy().getJavaClassImplements(tableUdtOrEmbeddable, Mode.POJO));
final boolean open = !udtSubtypes(tableUdtOrEmbeddable).isEmpty();
final String abstract_ = "";
// [#644] TODO Get this to work
// tableUdtOrEmbeddable instanceof UDTDefinition && !((UDTDefinition) tableUdtOrEmbeddable).isInstantiable() ? "abstract " : "";
@ -5839,12 +5851,14 @@ public class JavaGenerator extends AbstractGenerator {
out.println(")[[before= extends ][%s]][[before= with ][separator= with ][%s]] {", first(superTypes), remaining(superTypes));
}
else if (kotlin) {
out.println("%s%s%sclass %s(", visibility(), abstract_, (generatePojosAsKotlinDataClasses() ? "data " : ""), className);
out.println("%s%s%s%sclass %s(", visibility(), abstract_, open ? "open " : "", (generatePojosAsKotlinDataClasses() ? "data " : ""), className);
forEach(replacingEmbeddablesAndUnreplacedColumns, (column, separator) -> {
final String member = getStrategy().getJavaMemberName(column, Mode.POJO);
final String nullability = kotlinNullability(out, column, Mode.POJO);
final boolean override = getStrategy().getJavaMemberOverride(column, Mode.POJO);
final boolean override =
udtAttributeOverride(column)
|| getStrategy().getJavaMemberOverride(column, Mode.POJO);
if (column instanceof ColumnDefinition)
printColumnJPAAnnotation(out, (ColumnDefinition) column);
@ -5855,9 +5869,10 @@ public class JavaGenerator extends AbstractGenerator {
printKotlinSetterAnnotation(out, ted, Mode.POJO);
}
out.println("%s%s%s %s: %s%s%s%s",
out.println("%s%s%s%s %s: %s%s%s%s",
visibility(generateInterfaces()),
generateInterfaces() || override ? "override " : "",
open && !override ? "open " : "",
generateImmutablePojos() ? "val" : "var",
member,
getJavaTypeRef(column, out, Mode.POJO),