From a4728bafe9dc82b49e1a29fb2f288faba4b528b2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 5 Nov 2020 17:49:48 +0100 Subject: [PATCH] [jOOQ/jOOQ#10778] Add support for Packages, UDTs, and ArrayRecord in KotlinGenerator --- .../codegen/DefaultGeneratorStrategy.java | 2 + .../java/org/jooq/codegen/JavaGenerator.java | 101 ++++++++++++------ 2 files changed, 70 insertions(+), 33 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java index a3552c2bdc..2402d31d63 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/DefaultGeneratorStrategy.java @@ -351,6 +351,8 @@ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { packageName = packageName + "." + className + ".references"; else if (RoutineDefinition.class.isAssignableFrom(objectType)) packageName = packageName + "." + className + ".references"; + else if (UDTDefinition.class.isAssignableFrom(objectType)) + packageName = packageName + "." + className + ".references"; else packageName = packageName + "." + className; } diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index 5bb0552804..920faf1d89 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -796,6 +796,10 @@ public class JavaGenerator extends AbstractGenerator { + + + + @@ -2821,7 +2825,16 @@ public class JavaGenerator extends AbstractGenerator { if (scala) { - out.println("class %s extends %s[%s](\"%s\", null, %s, %s)[[before= with ][separator= with ][%s]] {", className, UDTImpl.class, recordType, udt.getOutputName(), packageId, synthetic, interfaces); + out.println("class %s extends %s[%s](\"%s\", null, %s, %s)[[before= with ][separator= with ][%s]] {", className, UDTImpl.class, recordType, escapeString(udt.getOutputName()), packageId, synthetic, interfaces); + } + else if (kotlin) { + out.println("public open class %s : %s<%s>(\"%s\", null, %s, %s)[[before=, ][%s]] {", className, UDTImpl.class, recordType, escapeString(udt.getOutputName()), packageId, synthetic, interfaces); + + out.println(); + out.println("public companion object {"); + out.javadoc("The reference instance of %s", udt.getQualifiedOutputName()); + out.println("public val %s: %s = %s()", getStrategy().getJavaIdentifier(udt), className, className); + out.println("}"); } else { out.println("public class %s extends %s<%s>[[before= implements ][%s]] {", className, UDTImpl.class, recordType, interfaces); @@ -2840,18 +2853,18 @@ public class JavaGenerator extends AbstractGenerator { final List converter = out.ref(list(attribute.getType(resolver(out)).getConverter())); final List binding = out.ref(list(attribute.getType(resolver(out)).getBinding())); - if (scala) { - printDeprecationIfUnknownType(out, attrTypeFull); - out.println("private val %s: %s[%s, %s] = %s.createField(%s.name(\"%s\"), %s, this, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ")", - attrId, UDTField.class, recordType, attrType, UDTImpl.class, DSL.class, attrName, attrTypeRef, escapeString(""), converter, binding); - } - else { - if (!printDeprecationIfUnknownType(out, attrTypeFull)) - out.javadoc("The attribute %s.[[before= ][%s]]", attribute.getQualifiedOutputName(), list(escapeEntities(comment(attribute)))); + if (!printDeprecationIfUnknownType(out, attrTypeFull)) + out.javadoc("The attribute %s.[[before= ][%s]]", attribute.getQualifiedOutputName(), list(escapeEntities(comment(attribute)))); + if (scala) + out.println("private val %s: %s[%s, %s] = %s.createField(%s.name(\"%s\"), %s, this, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ")", + attrId, UDTField.class, recordType, attrType, UDTImpl.class, DSL.class, escapeString(attrName), attrTypeRef, escapeString(""), converter, binding); + else if (kotlin) + out.println("public val %s: %s<%s, %s> = %s.createField(%s.name(\"%s\"), %s, this, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ")", + attrId, UDTField.class, recordType, attrType, UDTImpl.class, DSL.class, escapeString(attrName), attrTypeRef, escapeString(""), converter, binding); + else out.println("public static final %s<%s, %s> %s = createField(%s.name(\"%s\"), %s, %s, \"%s\"" + converterTemplate(converter) + converterTemplate(binding) + ");", - UDTField.class, recordType, attrType, attrId, DSL.class, attrName, attrTypeRef, udtId, escapeString(""), converter, binding); - } + UDTField.class, recordType, attrType, attrId, DSL.class, escapeString(attrName), attrTypeRef, udtId, escapeString(""), converter, binding); } // [#799] Oracle UDT's can have member procedures @@ -2878,7 +2891,7 @@ public class JavaGenerator extends AbstractGenerator { } } - if (scala) { + if (scala || kotlin) { } else { out.javadoc(NO_FURTHER_INSTANCES_ALLOWED); @@ -2891,6 +2904,10 @@ public class JavaGenerator extends AbstractGenerator { out.println(); out.println("override def getSchema: %s = %s", Schema.class, schemaId); } + else if (kotlin) { + out.println(); + out.println("public override fun getSchema(): %s = %s", Schema.class, schemaId); + } else { out.overrideInherit(); out.println("public %s getSchema() {", Schema.class); @@ -3319,6 +3336,22 @@ public class JavaGenerator extends AbstractGenerator { + + + + + + + + + + + + + + + + @@ -3748,6 +3781,16 @@ public class JavaGenerator extends AbstractGenerator { + + + + + + + + + + @@ -6037,16 +6080,20 @@ public class JavaGenerator extends AbstractGenerator { } } - private String escapeString(String comment) { + private String escapeString(String string) { - if (comment == null) + if (string == null) return null; // [#3450] Escape also the escape sequence, among other things that break Java strings. - String result = comment.replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("\r", "\\r"); + String result = string.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r"); + + // [#10869] Prevent string interpolation in Kotlin + if (kotlin) + result = result.replace("$", "\\$"); // [#10007] [#10318] Very long strings cannot be handled by the javac compiler. int max = 16384; @@ -7095,20 +7142,8 @@ public class JavaGenerator extends AbstractGenerator { } - if (routine.getOverload() != null) { - if (scala) - out.println("setOverloaded(true)"); - else if (kotlin) - out.println("overloaded = true"); - else - out.println("setOverloaded(true);"); - } - - - - - - + if (routine.getOverload() != null) + out.println("setOverloaded(true)%s", semicolon); @@ -7979,7 +8014,7 @@ public class JavaGenerator extends AbstractGenerator { protected String refExtendsNumberType(JavaWriter out, DataTypeDefinition type) { if (type.isGenericNumberType()) - return (scala ? "_ <: " : "? extends ") + out.ref(Number.class); + return (scala ? "_ <: " : kotlin ? "out ": "? extends ") + out.ref(Number.class); else return out.ref(getJavaType(type, out)); }