diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java index 93857e4fbd..171fa2f987 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -90,6 +90,7 @@ abstract class AbstractGenerator implements Generator { boolean generateEmbeddables = true; boolean generateRecords = true; boolean generateRecordsImplementingRecordN = true; + boolean generateEnumsAsScalaSealedTraits = false; boolean generatePojos = false; boolean generatePojosAsJavaRecordClasses = false; boolean generatePojosAsScalaCaseClasses = true; @@ -155,10 +156,11 @@ abstract class AbstractGenerator implements Generator { protected GeneratorStrategyWrapper strategy; protected String targetEncoding = "UTF-8"; protected boolean targetClean = true; - final Language language; + final Language languageConfigured; + Language language; AbstractGenerator(Language language) { - this.language = language; + this.languageConfigured = this.language = language; } enum Language { @@ -515,6 +517,16 @@ abstract class AbstractGenerator implements Generator { this.generateRecordsImplementingRecordN = generateRecordsImplementingRecordN; } + @Override + public boolean generateEnumsAsScalaSealedTraits() { + return generateEnumsAsScalaSealedTraits; + } + + @Override + public void setGenerateEnumsAsScalaSealedTraits(boolean generateEnumsAsScalaSealedTraits) { + this.generateEnumsAsScalaSealedTraits = generateEnumsAsScalaSealedTraits; + } + @Override public boolean generatePojos() { diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java index 0750871b26..9871fbcdf2 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -722,6 +722,8 @@ public class GenerationTool { generator.setGenerateRecords(g.getGenerate().isRecords()); if (g.getGenerate().isRecordsImplementingRecordN() != null) generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN()); + if (g.getGenerate().isEnumsAsScalaSealedTraits() != null) + generator.setGenerateEnumsAsScalaSealedTraits(g.getGenerate().isEnumsAsScalaSealedTraits()); if (g.getGenerate().isPojos() != null) generator.setGeneratePojos(g.getGenerate().isPojos()); if (g.getGenerate().isPojosAsJavaRecordClasses() != null) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java index e662641f42..5b18d49475 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationUtil.java @@ -174,6 +174,8 @@ class GenerationUtil { ))); private static Set KOTLIN_KEYWORDS = unmodifiableSet(new HashSet<>(asList( + + // Hard keywords https://kotlinlang.org/docs/reference/keyword-reference.html "as", "break", "class", @@ -202,7 +204,56 @@ class GenerationUtil { "var", "when", "while", - "yield" + "yield", + + // Soft keywords (most seem not to produce conflicts in generated code) + // "catch", + "constructor", + // "delegate", + // "dynamic", + // "field", + // "file", + // "finally", + // "get", + // "import", + "init", + // "param", + // "property", + // "receiver", + // "set", + // "setparam", + // "where", + + // Modifier keywords + "actual", + "abstract", + "annotation", + "companion", + "const", + "crossinline", + "data", + "enum", + "expect", + "external", + "final", + "infix", + "inline", + "inner", + "internal", + "lateinit", + "noinline", + "open", + "operator", + "out", + "override", + "private", + "protected", + "public", + "reified", + "sealed", + "suspend", + "tailrec", + "vararg" ))); private static Set SCALA_WHITESPACE = unmodifiableSet(new HashSet<>(asList( diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index d6042e2f45..6adcd2ce6c 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -365,6 +365,26 @@ public interface Generator { */ void setGenerateRecordsImplementingRecordN(boolean generateRecordsImplementingRecordN); + /** + * Whether enums generated as Scala sealed traits by the + * {@link ScalaGenerator}. + * + * @deprecated - [#10998] - 3.15.0 - This is maintained for backwards + * compatibility only. Do not reuse this feature, if possible + */ + @Deprecated + boolean generateEnumsAsScalaSealedTraits(); + + /** + * Whether enums generated as Scala sealed traits by the + * {@link ScalaGenerator}. + * + * @deprecated - [#10998] - 3.15.0 - This is maintained for backwards + * compatibility only. Do not reuse this feature, if possible + */ + @Deprecated + void setGenerateEnumsAsScalaSealedTraits(boolean generateEnumsAsScalaSealedTraits); + /** * Whether POJO's should be generated in addition to records */ 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 97ed1037c1..4d8fa37113 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -277,9 +277,10 @@ public class JavaGenerator extends AbstractGenerator { */ private Set directoriesNotForRemoval = new LinkedHashSet<>(); - private final boolean java; - private final boolean scala; - private final boolean kotlin; + private boolean scala; + private final boolean scalaConfigured; + private boolean kotlin; + private final boolean kotlinConfigured; private final String semicolon; private final String emptyparens; private final String tokenVoid; @@ -326,9 +327,8 @@ public class JavaGenerator extends AbstractGenerator { JavaGenerator(Language language) { super(language); - this.scala = (language == SCALA); - this.kotlin = (language == KOTLIN); - this.java = (language == JAVA); + this.scalaConfigured = this.scala = (language == SCALA); + this.kotlinConfigured = this.kotlin = (language == KOTLIN); this.tokenVoid = (scala || kotlin ? "Unit" : "void"); this.semicolon = (scala || kotlin ? "" : ";"); this.emptyparens = (scala ? "" : "()"); @@ -3467,10 +3467,24 @@ public class JavaGenerator extends AbstractGenerator { protected void generateDomains(SchemaDefinition schema) {} protected void generateEnum(EnumDefinition e) { - JavaWriter out = newJavaWriter(getFile(e, Mode.ENUM)); - log.info("Generating ENUM", out.file().getName()); - generateEnum(e, out); - closeJavaWriter(out); + boolean s = scala; + Language l = language; + + try { + if (!generateEnumsAsScalaSealedTraits()) { + scala = false; + language = l == SCALA ? JAVA : l; + } + + JavaWriter out = newJavaWriter(getFile(e, Mode.ENUM)); + log.info("Generating ENUM", out.file().getName()); + generateEnum(e, out); + closeJavaWriter(out); + } + finally { + scala = s; + language = l; + } } protected void generateEnum(EnumDefinition e, JavaWriter out) { @@ -3605,10 +3619,18 @@ public class JavaGenerator extends AbstractGenerator { // [#2135] Only the PostgreSQL database supports schema-scoped enum types out.overrideInherit(); out.println("%s%s getSchema() {", visibilityPublic(), Schema.class); - out.println("return %s;", - enumHasNoSchema - ? "null" - : out.ref(getStrategy().getFullJavaIdentifier(e.getSchema()), 2)); + + // [#10998] The ScalaGenerator's schema reference is a method + if (scalaConfigured) { + out.println("return %s%s;", + enumHasNoSchema ? "null" : getStrategy().getFullJavaIdentifier(e.getSchema()).replaceFirst("^(.*)\\.(.*?)$", "$1\\$.MODULE\\$.$2"), + enumHasNoSchema ? "" : "()" + ); + } + else { + out.println("return %s;", + enumHasNoSchema ? "null" : out.ref(getStrategy().getFullJavaIdentifier(e.getSchema()), 2)); + } out.println("}"); out.overrideInherit(); diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java index 20f65cd6d8..5ccc4e633a 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/jaxb/Generate.java @@ -89,6 +89,8 @@ public class Generate implements Serializable, XMLAppendable @XmlElement(defaultValue = "true") protected Boolean recordsImplementingRecordN = true; @XmlElement(defaultValue = "false") + protected Boolean enumsAsScalaSealedTraits = false; + @XmlElement(defaultValue = "false") protected Boolean pojos = false; @XmlElement(defaultValue = "false") protected Boolean pojosEqualsAndHashCode = false; @@ -854,6 +856,32 @@ public class Generate implements Serializable, XMLAppendable this.recordsImplementingRecordN = value; } + /** + * @deprecated Activate the legacy Scala sealed trait enum emulation + * + * @return + * possible object is + * {@link Boolean } + * + */ + @Deprecated + public Boolean isEnumsAsScalaSealedTraits() { + return enumsAsScalaSealedTraits; + } + + /** + * Sets the value of the enumsAsScalaSealedTraits property. + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + @Deprecated + public void setEnumsAsScalaSealedTraits(Boolean value) { + this.enumsAsScalaSealedTraits = value; + } + /** * Generate POJOs. * @@ -2361,6 +2389,11 @@ public class Generate implements Serializable, XMLAppendable return this; } + public Generate withEnumsAsScalaSealedTraits(Boolean value) { + setEnumsAsScalaSealedTraits(value); + return this; + } + public Generate withPojos(Boolean value) { setPojos(value); return this; @@ -2704,6 +2737,7 @@ public class Generate implements Serializable, XMLAppendable builder.append("embeddables", embeddables); builder.append("records", records); builder.append("recordsImplementingRecordN", recordsImplementingRecordN); + builder.append("enumsAsScalaSealedTraits", enumsAsScalaSealedTraits); builder.append("pojos", pojos); builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode); builder.append("pojosToString", pojosToString); @@ -3034,6 +3068,15 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (enumsAsScalaSealedTraits == null) { + if (other.enumsAsScalaSealedTraits!= null) { + return false; + } + } else { + if (!enumsAsScalaSealedTraits.equals(other.enumsAsScalaSealedTraits)) { + return false; + } + } if (pojos == null) { if (other.pojos!= null) { return false; @@ -3582,6 +3625,7 @@ public class Generate implements Serializable, XMLAppendable result = ((prime*result)+((embeddables == null)? 0 :embeddables.hashCode())); result = ((prime*result)+((records == null)? 0 :records.hashCode())); result = ((prime*result)+((recordsImplementingRecordN == null)? 0 :recordsImplementingRecordN.hashCode())); + result = ((prime*result)+((enumsAsScalaSealedTraits == null)? 0 :enumsAsScalaSealedTraits.hashCode())); result = ((prime*result)+((pojos == null)? 0 :pojos.hashCode())); result = ((prime*result)+((pojosEqualsAndHashCode == null)? 0 :pojosEqualsAndHashCode.hashCode())); result = ((prime*result)+((pojosToString == null)? 0 :pojosToString.hashCode())); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd index 2355415939..9926e7a015 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd @@ -1511,6 +1511,18 @@ jOOQ version used for source code.]]> + + + + + + + + @java.lang.Deprecated + @java.lang.Deprecated + + +