[jOOQ/jOOQ#10534] <enumConverter/> and <lambdaConverter/> don't work in ScalaGenerator and KotlinGenerator

This commit is contained in:
Lukas Eder 2020-08-28 10:59:46 +02:00
parent 739f025016
commit 9d5c87d35a
7 changed files with 287 additions and 224 deletions

View File

@ -1522,7 +1522,7 @@ public class JavaGenerator extends AbstractGenerator {
if (column instanceof EmbeddableColumnDefinition)
column = ((EmbeddableColumnDefinition) column).getReferencingColumn();
final String colTypeFull = getJavaType(column.getType(resolver()));
final String colTypeFull = getJavaType(column.getType(resolver(out)), out);
final String colType = out.ref(colTypeFull);
final String colIdentifier = out.ref(getStrategy().getFullJavaIdentifier(column), colRefSegments(column));
@ -1581,7 +1581,7 @@ public class JavaGenerator extends AbstractGenerator {
for (int i = 1; i <= degree; i++) {
TypedElementDefinition<?> column = columns.get(i - 1);
final String colTypeFull = getJavaType(column.getType(resolver()));
final String colTypeFull = getJavaType(column.getType(resolver(out)), out);
final String colType = out.ref(colTypeFull);
final String colGetter = getStrategy().getJavaGetterName(column, Mode.RECORD);
final String colMember = getStrategy().getJavaMemberName(column, Mode.POJO);
@ -1612,7 +1612,7 @@ public class JavaGenerator extends AbstractGenerator {
for (int i = 1; i <= degree; i++) {
TypedElementDefinition<?> column = columns.get(i - 1);
final String colTypeFull = getJavaType(column.getType(resolver()));
final String colTypeFull = getJavaType(column.getType(resolver(out)), out);
final String colType = out.ref(colTypeFull);
final String colGetter = getStrategy().getJavaGetterName(column, Mode.RECORD);
final String colMember = getStrategy().getJavaMemberName(column, Mode.POJO);
@ -1643,7 +1643,7 @@ public class JavaGenerator extends AbstractGenerator {
for (int i = 1; i <= degree; i++) {
TypedElementDefinition<?> column = columns.get(i - 1);
final String colTypeFull = getJavaType(column.getType(resolver()));
final String colTypeFull = getJavaType(column.getType(resolver(out)), out);
final String colType = out.ref(colTypeFull);
final String colSetter = getStrategy().getJavaSetterName(column, Mode.RECORD);
final String colMember = getStrategy().getJavaMemberName(column, Mode.POJO);
@ -1684,7 +1684,7 @@ public class JavaGenerator extends AbstractGenerator {
for (int i = 1; i <= degree; i++) {
TypedElementDefinition<?> column = columns.get(i - 1);
final String colType = out.ref(getJavaType(column.getType(resolver())));
final String colType = out.ref(getJavaType(column.getType(resolver(out)), out));
if (scala) {
arguments.add("value" + i + " : " + colType);
@ -1823,7 +1823,7 @@ public class JavaGenerator extends AbstractGenerator {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.DEFAULT);
final String type = column instanceof EmbeddableDefinition
? out.ref(getStrategy().getFullJavaClassName(column, Mode.RECORD))
: out.ref(getJavaType(((TypedElementDefinition<?>) column).getType(resolver())));
: out.ref(getJavaType(((TypedElementDefinition<?>) column).getType(resolver(out)), out));
if (scala) {
arguments.add(columnMember + " : " + type);
@ -1912,12 +1912,12 @@ public class JavaGenerator extends AbstractGenerator {
final String setterReturnType = generateFluentSetters() ? className : tokenVoid;
final String setter = getStrategy().getJavaSetterName(column, Mode.RECORD);
final String member = getStrategy().getJavaMemberName(column, Mode.POJO);
final String typeFull = getJavaType(column.getType(resolver()));
final String typeFull = getJavaType(column.getType(resolver(out)), out);
final String type = out.ref(typeFull);
final String name = column.getQualifiedOutputName();
final boolean isUDT = column.getType(resolver()).isUDT();
final boolean isArray = column.getType(resolver()).isArray();
final boolean isUDTArray = column.getType(resolver()).isArray() && database.getArray(column.getType(resolver()).getSchema(), column.getType(resolver()).getQualifiedUserType()).getElementType(resolver()).isUDT();
final boolean isUDT = column.getType(resolver(out)).isUDT();
final boolean isArray = column.getType(resolver(out)).isArray();
final boolean isUDTArray = column.getType(resolver(out)).isArray() && database.getArray(column.getType(resolver(out)).getSchema(), column.getType(resolver(out)).getQualifiedUserType()).getElementType(resolver(out)).isUDT();
boolean override = generateInterfaces() && !generateImmutableInterfaces() && !isUDT;
// We cannot have covariant setters for arrays because of type erasure
@ -1956,9 +1956,9 @@ public class JavaGenerator extends AbstractGenerator {
// [#3117] Avoid covariant setters for UDTs when generating interfaces
if (generateInterfaces() && !generateImmutableInterfaces() && (isUDT || isArray)) {
final String columnTypeFull = getJavaType(column.getType(resolver(Mode.RECORD)), Mode.RECORD);
final String columnTypeFull = getJavaType(column.getType(resolver(out, Mode.RECORD)), out, Mode.RECORD);
final String columnType = out.ref(columnTypeFull);
final String columnTypeInterface = out.ref(getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE));
final String columnTypeInterface = out.ref(getJavaType(column.getType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE));
if (!printDeprecationIfUnknownType(out, columnTypeFull))
out.javadoc("Setter for <code>%s</code>.[[before= ][%s]]", name, list(escapeEntities(comment(column))));
@ -1994,9 +1994,9 @@ public class JavaGenerator extends AbstractGenerator {
out.println("set(%s, value.into(new %s()));", index, type);
}
else if (isArray) {
final ArrayDefinition array = database.getArray(column.getType(resolver()).getSchema(), column.getType(resolver()).getQualifiedUserType());
final String componentType = out.ref(getJavaType(array.getElementType(resolver(Mode.RECORD)), Mode.RECORD));
final String componentTypeInterface = out.ref(getJavaType(array.getElementType(resolver(Mode.INTERFACE)), Mode.INTERFACE));
final ArrayDefinition array = database.getArray(column.getType(resolver(out)).getSchema(), column.getType(resolver(out)).getQualifiedUserType());
final String componentType = out.ref(getJavaType(array.getElementType(resolver(out, Mode.RECORD)), out, Mode.RECORD));
final String componentTypeInterface = out.ref(getJavaType(array.getElementType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE));
out.println("else {");
out.println("%s a = new %s();", columnType, columnType);
@ -2103,7 +2103,7 @@ public class JavaGenerator extends AbstractGenerator {
private final void generateRecordGetter0(TypedElementDefinition<?> column, int index, JavaWriter out) {
final String getter = getStrategy().getJavaGetterName(column, Mode.RECORD);
final String typeFull = getJavaType(column.getType(resolver()));
final String typeFull = getJavaType(column.getType(resolver(out)), out);
final String type = out.ref(typeFull);
final String name = column.getQualifiedOutputName();
@ -2165,7 +2165,7 @@ public class JavaGenerator extends AbstractGenerator {
String separator = " ";
for (EmbeddableColumnDefinition column : embeddable.getColumns()) {
final String columnType = out.ref(getJavaType(column.getReferencingColumn().getType(resolver())));
final String columnType = out.ref(getJavaType(column.getReferencingColumn().getType(resolver(out)), out));
final int position = column.getReferencingColumnPosition() - 1;
if (scala)
@ -2239,7 +2239,7 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : columns) {
result.append(separator);
result.append(out.ref(getJavaType(column.getType(resolver()))));
result.append(out.ref(getJavaType(column.getType(resolver(out)), out)));
if (kotlin)
result.append("?");
@ -2423,7 +2423,7 @@ public class JavaGenerator extends AbstractGenerator {
final String className = getStrategy().getJavaClassName(column.getContainer(), Mode.INTERFACE);
final String setterReturnType = generateFluentSetters() ? className : tokenVoid;
final String setter = getStrategy().getJavaSetterName(column, Mode.INTERFACE);
final String typeFull = getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE);
final String typeFull = getJavaType(column.getType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE);
final String type = out.ref(typeFull);
final String name = column.getQualifiedOutputName();
@ -2482,7 +2482,7 @@ public class JavaGenerator extends AbstractGenerator {
// TODO: The Mode should be INTERFACE
final String member = getStrategy().getJavaMemberName(column, Mode.POJO);
final String getter = getStrategy().getJavaGetterName(column, Mode.INTERFACE);
final String typeFull = getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE);
final String typeFull = getJavaType(column.getType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE);
final String type = out.ref(typeFull);
final String name = column.getQualifiedOutputName();
@ -2591,13 +2591,13 @@ public class JavaGenerator extends AbstractGenerator {
printRecordTypeMethod(out, udt);
for (AttributeDefinition attribute : udt.getAttributes()) {
final String attrTypeFull = getJavaType(attribute.getType(resolver()));
final String attrTypeFull = getJavaType(attribute.getType(resolver(out)), out);
final String attrType = out.ref(attrTypeFull);
final String attrTypeRef = getJavaTypeReference(attribute.getDatabase(), attribute.getType(resolver()), out);
final String attrTypeRef = getJavaTypeReference(attribute.getDatabase(), attribute.getType(resolver(out)), out);
final String attrId = out.ref(getStrategy().getJavaIdentifier(attribute), 2);
final String attrName = attribute.getName();
final List<String> converter = out.ref(list(attribute.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(attribute.getType(resolver()).getBinding()));
final List<String> converter = out.ref(list(attribute.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(attribute.getType(resolver(out)).getBinding()));
if (scala) {
printDeprecationIfUnknownType(out, attrTypeFull);
@ -2849,9 +2849,9 @@ public class JavaGenerator extends AbstractGenerator {
for (DomainDefinition domain : database.getDomains(schema)) {
final String id = getStrategy().getJavaIdentifier(domain);
final String domainTypeFull = getJavaType(domain.getType(resolver()));
final String domainTypeFull = getJavaType(domain.getType(resolver(out)), out);
final String domainType = out.ref(domainTypeFull);
final String domainTypeRef = getJavaTypeReference(domain.getDatabase(), domain.getType(resolver()), out);
final String domainTypeRef = getJavaTypeReference(domain.getDatabase(), domain.getType(resolver(out)), out);
out.javadoc("The domain <code>%s</code>.", domain.getQualifiedOutputName());
@ -3571,14 +3571,14 @@ public class JavaGenerator extends AbstractGenerator {
List<ColumnDefinition> keyColumns = key.getKeyColumns();
if (keyColumns.size() == 1) {
tType = getJavaType(keyColumns.get(0).getType(resolver()), Mode.POJO);
tType = getJavaType(keyColumns.get(0).getType(resolver(out)), out, Mode.POJO);
}
else if (keyColumns.size() <= Constants.MAX_ROW_DEGREE) {
String generics = "";
String separator = "";
for (ColumnDefinition column : keyColumns) {
generics += separator + out.ref(getJavaType(column.getType(resolver())));
generics += separator + out.ref(getJavaType(column.getType(resolver(out)), out));
separator = ", ";
}
@ -3692,7 +3692,7 @@ public class JavaGenerator extends AbstractGenerator {
for (ColumnDefinition column : table.getColumns()) {
final String colName = column.getOutputName();
final String colClass = getStrategy().getJavaClassName(column);
final String colTypeFull = getJavaType(column.getType(resolver()));
final String colTypeFull = getJavaType(column.getType(resolver(out)), out);
final String colType = out.ref(colTypeFull);
final String colIdentifier = out.ref(getStrategy().getFullJavaIdentifier(column), colRefSegments(column));
@ -3852,7 +3852,7 @@ public class JavaGenerator extends AbstractGenerator {
int maxLength = 0;
for (TypedElementDefinition<?> column : getTypedElements(tableUdtOrEmbeddable))
maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)).length());
maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)).length());
if (scala) {
out.println("%sclass %s(", (generatePojosAsScalaCaseClasses() ? "case " : ""), className);
@ -3863,7 +3863,7 @@ public class JavaGenerator extends AbstractGenerator {
separator,
generateImmutablePojos() ? "val" : "var",
getStrategy().getJavaMemberName(column, Mode.POJO),
out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)));
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)));
separator = ", ";
}
@ -3882,7 +3882,7 @@ public class JavaGenerator extends AbstractGenerator {
generateInterfaces() ? "override " : "",
generateImmutablePojos() ? "val" : "var",
member,
out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)));
out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)));
separator = ", ";
}
@ -3900,7 +3900,7 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableUdtOrEmbeddable)) {
out.println("private %s%s %s;",
generateImmutablePojos() ? "final " : "",
StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)), maxLength),
StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)), maxLength),
getStrategy().getJavaMemberName(column, Mode.POJO));
}
}
@ -3977,7 +3977,7 @@ public class JavaGenerator extends AbstractGenerator {
int maxLength = 0;
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)).length());
maxLength = Math.max(maxLength, out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)).length());
properties.add("\"" + escapeString(getStrategy().getJavaMemberName(column, Mode.POJO)) + "\"");
}
@ -4002,7 +4002,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println(separator1);
out.print("[[before=@][after= ][%s]]%s %s",
list(nullableAnnotation),
StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)), maxLength),
StringUtils.rightPad(out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)), maxLength),
getStrategy().getJavaMemberName(column, Mode.POJO));
separator1 = ",";
}
@ -4084,7 +4084,7 @@ public class JavaGenerator extends AbstractGenerator {
// Avoid ambiguities between a single-T-value constructor
// and the copy constructor
if (size == 1)
nulls.add("null: " + out.ref(getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO)));
nulls.add("null: " + out.ref(getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO)));
else
nulls.add("null");
@ -4159,7 +4159,7 @@ public class JavaGenerator extends AbstractGenerator {
}
private final void generatePojoGetter0(TypedElementDefinition<?> column, @SuppressWarnings("unused") int index, JavaWriter out) {
final String columnTypeFull = getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO);
final String columnTypeFull = getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO);
final String columnType = out.ref(columnTypeFull);
final String columnGetter = getStrategy().getJavaGetterName(column, Mode.POJO);
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
@ -4255,13 +4255,13 @@ public class JavaGenerator extends AbstractGenerator {
private final void generatePojoSetter0(TypedElementDefinition<?> column, @SuppressWarnings("unused") int index, JavaWriter out) {
final String className = getStrategy().getJavaClassName(column.getContainer(), Mode.POJO);
final String columnTypeFull = getJavaType(column.getType(resolver(Mode.POJO)), Mode.POJO);
final String columnTypeFull = getJavaType(column.getType(resolver(out, Mode.POJO)), out, Mode.POJO);
final String columnType = out.ref(columnTypeFull);
final String columnSetterReturnType = generateFluentSetters() ? className : tokenVoid;
final String columnSetter = getStrategy().getJavaSetterName(column, Mode.POJO);
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final boolean isUDT = column.getType(resolver()).isUDT();
final boolean isUDTArray = column.getType(resolver()).isArray() && database.getArray(column.getType(resolver()).getSchema(), column.getType(resolver()).getQualifiedUserType()).getElementType(resolver()).isUDT();
final boolean isUDT = column.getType(resolver(out)).isUDT();
final boolean isUDTArray = column.getType(resolver(out)).isArray() && database.getArray(column.getType(resolver(out)).getSchema(), column.getType(resolver(out)).getQualifiedUserType()).getElementType(resolver(out)).isUDT();
final String name = column.getQualifiedOutputName();
// We cannot have covariant setters for arrays because of type erasure
@ -4294,7 +4294,7 @@ public class JavaGenerator extends AbstractGenerator {
// [#3117] To avoid covariant setters on POJOs, we need to generate two setter overloads
if (generateInterfaces() && (isUDT || isUDTArray)) {
final String columnTypeInterface = out.ref(getJavaType(column.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE));
final String columnTypeInterface = out.ref(getJavaType(column.getType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE));
out.println();
@ -4323,9 +4323,9 @@ public class JavaGenerator extends AbstractGenerator {
out.println("this.%s = %s.into(new %s());", columnMember, columnMember, columnType);
}
else if (isUDTArray) {
final ArrayDefinition array = database.getArray(column.getType(resolver()).getSchema(), column.getType(resolver()).getQualifiedUserType());
final String componentType = out.ref(getJavaType(array.getElementType(resolver(Mode.POJO)), Mode.POJO));
final String componentTypeInterface = out.ref(getJavaType(array.getElementType(resolver(Mode.INTERFACE)), Mode.INTERFACE));
final ArrayDefinition array = database.getArray(column.getType(resolver(out)).getSchema(), column.getType(resolver(out)).getQualifiedUserType());
final String componentType = out.ref(getJavaType(array.getElementType(resolver(out, Mode.POJO)), out, Mode.POJO));
final String componentTypeInterface = out.ref(getJavaType(array.getElementType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE));
out.println("else {");
out.println("this.%s = new %s();", columnMember, ArrayList.class);
@ -4374,7 +4374,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("return false");
out.println("}");
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
out.println("else if (!%s.equals(%s, other.%s))", Arrays.class, columnMember, columnMember);
else
out.println("else if (!%s.equals(other.%s))", columnMember, columnMember);
@ -4404,7 +4404,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("return false");
out.println("}");
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
out.println("else if (!%s.equals(%s, other.%s))", Arrays.class, columnMember, columnMember);
else
out.println("else if (%s != other.%s)", columnMember, columnMember);
@ -4435,7 +4435,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("return false;");
out.println("}");
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
out.println("else if (!%s.equals(%s, other.%s))", Arrays.class, columnMember, columnMember);
else
out.println("else if (!%s.equals(other.%s))", columnMember, columnMember);
@ -4457,7 +4457,7 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
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);
@ -4474,7 +4474,7 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
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);
@ -4492,7 +4492,7 @@ public class JavaGenerator extends AbstractGenerator {
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
if (getJavaType(column.getType(resolver())).endsWith("[]"))
if (getJavaType(column.getType(resolver(out)), out).endsWith("[]"))
out.println("result = prime * result + ((this.%s == null) ? 0 : %s.hashCode(this.%s));", columnMember, Arrays.class, columnMember);
else
out.println("result = prime * result + ((this.%s == null) ? 0 : this.%s.hashCode());", columnMember, columnMember);
@ -4524,7 +4524,7 @@ public class JavaGenerator extends AbstractGenerator {
String separator = "";
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final String columnType = getJavaType(column.getType(resolver()));
final String columnType = getJavaType(column.getType(resolver(out)), out);
if (columnType.equals("scala.Array[scala.Byte]"))
out.println("sb%s.append(\"[binary...]\")", separator);
@ -4548,7 +4548,7 @@ public class JavaGenerator extends AbstractGenerator {
String separator = "";
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final String columnType = getJavaType(column.getType(resolver()));
final String columnType = getJavaType(column.getType(resolver(out)), out);
final boolean array = columnType.endsWith("[]");
if (array && columnType.equals("kotlin.ByteArray"))
@ -4575,7 +4575,7 @@ public class JavaGenerator extends AbstractGenerator {
String separator = "";
for (TypedElementDefinition<?> column : getTypedElements(tableOrUDT)) {
final String columnMember = getStrategy().getJavaMemberName(column, Mode.POJO);
final String columnType = getJavaType(column.getType(resolver()));
final String columnType = getJavaType(column.getType(resolver(out)), out);
final boolean array = columnType.endsWith("[]");
if (array && columnType.equals("byte[]"))
@ -4746,13 +4746,13 @@ public class JavaGenerator extends AbstractGenerator {
printRecordTypeMethod(out, table);
for (ColumnDefinition column : table.getColumns()) {
final String columnTypeFull = getJavaType(column.getType(resolver()));
final String columnTypeFull = getJavaType(column.getType(resolver(out)), out);
final String columnType = out.ref(columnTypeFull);
final String columnTypeRef = getJavaTypeReference(column.getDatabase(), column.getType(resolver()), out);
final String columnTypeRef = getJavaTypeReference(column.getDatabase(), column.getType(resolver(out)), out);
final String columnId = out.ref(getStrategy().getJavaIdentifier(column), colRefSegments(column));
final String columnName = column.getName();
final List<String> converter = out.ref(list(column.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(column.getType(resolver()).getBinding()));
final List<String> converter = out.ref(list(column.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(column.getType(resolver(out)).getBinding()));
final String columnVisibility =
@ -5010,7 +5010,7 @@ public class JavaGenerator extends AbstractGenerator {
// The identity column
if (identity != null) {
final String identityTypeFull = getJavaType(identity.getColumn().getType(resolver()));
final String identityTypeFull = getJavaType(identity.getColumn().getType(resolver(out)), out);
final String identityType = out.ref(identityTypeFull);
if (scala) {
@ -5233,7 +5233,7 @@ public class JavaGenerator extends AbstractGenerator {
if ((p.matcher(column.getName()).matches() ||
p.matcher(column.getQualifiedName()).matches())) {
final String columnTypeFull = getJavaType(column.getType(resolver()));
final String columnTypeFull = getJavaType(column.getType(resolver(out)), out);
final String columnType = out.ref(columnTypeFull);
final String columnId = getStrategy().getJavaIdentifier(column);
@ -5269,7 +5269,7 @@ public class JavaGenerator extends AbstractGenerator {
if ((p.matcher(column.getName()).matches() ||
p.matcher(column.getQualifiedName()).matches())) {
final String columnTypeFull = getJavaType(column.getType(resolver()));
final String columnTypeFull = getJavaType(column.getType(resolver(out)), out);
final String columnType = out.ref(columnTypeFull);
final String columnId = getStrategy().getJavaIdentifier(column);
@ -5456,9 +5456,9 @@ public class JavaGenerator extends AbstractGenerator {
String separator = " ";
for (ParameterDefinition parameter : parameters) {
final String paramArgName = getStrategy().getJavaMemberName(parameter);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver()), out);
final List<String> converter = out.ref(list(parameter.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver()).getBinding()));
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver(out)), out);
final List<String> converter = out.ref(list(parameter.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver(out)).getBinding()));
out.print(separator);
@ -5480,9 +5480,9 @@ public class JavaGenerator extends AbstractGenerator {
String separator = " ";
for (ParameterDefinition parameter : parameters) {
final String paramArgName = getStrategy().getJavaMemberName(parameter);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver()), out);
final List<String> converter = out.ref(list(parameter.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver()).getBinding()));
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver(out)), out);
final List<String> converter = out.ref(list(parameter.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver(out)).getBinding()));
if (parametersAsField)
out.println("%s%s", separator, paramArgName);
@ -5503,9 +5503,9 @@ public class JavaGenerator extends AbstractGenerator {
String separator = " ";
for (ParameterDefinition parameter : parameters) {
final String paramArgName = getStrategy().getJavaMemberName(parameter);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver()), out);
final List<String> converter = out.ref(list(parameter.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver()).getBinding()));
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver(out)), out);
final List<String> converter = out.ref(list(parameter.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver(out)).getBinding()));
out.print(separator);
@ -5633,7 +5633,15 @@ public class JavaGenerator extends AbstractGenerator {
throw new IllegalArgumentException();
switch (GenerationUtil.expressionType(converter.get(0))) {
case CONSTRUCTOR_REFERENCE:
return "[[before=, ][new %s()]]";
switch (language) {
case KOTLIN:
return "[[before=, ][%s()]]";
case JAVA:
case SCALA:
default:
return "[[before=, ][new %s()]]";
}
case EXPRESSION:
return "[[before=, ][%s]]";
default:
@ -5648,7 +5656,15 @@ public class JavaGenerator extends AbstractGenerator {
throw new IllegalArgumentException();
switch (GenerationUtil.expressionType(converter.get(0))) {
case CONSTRUCTOR_REFERENCE:
return "[[before=.asConvertedDataType(][after=)][new %s()]]";
switch (language) {
case KOTLIN:
return "[[before=.asConvertedDataType(][after=)][%s()]]";
case JAVA:
case SCALA:
default:
return "[[before=.asConvertedDataType(][after=)][new %s()]]";
}
case EXPRESSION:
return "[[before=.asConvertedDataType(][after=)][%s]]";
default:
@ -5715,13 +5731,13 @@ public class JavaGenerator extends AbstractGenerator {
boolean qualifySequenceClassReferences = containsConflictingDefinition(schema, database.getSequences(schema));
for (SequenceDefinition sequence : database.getSequences(schema)) {
final String seqTypeFull = getJavaType(sequence.getType(resolver()));
final String seqTypeFull = getJavaType(sequence.getType(resolver(out)), out);
final String seqType = out.ref(seqTypeFull);
final String seqId = getStrategy().getJavaIdentifier(sequence);
final String seqName = sequence.getOutputName();
final String schemaId = qualifySequenceClassReferences ? getStrategy().getFullJavaIdentifier(schema)
: out.ref(getStrategy().getFullJavaIdentifier(schema), 2);
final String typeRef = getJavaTypeReference(sequence.getDatabase(), sequence.getType(resolver()), out);
final String typeRef = getJavaTypeReference(sequence.getDatabase(), sequence.getType(resolver(out)), out);
if (!printDeprecationIfUnknownType(out, seqTypeFull))
out.javadoc("The sequence <code>%s</code>", sequence.getQualifiedOutputName());
@ -6388,21 +6404,21 @@ public class JavaGenerator extends AbstractGenerator {
}
String nullable = "";
if (!column.getType(resolver()).isNullable())
if (!column.getType(resolver(out)).isNullable())
nullable = ", nullable = false";
String length = "";
String precision = "";
String scale = "";
if (column.getType(resolver()).getLength() > 0) {
length = ", length = " + column.getType(resolver()).getLength();
if (column.getType(resolver(out)).getLength() > 0) {
length = ", length = " + column.getType(resolver(out)).getLength();
}
else if (column.getType(resolver()).getPrecision() > 0) {
precision = ", precision = " + column.getType(resolver()).getPrecision();
else if (column.getType(resolver(out)).getPrecision() > 0) {
precision = ", precision = " + column.getType(resolver(out)).getPrecision();
if (column.getType(resolver()).getScale() > 0) {
scale = ", scale = " + column.getType(resolver()).getScale();
if (column.getType(resolver(out)).getScale() > 0) {
scale = ", scale = " + column.getType(resolver(out)).getScale();
}
}
@ -6434,15 +6450,15 @@ public class JavaGenerator extends AbstractGenerator {
private void printValidationAnnotation(JavaWriter out, TypedElementDefinition<?> column) {
if (generateValidationAnnotations()) {
DataTypeDefinition type = column.getType(resolver());
DataTypeDefinition type = column.getType(resolver(out));
// [#5128] defaulted columns are nullable in Java
if (!column.getType(resolver()).isNullable() &&
!column.getType(resolver()).isDefaulted() &&
!column.getType(resolver()).isIdentity())
if (!column.getType(resolver(out)).isNullable() &&
!column.getType(resolver(out)).isDefaulted() &&
!column.getType(resolver(out)).isIdentity())
out.println("@%s", out.ref("javax.validation.constraints.NotNull"));
String javaType = getJavaType(type);
String javaType = getJavaType(type, out);
if ("java.lang.String".equals(javaType) || "byte[]".equals(javaType)) {
int length = type.getLength();
@ -6487,7 +6503,7 @@ public class JavaGenerator extends AbstractGenerator {
private boolean printDeprecationIfUnknownTypes(JavaWriter out, Collection<? extends ParameterDefinition> params) {
for (ParameterDefinition param : params)
if (printDeprecationIfUnknownType(out, getJavaType(param.getType(resolver()))))
if (printDeprecationIfUnknownType(out, getJavaType(param.getType(resolver(out)), out)))
return true;
return false;
@ -6520,20 +6536,20 @@ public class JavaGenerator extends AbstractGenerator {
final String className = getStrategy().getJavaClassName(routine);
final String returnTypeFull = (routine.getReturnValue() == null)
? Void.class.getName()
: getJavaType(routine.getReturnType(resolver()));
: getJavaType(routine.getReturnType(resolver(out)), out);
final String returnType = (routine.getReturnValue() == null)
? Void.class.getName()
: out.ref(returnTypeFull);
final List<String> returnTypeRef = list((routine.getReturnValue() != null)
? getJavaTypeReference(database, routine.getReturnType(resolver()), out)
? getJavaTypeReference(database, routine.getReturnType(resolver(out)), out)
: null);
final List<String> returnConverter = out.ref(list(
(routine.getReturnValue() != null)
? routine.getReturnType(resolver()).getConverter()
? routine.getReturnType(resolver(out)).getConverter()
: null));
final List<String> returnBinding = out.ref(list(
(routine.getReturnValue() != null)
? routine.getReturnType(resolver()).getBinding()
? routine.getReturnType(resolver(out)).getBinding()
: null));
final List<String> interfaces = out.ref(getStrategy().getJavaClassImplements(routine, Mode.DEFAULT));
@ -6545,15 +6561,15 @@ public class JavaGenerator extends AbstractGenerator {
if (scala) {
out.println("object %s {", className);
for (ParameterDefinition parameter : routine.getAllParameters()) {
final String paramTypeFull = getJavaType(parameter.getType(resolver()));
final String paramTypeFull = getJavaType(parameter.getType(resolver(out)), out);
final String paramType = out.ref(paramTypeFull);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver()), out);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver(out)), out);
final String paramId = out.ref(getStrategy().getJavaIdentifier(parameter), 2);
final String paramName = parameter.getName();
final String isDefaulted = parameter.isDefaulted() ? "true" : "false";
final String isUnnamed = parameter.isUnnamed() ? "true" : "false";
final List<String> converter = out.ref(list(parameter.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver()).getBinding()));
final List<String> converter = out.ref(list(parameter.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver(out)).getBinding()));
if (!printDeprecationIfUnknownType(out, paramTypeFull))
out.javadoc("The parameter <code>%s</code>.[[before= ][%s]]", parameter.getQualifiedOutputName(), list(escapeEntities(comment(parameter))));
@ -6590,15 +6606,15 @@ public class JavaGenerator extends AbstractGenerator {
out.println("companion object {");
for (ParameterDefinition parameter : routine.getAllParameters()) {
final String paramTypeFull = getJavaType(parameter.getType(resolver()));
final String paramTypeFull = getJavaType(parameter.getType(resolver(out)), out);
final String paramType = out.ref(paramTypeFull);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver()), out);
final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver(out)), out);
final String paramId = getStrategy().getJavaIdentifier(parameter);
final String paramName = parameter.getName();
final String isDefaulted = parameter.isDefaulted() ? "true" : "false";
final String isUnnamed = parameter.isUnnamed() ? "true" : "false";
final List<String> converter = out.ref(list(parameter.getType(resolver()).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver()).getBinding()));
final List<String> converter = out.ref(list(parameter.getType(resolver(out)).getConverter()));
final List<String> binding = out.ref(list(parameter.getType(resolver(out)).getBinding()));
if (!printDeprecationIfUnknownType(out, paramTypeFull))
out.javadoc("The parameter <code>%s</code>.[[before= ][%s]]", parameter.getQualifiedOutputName(), list(escapeEntities(comment(parameter))));
@ -6718,8 +6734,8 @@ public class JavaGenerator extends AbstractGenerator {
for (ParameterDefinition parameter : routine.getInParameters()) {
final String setterReturnType = generateFluentSetters() ? className : tokenVoid;
final String setter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT);
final String numberValue = parameter.getType(resolver()).isGenericNumberType() ? "Number" : "Value";
final String numberField = parameter.getType(resolver()).isGenericNumberType() ? "Number" : "Field";
final String numberValue = parameter.getType(resolver(out)).isGenericNumberType() ? "Number" : "Value";
final String numberField = parameter.getType(resolver(out)).isGenericNumberType() ? "Number" : "Field";
final String paramId = getStrategy().getJavaIdentifier(parameter);
final String paramName = "value".equals(paramId) ? "value_" : "value";
@ -6727,14 +6743,14 @@ public class JavaGenerator extends AbstractGenerator {
if (scala) {
out.println("def %s(%s: %s) : Unit = set%s(%s.%s, %s)",
setter, paramName, refNumberType(out, parameter.getType(resolver())), numberValue, className, paramId, paramName);
setter, paramName, refNumberType(out, parameter.getType(resolver(out))), numberValue, className, paramId, paramName);
}
else if (kotlin) {
out.println("fun %s(%s: %s?) = set%s(%s, %s)",
setter, paramName, refNumberType(out, parameter.getType(resolver())), numberValue, paramId, paramName);
setter, paramName, refNumberType(out, parameter.getType(resolver(out))), numberValue, paramId, paramName);
}
else {
out.println("public void %s(%s %s) {", setter, varargsIfArray(refNumberType(out, parameter.getType(resolver()))), paramName);
out.println("public void %s(%s %s) {", setter, varargsIfArray(refNumberType(out, parameter.getType(resolver(out)))), paramName);
out.println("set%s(%s, %s);", numberValue, paramId, paramName);
out.println("}");
}
@ -6743,7 +6759,7 @@ public class JavaGenerator extends AbstractGenerator {
out.javadoc("Set the <code>%s</code> parameter to the function to be used with a {@link org.jooq.Select} statement", parameter.getOutputName());
if (scala) {
out.println("def %s(field: %s[%s]): %s = {", setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver())), setterReturnType);
out.println("def %s(field: %s[%s]): %s = {", setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))), setterReturnType);
out.println("set%s(%s.%s, field)", numberField, className, paramId);
if (generateFluentSetters())
@ -6752,7 +6768,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("}");
}
else if (kotlin) {
out.println("fun %s(field: %s<%s?>): %s {", setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver())), setterReturnType);
out.println("fun %s(field: %s<%s?>): %s {", setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))), setterReturnType);
out.println("set%s(%s, field)", numberField, paramId);
if (generateFluentSetters())
@ -6761,7 +6777,7 @@ public class JavaGenerator extends AbstractGenerator {
out.println("}");
}
else {
out.println("public %s %s(%s<%s> field) {", setterReturnType, setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver())));
out.println("public %s %s(%s<%s> field) {", setterReturnType, setter, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))));
out.println("set%s(%s, field);", numberField, paramId);
if (generateFluentSetters())
@ -6778,7 +6794,7 @@ public class JavaGenerator extends AbstractGenerator {
if (isOutParameter && !isReturnValue) {
final String paramName = parameter.getOutputName();
final String paramTypeFull = getJavaType(parameter.getType(resolver()));
final String paramTypeFull = getJavaType(parameter.getType(resolver(out)), out);
final String paramType = out.ref(paramTypeFull);
final String paramGetter = getStrategy().getJavaGetterName(parameter, Mode.DEFAULT);
final String paramId = getStrategy().getJavaIdentifier(parameter);
@ -6833,7 +6849,7 @@ public class JavaGenerator extends AbstractGenerator {
if (parametersAsField && function.getInParameters().isEmpty())
return;
final String functionTypeFull = getJavaType(function.getReturnType(resolver()));
final String functionTypeFull = getJavaType(function.getReturnType(resolver(out)), out);
final String functionType = out.ref(functionTypeFull);
final String className = out.ref(getStrategy().getFullJavaClassName(function));
final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f");
@ -6955,21 +6971,21 @@ public class JavaGenerator extends AbstractGenerator {
if (scala) {
if (parametersAsField)
out.println("%s%s: %s[%s]", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver())));
out.println("%s%s: %s[%s]", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))));
else
out.println("%s%s: %s", separator, memberName, refNumberType(out, parameter.getType(resolver())));
out.println("%s%s: %s", separator, memberName, refNumberType(out, parameter.getType(resolver(out))));
}
else if (kotlin) {
if (parametersAsField)
out.println("%s%s: %s<%s?>", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver())));
out.println("%s%s: %s<%s?>", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))));
else
out.println("%s%s: %s?", separator, memberName, refNumberType(out, parameter.getType(resolver())));
out.println("%s%s: %s?", separator, memberName, refNumberType(out, parameter.getType(resolver(out))));
}
else {
if (parametersAsField)
out.println("%s%s<%s> %s", separator, Field.class, refExtendsNumberType(out, parameter.getType(resolver())), memberName);
out.println("%s%s<%s> %s", separator, Field.class, refExtendsNumberType(out, parameter.getType(resolver(out))), memberName);
else
out.println("%s%s %s", separator, refNumberType(out, parameter.getType(resolver())), memberName);
out.println("%s%s %s", separator, refNumberType(out, parameter.getType(resolver(out))), memberName);
}
separator = ", ";
@ -7002,7 +7018,7 @@ public class JavaGenerator extends AbstractGenerator {
final String className = out.ref(getStrategy().getFullJavaClassName(function));
final String functionName = function.getQualifiedOutputName();
final String functionTypeFull = getJavaType(function.getReturnType(resolver()));
final String functionTypeFull = getJavaType(function.getReturnType(resolver(out)), out);
final String functionType = out.ref(functionTypeFull);
final String methodName = getStrategy().getJavaMethodName(function, Mode.DEFAULT);
@ -7037,7 +7053,7 @@ public class JavaGenerator extends AbstractGenerator {
if (instance && parameter.equals(function.getInParameters().get(0)))
continue;
final String paramType = refNumberType(out, parameter.getType(resolver()));
final String paramType = refNumberType(out, parameter.getType(resolver(out)));
final String paramMember = getStrategy().getJavaMemberName(parameter);
if (scala)
@ -7100,7 +7116,7 @@ public class JavaGenerator extends AbstractGenerator {
final String localVar = disambiguateJavaMemberName(procedure.getInParameters(), "p");
final List<ParameterDefinition> outParams = list(procedure.getReturnValue(), procedure.getOutParameters());
final String methodName = getStrategy().getJavaMethodName(procedure, Mode.DEFAULT);
final String firstOutParamType = outParams.size() == 1 ? out.ref(getJavaType(outParams.get(0).getType(resolver()))) : "";
final String firstOutParamType = outParams.size() == 1 ? out.ref(getJavaType(outParams.get(0).getType(resolver(out)), out)) : "";
if (!printDeprecationIfUnknownTypes(out, procedure.getAllParameters()))
out.javadoc("Call <code>%s</code>", procedure.getQualifiedOutputName());
@ -7134,7 +7150,7 @@ public class JavaGenerator extends AbstractGenerator {
continue;
final String memberName = getStrategy().getJavaMemberName(parameter);
final String typeName = refNumberType(out, parameter.getType(resolver()));
final String typeName = refNumberType(out, parameter.getType(resolver(out)));
if (scala)
out.println("%s%s: %s", separator, memberName, typeName);
@ -7178,13 +7194,13 @@ public class JavaGenerator extends AbstractGenerator {
final String getter = parameter == procedure.getReturnValue()
? "getReturnValue"
: getStrategy().getJavaGetterName(parameter, Mode.DEFAULT);
final boolean isUDT = parameter.getType(resolver()).isUDT();
final boolean isUDT = parameter.getType(resolver(out)).isUDT();
if (instance) {
// [#3117] Avoid funny call-site ambiguity if this is a UDT that is implemented by an interface
if (generateInterfaces() && isUDT) {
final String columnTypeInterface = out.ref(getJavaType(parameter.getType(resolver(Mode.INTERFACE)), Mode.INTERFACE));
final String columnTypeInterface = out.ref(getJavaType(parameter.getType(resolver(out, Mode.INTERFACE)), out, Mode.INTERFACE));
if (scala)
out.println("from(%s.%s.asInstanceOf[%s])", localVar, getter, columnTypeInterface);
@ -7547,52 +7563,18 @@ public class JavaGenerator extends AbstractGenerator {
}
}
@Deprecated
protected String getExtendsNumberType(DataTypeDefinition type) {
return getNumberType(type, scala ? "_ <: " : "? extends ");
}
protected String refExtendsNumberType(JavaWriter out, DataTypeDefinition type) {
if (type.isGenericNumberType()) {
if (type.isGenericNumberType())
return (scala ? "_ <: " : "? extends ") + out.ref(Number.class);
}
else {
return out.ref(getJavaType(type));
}
}
@Deprecated
protected String getNumberType(DataTypeDefinition type) {
if (type.isGenericNumberType()) {
return Number.class.getName();
}
else {
return getJavaType(type);
}
else
return out.ref(getJavaType(type, out));
}
protected String refNumberType(JavaWriter out, DataTypeDefinition type) {
if (type.isGenericNumberType()) {
if (type.isGenericNumberType())
return out.ref(Number.class);
}
else {
return out.ref(getJavaType(type));
}
}
@Deprecated
protected String getNumberType(DataTypeDefinition type, String prefix) {
if (type.isGenericNumberType()) {
return prefix + Number.class.getName();
}
else {
return getJavaType(type);
}
}
@Deprecated
protected String getSimpleJavaType(DataTypeDefinition type) {
return GenerationUtil.getSimpleJavaType(getJavaType(type));
else
return out.ref(getJavaType(type, out));
}
protected String getJavaTypeReference(Database db, DataTypeDefinition type, JavaWriter out) {
@ -7631,32 +7613,71 @@ public class JavaGenerator extends AbstractGenerator {
}
}
protected JavaTypeResolver resolver() {
return new JavaTypeResolver() {
@Override
public String resolve(DataTypeDefinition type) {
return getJavaType(type);
private class Resolver implements JavaTypeResolver {
private final JavaWriter out;
private final Mode mode;
Resolver(JavaWriter out, Mode mode) {
this.out = out;
this.mode = mode;
}
@Override
public String resolve(DataTypeDefinition type) {
return mode == null ? getJavaType(type, out) : getJavaType(type, out, mode);
}
@Override
public String classLiteral(String type) {
String rawtype = type.replaceAll("<.*>", "").replaceAll("\\[.*\\]", "");
boolean generic = !rawtype.equals(type);
switch (language) {
case SCALA:
return "classOf[" + out.ref(type) + "]";
case KOTLIN:
return out.ref(rawtype) + "::class.java" + (generic ? (" as " + out.ref(Class.class) + "<" + out.ref(type) + ">") : "");
case JAVA:
default:
return (generic ? "" : "(" + out.ref(Class.class) + ") ") + out.ref(rawtype) + ".class";
}
};
}
@Override
public String ref(String type) {
return out.ref(type);
}
@Override
public String ref(Class<?> type) {
return out.ref(type);
}
}
protected JavaTypeResolver resolver(final Mode udtMode) {
return new JavaTypeResolver() {
@Override
public String resolve(DataTypeDefinition type) {
return getJavaType(type, udtMode);
}
};
private static final String classLiteral(String type) {
String rawtype = type.replaceAll("<.*>", "").replaceAll("\\[.*\\]", "");
return (rawtype.equals(type) ? "" : "(java.lang.Class) ") + rawtype + ".class";
}
protected String getJavaType(DataTypeDefinition type) {
return getJavaType(type, Mode.RECORD);
protected JavaTypeResolver resolver(JavaWriter out) {
return new Resolver(out, null);
}
protected String getJavaType(DataTypeDefinition type, Mode udtMode) {
protected JavaTypeResolver resolver(JavaWriter out, Mode mode) {
return new Resolver(out, mode);
}
protected String getJavaType(DataTypeDefinition type, JavaWriter out) {
return getJavaType(type, out, Mode.RECORD);
}
protected String getJavaType(DataTypeDefinition type, JavaWriter out, Mode udtMode) {
return getType(
type.getDatabase(),
type.getSchema(),
out,
type.getType(),
type.getPrecision(),
type.getScale(),
@ -7670,23 +7691,23 @@ public class JavaGenerator extends AbstractGenerator {
* @deprecated - 3.9.0 - [#330] - Use {@link #getType(Database, SchemaDefinition, String, int, int, Name, String, String)} instead.
*/
@Deprecated
protected String getType(Database db, SchemaDefinition schema, String t, int p, int s, String u, String javaType, String defaultType) {
return getType(db, schema, t, p, s, name(u), javaType, defaultType);
protected String getType(Database db, SchemaDefinition schema, JavaWriter out, String t, int p, int s, String u, String javaType, String defaultType) {
return getType(db, schema, out, t, p, s, name(u), javaType, defaultType);
}
protected String getType(Database db, SchemaDefinition schema, String t, int p, int s, Name u, String javaType, String defaultType) {
return getType(db, schema, t, p, s, u, javaType, defaultType, Mode.RECORD);
protected String getType(Database db, SchemaDefinition schema, JavaWriter out, String t, int p, int s, Name u, String javaType, String defaultType) {
return getType(db, schema, out, t, p, s, u, javaType, defaultType, Mode.RECORD);
}
/**
* @deprecated - 3.9.0 - [#330] - Use {@link #getType(Database, SchemaDefinition, String, int, int, Name, String, String, Mode)} instead.
*/
@Deprecated
protected String getType(Database db, SchemaDefinition schema, String t, int p, int s, String u, String javaType, String defaultType, Mode udtMode) {
return getType(db, schema, t, p, s, name(u), javaType, defaultType, udtMode);
protected String getType(Database db, SchemaDefinition schema, JavaWriter out, String t, int p, int s, String u, String javaType, String defaultType, Mode udtMode) {
return getType(db, schema, out, t, p, s, name(u), javaType, defaultType, udtMode);
}
protected String getType(Database db, SchemaDefinition schema, String t, int p, int s, Name u, String javaType, String defaultType, Mode udtMode) {
protected String getType(Database db, SchemaDefinition schema, JavaWriter out, String t, int p, int s, Name u, String javaType, String defaultType, Mode udtMode) {
String type = defaultType;
// Custom types
@ -7703,28 +7724,28 @@ public class JavaGenerator extends AbstractGenerator {
// [#10309] TODO: The schema should be taken from baseType, if available. Might be different than the argument schema.
// When can this happen?
if (scala)
type = "scala.Array[" + getType(db, schema, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "]";
type = "scala.Array[" + getType(db, schema, out, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "]";
else if (kotlin)
type = "kotlin.Array<" + getType(db, schema, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "?>";
type = "kotlin.Array<" + getType(db, schema, out, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "?>";
else
type = getType(db, schema, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "[]";
type = getType(db, schema, out, baseType.last(), p, s, baseType, javaType, defaultType, udtMode) + "[]";
}
// Check for Oracle-style VARRAY types
else if (db.getArray(schema, u) != null) {
boolean udtArray = db.getArray(schema, u).getElementType(resolver()).isUDT();
boolean udtArray = db.getArray(schema, u).getElementType(resolver(out)).isUDT();
if (udtMode == Mode.POJO || (udtMode == Mode.INTERFACE && !udtArray)) {
if (scala)
type = "java.util.List[" + getJavaType(db.getArray(schema, u).getElementType(resolver(udtMode)), udtMode) + "]";
type = "java.util.List[" + getJavaType(db.getArray(schema, u).getElementType(resolver(out, udtMode)), out, udtMode) + "]";
else
type = "java.util.List<" + getJavaType(db.getArray(schema, u).getElementType(resolver(udtMode)), udtMode) + ">";
type = "java.util.List<" + getJavaType(db.getArray(schema, u).getElementType(resolver(out, udtMode)), out, udtMode) + ">";
}
else if (udtMode == Mode.INTERFACE) {
if (scala)
type = "java.util.List[_ <:" + getJavaType(db.getArray(schema, u).getElementType(resolver(udtMode)), udtMode) + "]";
type = "java.util.List[_ <:" + getJavaType(db.getArray(schema, u).getElementType(resolver(out, udtMode)), out, udtMode) + "]";
else
type = "java.util.List<? extends " + getJavaType(db.getArray(schema, u).getElementType(resolver(udtMode)), udtMode) + ">";
type = "java.util.List<? extends " + getJavaType(db.getArray(schema, u).getElementType(resolver(out, udtMode)), out, udtMode) + ">";
}
else {
type = getStrategy().getFullJavaClassName(db.getArray(schema, u), Mode.RECORD);
@ -7733,7 +7754,7 @@ public class JavaGenerator extends AbstractGenerator {
// Check for DOMAIN types
else if (db.getDomain(schema, u) != null) {
type = getJavaType(db.getDomain(schema, u).getDefinedType());
type = getJavaType(db.getDomain(schema, u).getDefinedType(), out);
}
// Check for ENUM types
@ -7801,7 +7822,7 @@ public class JavaGenerator extends AbstractGenerator {
if (db.getArray(schema, u) != null) {
ArrayDefinition array = database.getArray(schema, u);
sb.append(getJavaTypeReference(db, array.getElementType(resolver()), out));
sb.append(getJavaTypeReference(db, array.getElementType(resolver(out)), out));
sb.append(".asArrayDataType(");
sb.append(classOf(getStrategy().getFullJavaClassName(array, Mode.RECORD)));
sb.append(")");
@ -7954,11 +7975,6 @@ public class JavaGenerator extends AbstractGenerator {
return result;
}
@Deprecated
protected boolean match(DataTypeDefinition type1, DataTypeDefinition type2) {
return getJavaType(type1).equals(getJavaType(type2));
}
@SafeVarargs
private static final <T> List<T> list(T... objects) {
List<T> result = new ArrayList<>();

View File

@ -22,6 +22,7 @@ import org.jooq.example.jpa.jooq.DefaultSchema;
import org.jooq.example.jpa.jooq.Keys;
import org.jooq.example.jpa.jooq.tables.records.ActorRecord;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
@ -31,7 +32,7 @@ import org.jooq.impl.TableImpl;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Actor extends TableImpl<ActorRecord> {
private static final long serialVersionUID = -837715027;
private static final long serialVersionUID = -976374127;
/**
* The reference instance of <code>ACTOR</code>
@ -49,17 +50,17 @@ public class Actor extends TableImpl<ActorRecord> {
/**
* The column <code>ACTOR.ACTORID</code>.
*/
public final TableField<ActorRecord, Integer> ACTORID = createField(DSL.name("ACTORID"), org.jooq.impl.SQLDataType.INTEGER.nullable(false).identity(true), this, "");
public final TableField<ActorRecord, Integer> ACTORID = createField(DSL.name("ACTORID"), SQLDataType.INTEGER.nullable(false).identity(true), this, "");
/**
* The column <code>ACTOR.FIRSTNAME</code>.
*/
public final TableField<ActorRecord, String> FIRSTNAME = createField(DSL.name("FIRSTNAME"), org.jooq.impl.SQLDataType.VARCHAR(255), this, "");
public final TableField<ActorRecord, String> FIRSTNAME = createField(DSL.name("FIRSTNAME"), SQLDataType.VARCHAR(255), this, "");
/**
* The column <code>ACTOR.LASTNAME</code>.
*/
public final TableField<ActorRecord, String> LASTNAME = createField(DSL.name("LASTNAME"), org.jooq.impl.SQLDataType.VARCHAR(255), this, "");
public final TableField<ActorRecord, String> LASTNAME = createField(DSL.name("LASTNAME"), SQLDataType.VARCHAR(255), this, "");
private Actor(Name alias, Table<ActorRecord> aliased) {
this(alias, aliased, null);

View File

@ -23,6 +23,7 @@ import org.jooq.example.jpa.jooq.DefaultSchema;
import org.jooq.example.jpa.jooq.Keys;
import org.jooq.example.jpa.jooq.tables.records.FilmRecord;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
@ -32,7 +33,7 @@ import org.jooq.impl.TableImpl;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Film extends TableImpl<FilmRecord> {
private static final long serialVersionUID = 380882165;
private static final long serialVersionUID = 1891488862;
/**
* The reference instance of <code>FILM</code>
@ -50,32 +51,32 @@ public class Film extends TableImpl<FilmRecord> {
/**
* The column <code>FILM.FILMID</code>.
*/
public final TableField<FilmRecord, Integer> FILMID = createField(DSL.name("FILMID"), org.jooq.impl.SQLDataType.INTEGER.nullable(false).identity(true), this, "");
public final TableField<FilmRecord, Integer> FILMID = createField(DSL.name("FILMID"), SQLDataType.INTEGER.nullable(false).identity(true), this, "");
/**
* The column <code>FILM.LENGTH</code>.
*/
public final TableField<FilmRecord, Integer> LENGTH = createField(DSL.name("LENGTH"), org.jooq.impl.SQLDataType.INTEGER, this, "");
public final TableField<FilmRecord, Integer> LENGTH = createField(DSL.name("LENGTH"), SQLDataType.INTEGER, this, "");
/**
* The column <code>FILM.RELEASE_YEAR</code>.
*/
public final TableField<FilmRecord, Year> RELEASE_YEAR = createField(DSL.name("RELEASE_YEAR"), org.jooq.impl.SQLDataType.INTEGER, this, "", new org.jooq.impl.JPAConverter(org.jooq.example.jpa.converters.YearConverter.class));
public final TableField<FilmRecord, Year> RELEASE_YEAR = createField(DSL.name("RELEASE_YEAR"), SQLDataType.INTEGER, this, "", new org.jooq.impl.JPAConverter(org.jooq.example.jpa.converters.YearConverter.class));
/**
* The column <code>FILM.TITLE</code>.
*/
public final TableField<FilmRecord, String> TITLE = createField(DSL.name("TITLE"), org.jooq.impl.SQLDataType.VARCHAR(255), this, "");
public final TableField<FilmRecord, String> TITLE = createField(DSL.name("TITLE"), SQLDataType.VARCHAR(255), this, "");
/**
* The column <code>FILM.LANGUAGE_LANGUAGEID</code>.
*/
public final TableField<FilmRecord, Integer> LANGUAGE_LANGUAGEID = createField(DSL.name("LANGUAGE_LANGUAGEID"), org.jooq.impl.SQLDataType.INTEGER, this, "");
public final TableField<FilmRecord, Integer> LANGUAGE_LANGUAGEID = createField(DSL.name("LANGUAGE_LANGUAGEID"), SQLDataType.INTEGER, this, "");
/**
* The column <code>FILM.ORIGINALLANGUAGE_LANGUAGEID</code>.
*/
public final TableField<FilmRecord, Integer> ORIGINALLANGUAGE_LANGUAGEID = createField(DSL.name("ORIGINALLANGUAGE_LANGUAGEID"), org.jooq.impl.SQLDataType.INTEGER, this, "");
public final TableField<FilmRecord, Integer> ORIGINALLANGUAGE_LANGUAGEID = createField(DSL.name("ORIGINALLANGUAGE_LANGUAGEID"), SQLDataType.INTEGER, this, "");
private Film(Name alias, Table<FilmRecord> aliased) {
this(alias, aliased, null);

View File

@ -21,6 +21,7 @@ import org.jooq.example.jpa.jooq.DefaultSchema;
import org.jooq.example.jpa.jooq.Keys;
import org.jooq.example.jpa.jooq.tables.records.FilmActorRecord;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
@ -30,7 +31,7 @@ import org.jooq.impl.TableImpl;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class FilmActor extends TableImpl<FilmActorRecord> {
private static final long serialVersionUID = 1729998951;
private static final long serialVersionUID = -1780609702;
/**
* The reference instance of <code>FILM_ACTOR</code>
@ -48,12 +49,12 @@ public class FilmActor extends TableImpl<FilmActorRecord> {
/**
* The column <code>FILM_ACTOR.FILMS_FILMID</code>.
*/
public final TableField<FilmActorRecord, Integer> FILMS_FILMID = createField(DSL.name("FILMS_FILMID"), org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
public final TableField<FilmActorRecord, Integer> FILMS_FILMID = createField(DSL.name("FILMS_FILMID"), SQLDataType.INTEGER.nullable(false), this, "");
/**
* The column <code>FILM_ACTOR.ACTORS_ACTORID</code>.
*/
public final TableField<FilmActorRecord, Integer> ACTORS_ACTORID = createField(DSL.name("ACTORS_ACTORID"), org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
public final TableField<FilmActorRecord, Integer> ACTORS_ACTORID = createField(DSL.name("ACTORS_ACTORID"), SQLDataType.INTEGER.nullable(false), this, "");
private FilmActor(Name alias, Table<FilmActorRecord> aliased) {
this(alias, aliased, null);

View File

@ -22,6 +22,7 @@ import org.jooq.example.jpa.jooq.DefaultSchema;
import org.jooq.example.jpa.jooq.Keys;
import org.jooq.example.jpa.jooq.tables.records.LanguageRecord;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
@ -31,7 +32,7 @@ import org.jooq.impl.TableImpl;
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Language extends TableImpl<LanguageRecord> {
private static final long serialVersionUID = -1201806006;
private static final long serialVersionUID = -985164033;
/**
* The reference instance of <code>LANGUAGE</code>
@ -49,12 +50,12 @@ public class Language extends TableImpl<LanguageRecord> {
/**
* The column <code>LANGUAGE.LANGUAGEID</code>.
*/
public final TableField<LanguageRecord, Integer> LANGUAGEID = createField(DSL.name("LANGUAGEID"), org.jooq.impl.SQLDataType.INTEGER.nullable(false).identity(true), this, "");
public final TableField<LanguageRecord, Integer> LANGUAGEID = createField(DSL.name("LANGUAGEID"), SQLDataType.INTEGER.nullable(false).identity(true), this, "");
/**
* The column <code>LANGUAGE.NAME</code>.
*/
public final TableField<LanguageRecord, String> NAME = createField(DSL.name("NAME"), org.jooq.impl.SQLDataType.VARCHAR(255), this, "");
public final TableField<LanguageRecord, String> NAME = createField(DSL.name("NAME"), SQLDataType.VARCHAR(255), this, "");
private Language(Name alias, Table<LanguageRecord> aliased) {
this(alias, aliased, null);

View File

@ -49,6 +49,7 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jooq.Converter;
import org.jooq.DataType;
import org.jooq.Name;
import org.jooq.exception.SQLDialectNotSupportedException;
@ -128,7 +129,31 @@ public abstract class AbstractTypedElementDefinition<T extends Definition>
@Override
public DataTypeDefinition getType() {
if (type == null)
type = mapDefinedType(container, this, definedType, null);
type = mapDefinedType(container, this, definedType, new JavaTypeResolver() {
// [#10553] TODO: This was introduced as a dummy implementation
// to make [#10534] work. jOOQ-meta should not have any
// such implementation
@Override
public String resolve(DataTypeDefinition type) {
return "java.lang.Object";
}
@Override
public String ref(Class<?> type) {
return type.getName();
}
@Override
public String ref(String type) {
return type;
}
@Override
public String classLiteral(String type) {
return type + ".class";
}
});
return type;
}
@ -228,12 +253,12 @@ public abstract class AbstractTypedElementDefinition<T extends Definition>
if (Boolean.TRUE.equals(customType.isEnumConverter()) ||
EnumConverter.class.getName().equals(customType.getConverter())) {
String tType = tType(db, resolver, definedType);
converter = "new " + EnumConverter.class.getName() + "<" + tType + ", " + uType + ">(" + classLiteral(tType) + ", " + classLiteral(uType) + ")";
converter = "new " + EnumConverter.class.getName() + "<" + tType + ", " + uType + ">(" + resolver.classLiteral(tType) + ", " + resolver.classLiteral(uType) + ")";
}
else if (customType.getLambdaConverter() != null) {
LambdaConverter c = customType.getLambdaConverter();
String tType = tType(db, resolver, definedType);
converter = "org.jooq.Converter.of" + (!FALSE.equals(c.isNullable()) ? "Nullable" : "") + "(" + classLiteral(tType) + ", " + classLiteral(uType) + ", " + c.getFrom() + ", " + c.getTo() + ")";
converter = resolver.ref(Converter.class) + ".of" + (!FALSE.equals(c.isNullable()) ? "Nullable" : "") + "(" + resolver.classLiteral(tType) + ", " + resolver.classLiteral(uType) + ", " + c.getFrom() + ", " + c.getTo() + ")";
}
else if (!StringUtils.isBlank(customType.getConverter())) {
converter = customType.getConverter();
@ -318,11 +343,6 @@ public abstract class AbstractTypedElementDefinition<T extends Definition>
}
}
private static final String classLiteral(String type) {
String rawtype = type.replaceAll("<.*>", "").replaceAll("\\[.*\\]", "");
return (rawtype.equals(type) ? "" : "(java.lang.Class) ") + rawtype + ".class";
}
@SuppressWarnings("deprecation")
public static final CustomType customType(Database db, ForcedType forcedType) {
String name = forcedType.getName();

View File

@ -46,11 +46,34 @@ package org.jooq.meta;
*
* @author Lukas Eder
*/
@FunctionalInterface
public interface JavaTypeResolver {
/**
* Resolve a Java type from a {@link DataTypeDefinition}.
*/
String resolve(DataTypeDefinition type);
/**
* Get a language dependent class literal for a type.
* <p>
* <table>
* <tr><th>Language</th><th>Output for <code>String</code></th></tr>
* <tr><td>Java</td><td><code>String.class</code></td></tr>
* <tr><td>Scala</td><td><code>classOf[String]</code></td></tr>
* <tr><td>Kotlin</td><td><code>String::class.java</code></td></tr>
* </table>
*/
String classLiteral(String type);
/**
* Get the unqualified type reference and add an import for the qualified
* type, if necessary.
*/
String ref(String type);
/**
* Get the unqualified type reference and add an import for the qualified
* type, if necessary.
*/
String ref(Class<?> type);
}