[jOOQ/jOOQ#10212] Add options to generate non-null attributes on Records, Pojos, and interfaces in KotlinGenerator

This includes:

- [jOOQ/jOOQ#14002] KotlinGenerator shouldn't generate public default constructor if non-nullable attributes are generated on records
This commit is contained in:
Lukas Eder 2022-09-20 10:52:03 +02:00
parent df280031ea
commit b26a5c60c8
6 changed files with 300 additions and 37 deletions

View File

@ -113,6 +113,9 @@ abstract class AbstractGenerator implements Generator {
boolean generateSpringAnnotations = false;
boolean generateSpringDao = false;
boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true;
boolean generateKotlinNotNullPojoAttributes = false;
boolean generateKotlinNotNullRecordAttributes = false;
boolean generateKotlinNotNullInterfaceAttributes = false;
GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT;
int maxMembersPerInitialiser = 500;
boolean generateQueues = true;
@ -738,6 +741,36 @@ abstract class AbstractGenerator implements Generator {
this.generateKotlinSetterJvmNameAnnotationsOnIsPrefix = generateKotlinSetterJvmNameAnnotationsOnIsPrefix;
}
@Override
public boolean generateKotlinNotNullPojoAttributes() {
return generateKotlinNotNullPojoAttributes;
}
@Override
public void setGenerateKotlinNotNullPojoAttributes(boolean generateKotlinNotNullPojoAttributes) {
this.generateKotlinNotNullPojoAttributes = generateKotlinNotNullPojoAttributes;
}
@Override
public boolean generateKotlinNotNullRecordAttributes() {
return generateKotlinNotNullRecordAttributes;
}
@Override
public void setGenerateKotlinNotNullRecordAttributes(boolean generateKotlinNotNullRecordAttributes) {
this.generateKotlinNotNullRecordAttributes = generateKotlinNotNullRecordAttributes;
}
@Override
public boolean generateKotlinNotNullInterfaceAttributes() {
return generateKotlinNotNullInterfaceAttributes;
}
@Override
public void setGenerateKotlinNotNullInterfaceAttributes(boolean generateKotlinNotNullInterfaceAttributes) {
this.generateKotlinNotNullInterfaceAttributes = generateKotlinNotNullInterfaceAttributes;
}
@Override
public GeneratedSerialVersionUID generatedSerialVersionUID() {
return generatedSerialVersionUID;

View File

@ -808,6 +808,12 @@ public class GenerationTool {
generator.setGenerateSpringDao(g.getGenerate().isSpringDao());
if (g.getGenerate().isKotlinSetterJvmNameAnnotationsOnIsPrefix() != null)
generator.setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(g.getGenerate().isKotlinSetterJvmNameAnnotationsOnIsPrefix());
if (g.getGenerate().isKotlinNotNullPojoAttributes() != null)
generator.setGenerateKotlinNotNullPojoAttributes(g.getGenerate().isKotlinNotNullPojoAttributes());
if (g.getGenerate().isKotlinNotNullRecordAttributes() != null)
generator.setGenerateKotlinNotNullRecordAttributes(g.getGenerate().isKotlinNotNullRecordAttributes());
if (g.getGenerate().isKotlinNotNullInterfaceAttributes() != null)
generator.setGenerateKotlinNotNullInterfaceAttributes(g.getGenerate().isKotlinNotNullInterfaceAttributes());
if (g.getGenerate().getGeneratedSerialVersionUID() != null)
generator.setGenerateGeneratedSerialVersionUID(g.getGenerate().getGeneratedSerialVersionUID());
if (g.getGenerate().getMaxMembersPerInitialiser() != null)

View File

@ -600,6 +600,39 @@ public interface Generator {
*/
void setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix);
/**
* Generate non-nullable types on POJO attributes, where column is not null.
*/
boolean generateKotlinNotNullPojoAttributes();
/**
* Generate non-nullable types on POJO attributes, where column is not null.
*/
void setGenerateKotlinNotNullPojoAttributes(boolean generateKotlinNotNullPojoAttributes);
/**
* Generate non-nullable types on Record attributes, where column is not
* null.
*/
boolean generateKotlinNotNullRecordAttributes();
/**
* Generate non-nullable types on Record attributes, where column is not
* null.
*/
void setGenerateKotlinNotNullRecordAttributes(boolean generateKotlinNotNullRecordAttributes);
/**
* Generate non-nullable types on interface attributes, where column is not
* null.
*/
boolean generateKotlinNotNullInterfaceAttributes();
/**
* Generate non-nullable types on interface attributes, where column is not null.
*/
void setGenerateKotlinNotNullInterfaceAttributes(boolean generateKotlinNotNullInterfaceAttributes);
/**
* The type of <code>serialVersionUID</code> that should be generated.
*/

View File

@ -1540,7 +1540,7 @@ public class JavaGenerator extends AbstractGenerator {
if (generateInterfaces())
interfaces.add(out.ref(getStrategy().getFullJavaClassName(tableUdtOrEmbeddable, Mode.INTERFACE)));
if (scala)
if (scala) {
if (tableUdtOrEmbeddable instanceof EmbeddableDefinition)
out.println("%sclass %s extends %s[%s](%s.%s.getDataType.getRow)[[before= with ][separator= with ][%s]] {",
visibility(),
@ -1560,11 +1560,14 @@ public class JavaGenerator extends AbstractGenerator {
tableIdentifier,
interfaces
);
else if (kotlin)
}
else if (kotlin) {
String constructorVisibility = generateKotlinNotNullRecordAttributes() ? " private constructor" : "";
if (tableUdtOrEmbeddable instanceof EmbeddableDefinition)
out.println("%sopen class %s() : %s<%s>(%s.%s.dataType.row)[[before=, ][%s]] {",
out.println("%sopen class %s%s() : %s<%s>(%s.%s.dataType.row)[[before=, ][%s]] {",
visibility(),
className,
constructorVisibility,
baseClass,
className,
out.ref(getStrategy().getFullJavaIdentifier(((EmbeddableDefinition) tableUdtOrEmbeddable).getTable()), 2),
@ -1572,14 +1575,16 @@ public class JavaGenerator extends AbstractGenerator {
interfaces
);
else
out.println("%sopen class %s() : %s<%s>(%s)[[before=, ][%s]] {",
out.println("%sopen class %s%s() : %s<%s>(%s)[[before=, ][%s]] {",
visibility(),
className,
constructorVisibility,
baseClass,
className,
tableIdentifier,
interfaces
);
}
else
out.println("%sclass %s extends %s<%s>[[before= implements ][%s]] {", visibility(), className, baseClass, className, interfaces);
@ -1788,7 +1793,7 @@ public class JavaGenerator extends AbstractGenerator {
}
else if (kotlin) {
printDeprecationIfUnknownType(out, colTypeFull);
out.println("%soverride fun component%s(): %s? = %s", visibilityPublic(), i, colType, colMember);
out.println("%soverride fun component%s(): %s%s = %s", visibilityPublic(), i, colType, kotlinNullability(out, (TypedElementDefinition<?>) column, Mode.RECORD), colMember);
}
else {
if (printDeprecationIfUnknownType(out, colTypeFull))
@ -1818,7 +1823,7 @@ public class JavaGenerator extends AbstractGenerator {
}
else if (kotlin) {
printDeprecationIfUnknownType(out, colTypeFull);
out.println("%soverride fun value%s(): %s? = %s", visibilityPublic(), i, colType, colMember);
out.println("%soverride fun value%s(): %s%s = %s", visibilityPublic(), i, colType, kotlinNullability(out, (TypedElementDefinition<?>) column, Mode.RECORD), colMember);
}
else {
if (printDeprecationIfUnknownType(out, colTypeFull))
@ -2091,7 +2096,12 @@ public class JavaGenerator extends AbstractGenerator {
arguments.add(columnMember + " : " + type);
}
else if (kotlin) {
arguments.add(columnMember + ": " + type + "? = null");
String nullability = column instanceof TypedElementDefinition<?> ted ? kotlinNullability(out, ted, Mode.RECORD) : "";
if (nullability.isEmpty())
arguments.add(columnMember + ": " + type);
else
arguments.add(columnMember + ": " + type + "? = null");
}
else {
final String nullableAnnotation = column instanceof EmbeddableDefinition
@ -2425,7 +2435,7 @@ public class JavaGenerator extends AbstractGenerator {
printValidationAnnotation(out, column);
printKotlinSetterAnnotation(out, column, Mode.RECORD);
out.println("%sopen %svar %s: %s?", visibility(generateInterfaces()), (generateInterfaces() ? "override " : ""), member, type);
out.println("%sopen %svar %s: %s%s", visibility(generateInterfaces()), (generateInterfaces() ? "override " : ""), member, type, kotlinNullability(out, column, Mode.RECORD));
out.tab(1).println("set(value): %s = set(%s, value)", setterReturnType, index);
}
else {
@ -2619,7 +2629,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("%sdef %s: %s = get(%s).asInstanceOf[%s]", visibility(override), scalaWhitespaceSuffix(getter), type, index, type);
}
else if (kotlin) {
String nullable = column instanceof EmbeddableDefinition ? "" : "?";
String nullable = column instanceof EmbeddableDefinition ? "" : kotlinNullability(out, column, Mode.RECORD);
out.tab(1).println("get(): %s%s = get(%s) as %s%s", type, nullable, index, type, nullable);
}
else {
@ -2691,7 +2701,7 @@ public class JavaGenerator extends AbstractGenerator {
if (scala)
out.println("get(%s).asInstanceOf[%s]%s", position, columnType, separator);
else if (kotlin)
out.tab(1).println("get(%s) as %s?%s", position, columnType, separator);
out.tab(1).println("get(%s) as %s%s%s", position, columnType, kotlinNullability(out, column, Mode.RECORD), separator);
else {
// [#6705] Avoid generating code with a redundant (Object) cast
@ -3024,7 +3034,7 @@ public class JavaGenerator extends AbstractGenerator {
if (scala)
out.println("%sdef %s: %s", visibilityPublic(), scalaWhitespaceSuffix(getter), type);
else if (kotlin)
out.println("%s%s %s: %s?", visibilityPublic(), (generateImmutableInterfaces() ? "val" : "var"), member, type);
out.println("%s%s %s: %s%s", visibilityPublic(), (generateImmutableInterfaces() ? "val" : "var"), member, type, kotlinNullability(out, column, Mode.INTERFACE));
else
out.println("%s%s %s();", visibilityPublic(), type, getter);
}
@ -5070,6 +5080,7 @@ public class JavaGenerator extends AbstractGenerator {
forEach(getTypedElements(tableUdtOrEmbeddable), (column, separator) -> {
final String member = getStrategy().getJavaMemberName(column, Mode.POJO);
final String nullability = kotlinNullability(out, column, Mode.POJO);
if (column instanceof ColumnDefinition)
printColumnJPAAnnotation(out, (ColumnDefinition) column);
@ -5078,12 +5089,14 @@ public class JavaGenerator extends AbstractGenerator {
if (!generateImmutablePojos())
printKotlinSetterAnnotation(out, column, Mode.POJO);
out.println("%s%s%s %s: %s? = null%s",
out.println("%s%s%s %s: %s%s%s%s",
visibility(generateInterfaces()),
generateInterfaces() ? "override " : "",
generateImmutablePojos() ? "val" : "var",
member,
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)),
nullability,
nullability.isEmpty() ? "" : " = null",
separator
);
});
@ -5631,18 +5644,25 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final boolean nn = kotlinEffectivelyNotNull(out, column, Mode.POJO);
final String else_ = nn ? "" : "else ";
out.println("if (this.%s === null) {", columnMember);
out.println("if (o.%s !== null)", columnMember);
out.println("return false");
out.println("}");
if (!nn) {
out.println("if (this.%s === null) {", columnMember);
out.println("if (o.%s !== null)", columnMember);
out.println("return false");
out.println("}");
}
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("else if (!%s.deepEquals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
out.println("%sif (!%s.deepEquals(this.%s, o.%s))", else_, Arrays.class, columnMember, columnMember);
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("else if (!%s.equals(this.%s, o.%s))", Arrays.class, columnMember, columnMember);
out.println("%sif (!%s.equals(this.%s, o.%s))", else_, Arrays.class, columnMember, columnMember);
else
out.println("else if (this.%s != o.%s)", columnMember, columnMember);
out.println("%sif (this.%s != o.%s)", else_, columnMember, columnMember);
if (nn)
out.tab(1);
out.println("return false");
}
@ -5710,13 +5730,24 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final boolean nn = kotlinEffectivelyNotNull(out, column, Mode.POJO);
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + (if (this.%s === null) 0 else %s.deepHashCode(this.%s))", columnMember, Arrays.class, columnMember);
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + (if (this.%s === null) 0 else %s.hashCode(this.%s))", columnMember, Arrays.class, columnMember);
else
out.println("result = prime * result + (if (this.%s === null) 0 else this.%s.hashCode())", columnMember, columnMember);
if (nn) {
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + %s.deepHashCode(this.%s)", columnMember, Arrays.class, columnMember);
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + %s.hashCode(this.%s)", columnMember, Arrays.class, columnMember);
else
out.println("result = prime * result + this.%s.hashCode()", columnMember, columnMember);
}
else {
if (isObjectArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + (if (this.%s === null) 0 else %s.deepHashCode(this.%s))", columnMember, Arrays.class, columnMember);
else if (isArrayType(getJavaType(column.getType(resolver(out)), out)))
out.println("result = prime * result + (if (this.%s === null) 0 else %s.hashCode(this.%s))", columnMember, Arrays.class, columnMember);
else
out.println("result = prime * result + (if (this.%s === null) 0 else this.%s.hashCode())", columnMember, columnMember);
}
}
out.println("return result");
@ -8004,7 +8035,7 @@ public class JavaGenerator extends AbstractGenerator {
}
String nullable = "";
if (!column.getType(resolver(out)).isNullable())
if (effectivelyNotNull(out, column))
nullable = ", nullable = false";
String length = "";
@ -8054,9 +8085,7 @@ public class JavaGenerator extends AbstractGenerator {
DataTypeDefinition type = column.getType(resolver(out));
// [#5128] defaulted columns are nullable in Java
if (!column.getType(resolver(out)).isNullable() &&
!column.getType(resolver(out)).isDefaulted() &&
!column.getType(resolver(out)).isIdentity())
if (effectivelyNotNull(out, column))
out.println("@%s%s", prefix, out.ref("jakarta.validation.constraints.NotNull"));
String javaType = getJavaType(type, out);
@ -8069,6 +8098,34 @@ public class JavaGenerator extends AbstractGenerator {
}
}
private String kotlinNullability(JavaWriter out, TypedElementDefinition<?> typed) {
return kotlinNullability(out, typed, Mode.DEFAULT);
}
private String kotlinNullability(JavaWriter out, TypedElementDefinition<?> typed, Mode mode) {
return kotlinEffectivelyNotNull(out, typed, mode) ? "" : "?";
}
private boolean kotlinEffectivelyNotNull(JavaWriter out, TypedElementDefinition<?> typed, Mode mode) {
if (mode == Mode.POJO && generateKotlinNotNullPojoAttributes() ||
mode == Mode.RECORD && generateKotlinNotNullRecordAttributes() ||
mode == Mode.INTERFACE && generateKotlinNotNullInterfaceAttributes() ||
mode == Mode.DEFAULT)
return effectivelyNotNull(out, typed) ? true : false;
else
return false;
}
private boolean effectivelyNotNull(JavaWriter out, TypedElementDefinition<?> column) {
return effectivelyNotNull(column.getType(resolver(out)));
}
private boolean effectivelyNotNull(DataTypeDefinition type) {
return !type.isNullable()
&& !type.isDefaulted()
&& !type.isIdentity();
}
private static final Pattern P_IS = Pattern.compile("^is[A-Z].*$");
protected void printKotlinSetterAnnotation(JavaWriter out, TypedElementDefinition<?> column, Mode mode) {
@ -8096,13 +8153,13 @@ public class JavaGenerator extends AbstractGenerator {
}
private String nullableOrNonnullAnnotation(JavaWriter out, Definition column) {
return (column instanceof TypedElementDefinition && ((TypedElementDefinition<?>) column).getType().isNullable())
return (column instanceof TypedElementDefinition && effectivelyNotNull(out, (TypedElementDefinition<?>) column))
? nullableAnnotation(out)
: nonnullAnnotation(out);
}
private void printNullableOrNonnullAnnotation(JavaWriter out, Definition column) {
if (column instanceof TypedElementDefinition && ((TypedElementDefinition<?>) column).getType().isNullable())
if (column instanceof TypedElementDefinition && effectivelyNotNull(out, (TypedElementDefinition<?>) column))
printNullableAnnotation(out);
else
printNonnullAnnotation(out);
@ -8606,7 +8663,7 @@ public class JavaGenerator extends AbstractGenerator {
if (parametersAsField)
out.println("%s%s: %s<%s?>", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))));
else
out.println("%s%s: %s%s", separator, memberName, refNumberType(out, parameter.getType(resolver(out))), kotlinNullability(parameter));
out.println("%s%s: %s%s", separator, memberName, refNumberType(out, parameter.getType(resolver(out))), kotlinNullability(out, parameter));
}
else {
if (parametersAsField)
@ -8688,7 +8745,7 @@ public class JavaGenerator extends AbstractGenerator {
if (scala)
out.println("%s%s: %s", separator, scalaWhitespaceSuffix(paramMember), paramType);
else if (kotlin)
out.println("%s%s: %s%s", separator, paramMember, paramType, kotlinNullability(parameter));
out.println("%s%s: %s%s", separator, paramMember, paramType, kotlinNullability(out, parameter));
else
out.println("%s%s %s", separator, paramType, paramMember);
@ -9687,10 +9744,6 @@ public class JavaGenerator extends AbstractGenerator {
return sb.toString();
}
private String kotlinNullability(TypedElementDefinition<?> typed) {
return typed.getType().isNullable() ? "?" : "";
}
private DataType<?> mapTypes(DataType<?> dataType) {
DataType<?> result = dataType;

View File

@ -132,6 +132,12 @@ public class Generate implements Serializable, XMLAppendable
protected Boolean springDao = false;
@XmlElement(defaultValue = "true")
protected Boolean kotlinSetterJvmNameAnnotationsOnIsPrefix = true;
@XmlElement(defaultValue = "false")
protected Boolean kotlinNotNullPojoAttributes = false;
@XmlElement(defaultValue = "false")
protected Boolean kotlinNotNullRecordAttributes = false;
@XmlElement(defaultValue = "false")
protected Boolean kotlinNotNullInterfaceAttributes = false;
@XmlElement(defaultValue = "true")
protected Boolean globalObjectReferences = true;
@XmlElement(defaultValue = "true")
@ -1411,6 +1417,78 @@ public class Generate implements Serializable, XMLAppendable
this.kotlinSetterJvmNameAnnotationsOnIsPrefix = value;
}
/**
* Generate non-nullable types on POJO attributes, where column is not null.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isKotlinNotNullPojoAttributes() {
return kotlinNotNullPojoAttributes;
}
/**
* Sets the value of the kotlinNotNullPojoAttributes property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setKotlinNotNullPojoAttributes(Boolean value) {
this.kotlinNotNullPojoAttributes = value;
}
/**
* Generate non-nullable types on Record attributes, where column is not null.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isKotlinNotNullRecordAttributes() {
return kotlinNotNullRecordAttributes;
}
/**
* Sets the value of the kotlinNotNullRecordAttributes property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setKotlinNotNullRecordAttributes(Boolean value) {
this.kotlinNotNullRecordAttributes = value;
}
/**
* Generate non-nullable types on interface attributes, where column is not null.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isKotlinNotNullInterfaceAttributes() {
return kotlinNotNullInterfaceAttributes;
}
/**
* Sets the value of the kotlinNotNullInterfaceAttributes property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setKotlinNotNullInterfaceAttributes(Boolean value) {
this.kotlinNotNullInterfaceAttributes = value;
}
/**
* Turn off generation of all global object references.
*
@ -2784,6 +2862,21 @@ public class Generate implements Serializable, XMLAppendable
return this;
}
public Generate withKotlinNotNullPojoAttributes(Boolean value) {
setKotlinNotNullPojoAttributes(value);
return this;
}
public Generate withKotlinNotNullRecordAttributes(Boolean value) {
setKotlinNotNullRecordAttributes(value);
return this;
}
public Generate withKotlinNotNullInterfaceAttributes(Boolean value) {
setKotlinNotNullInterfaceAttributes(value);
return this;
}
public Generate withGlobalObjectReferences(Boolean value) {
setGlobalObjectReferences(value);
return this;
@ -3103,6 +3196,9 @@ public class Generate implements Serializable, XMLAppendable
builder.append("springAnnotations", springAnnotations);
builder.append("springDao", springDao);
builder.append("kotlinSetterJvmNameAnnotationsOnIsPrefix", kotlinSetterJvmNameAnnotationsOnIsPrefix);
builder.append("kotlinNotNullPojoAttributes", kotlinNotNullPojoAttributes);
builder.append("kotlinNotNullRecordAttributes", kotlinNotNullRecordAttributes);
builder.append("kotlinNotNullInterfaceAttributes", kotlinNotNullInterfaceAttributes);
builder.append("globalObjectReferences", globalObjectReferences);
builder.append("globalCatalogReferences", globalCatalogReferences);
builder.append("globalSchemaReferences", globalSchemaReferences);
@ -3621,6 +3717,33 @@ public class Generate implements Serializable, XMLAppendable
return false;
}
}
if (kotlinNotNullPojoAttributes == null) {
if (other.kotlinNotNullPojoAttributes!= null) {
return false;
}
} else {
if (!kotlinNotNullPojoAttributes.equals(other.kotlinNotNullPojoAttributes)) {
return false;
}
}
if (kotlinNotNullRecordAttributes == null) {
if (other.kotlinNotNullRecordAttributes!= null) {
return false;
}
} else {
if (!kotlinNotNullRecordAttributes.equals(other.kotlinNotNullRecordAttributes)) {
return false;
}
}
if (kotlinNotNullInterfaceAttributes == null) {
if (other.kotlinNotNullInterfaceAttributes!= null) {
return false;
}
} else {
if (!kotlinNotNullInterfaceAttributes.equals(other.kotlinNotNullInterfaceAttributes)) {
return false;
}
}
if (globalObjectReferences == null) {
if (other.globalObjectReferences!= null) {
return false;
@ -4101,6 +4224,9 @@ public class Generate implements Serializable, XMLAppendable
result = ((prime*result)+((springAnnotations == null)? 0 :springAnnotations.hashCode()));
result = ((prime*result)+((springDao == null)? 0 :springDao.hashCode()));
result = ((prime*result)+((kotlinSetterJvmNameAnnotationsOnIsPrefix == null)? 0 :kotlinSetterJvmNameAnnotationsOnIsPrefix.hashCode()));
result = ((prime*result)+((kotlinNotNullPojoAttributes == null)? 0 :kotlinNotNullPojoAttributes.hashCode()));
result = ((prime*result)+((kotlinNotNullRecordAttributes == null)? 0 :kotlinNotNullRecordAttributes.hashCode()));
result = ((prime*result)+((kotlinNotNullInterfaceAttributes == null)? 0 :kotlinNotNullInterfaceAttributes.hashCode()));
result = ((prime*result)+((globalObjectReferences == null)? 0 :globalObjectReferences.hashCode()));
result = ((prime*result)+((globalCatalogReferences == null)? 0 :globalCatalogReferences.hashCode()));
result = ((prime*result)+((globalSchemaReferences == null)? 0 :globalSchemaReferences.hashCode()));

View File

@ -2145,6 +2145,18 @@ jOOQ version used for source code.]]></jxb:javadoc></jxb:property></appinfo></an
<element name="kotlinSetterJvmNameAnnotationsOnIsPrefix" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Workaround for Kotlin generating <code>setX()</code> setters instead of <code>setIsX()</code> in byte code for mutable properties called <code>isX</code>.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="kotlinNotNullPojoAttributes" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate non-nullable types on POJO attributes, where column is not null.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="kotlinNotNullRecordAttributes" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate non-nullable types on Record attributes, where column is not null.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="kotlinNotNullInterfaceAttributes" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate non-nullable types on interface attributes, where column is not null.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="globalObjectReferences" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Turn off generation of all global object references.]]></jxb:javadoc></jxb:property></appinfo></annotation>