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 bb8dad0230..a0613a34a4 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -106,6 +106,7 @@ abstract class AbstractGenerator implements Generator { boolean generateRecords = true; boolean generateRecordsImplementingRecordN = false; boolean generateEnumsAsScalaSealedTraits = false; + boolean generateEnumsAsScalaEnums = true; boolean generatePojos = false; boolean generatePojosAsJavaRecordClasses = false; boolean generatePojosAsScalaCaseClasses = true; @@ -674,6 +675,19 @@ abstract class AbstractGenerator implements Generator { @Override public void setGenerateEnumsAsScalaSealedTraits(boolean generateEnumsAsScalaSealedTraits) { this.generateEnumsAsScalaSealedTraits = generateEnumsAsScalaSealedTraits; + + if (generateEnumsAsScalaSealedTraits) + log.warn("Deprecation", "The flag is deprecated and will be removed in the future."); + } + + @Override + public boolean generateEnumsAsScalaEnums() { + return generateEnumsAsScalaEnums && language == Language.SCALA_3; + } + + @Override + public void setGenerateEnumsAsScalaEnums(boolean generateEnumsAsScalaEnums) { + this.generateEnumsAsScalaEnums = generateEnumsAsScalaEnums; } @Override 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 2f3da4fccd..4c56cbf37f 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -814,6 +814,8 @@ public class GenerationTool { generator.setGenerateRecordsImplementingRecordN(g.getGenerate().isRecordsImplementingRecordN()); if (g.getGenerate().isEnumsAsScalaSealedTraits() != null) generator.setGenerateEnumsAsScalaSealedTraits(g.getGenerate().isEnumsAsScalaSealedTraits()); + if (g.getGenerate().isEnumsAsScalaEnums() != null) + generator.setGenerateEnumsAsScalaEnums(g.getGenerate().isEnumsAsScalaEnums()); 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/Generator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java index 088f5b20a5..7c58cb5d3b 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -515,6 +515,20 @@ public interface Generator { @Deprecated void setGenerateEnumsAsScalaSealedTraits(boolean generateEnumsAsScalaSealedTraits); + /** + * Whether enums are generated as Scala 3 enums by the + * {@link ScalaGenerator}, if Scala 3 is supported. + */ + @Deprecated + boolean generateEnumsAsScalaEnums(); + + /** + * Whether enums are generated as Scala 3 enums by the + * {@link ScalaGenerator}, if Scala 3 is supported. + */ + @Deprecated + void setGenerateEnumsAsScalaEnums(boolean generateEnumsAsScalaEnums); + /** * 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 9a2b6e824e..96052408cd 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -4487,7 +4487,7 @@ public class JavaGenerator extends AbstractGenerator { Language l = language; try { - if (!generateEnumsAsScalaSealedTraits()) { + if (!generateEnumsAsScalaSealedTraits() && !generateEnumsAsScalaEnums()) { scala = false; language = l.isScala() ? JAVA : l; getStrategy().setTargetLanguage(language); @@ -4520,63 +4520,86 @@ public class JavaGenerator extends AbstractGenerator { boolean noCatalog = enumHasNoSchema || noSchema || !generateDefaultCatalog(e.getCatalog()); if (scala) { - out.println("object %s {", className); - out.println(); + if (generateEnumsAsScalaEnums()) { + out.println("%senum %s(val literal: %s) extends %s[%s] with %s[[before= with ][separator= with ][%s]] {", visibility(), className, String.class, Enum.class, className, EnumType.class, interfaces); - for (String identifier : identifiers) - out.println("val %s: %s = %s.%s", scalaWhitespaceSuffix(identifier), className, getStrategy().getJavaPackageName(e), identifier); + for (int i = 0; i < literals.size(); i++) + out.println("case %s extends %s(\"%s\")", identifiers.get(i), className, escapeString(literals.get(i))); - out.println(); - out.println("def values: %s[%s] = %s(", - out.ref("scala.Array"), - className, - out.ref("scala.Array")); + out.println("%soverride def getCatalog: %s = %s", + visibilityPublic(), Catalog.class, noCatalog ? "null" : "getSchema.getCatalog"); - for (int i = 0; i < identifiers.size(); i++) { - out.print((i > 0 ? ", " : " ")); - out.println(identifiers.get(i)); - } + // [#2135] Only the PostgreSQL database supports schema-scoped enum types + out.println("%soverride def getSchema: %s = %s", + visibilityPublic(), Schema.class, noSchema ? "null" : out.ref(getStrategy().getFullJavaIdentifier(e.getSchema()), 2)); - out.println(")"); - out.println(); + out.println("%soverride def getName: %s = %s", + visibilityPublic(), String.class, e.isSynthetic() ? "null" : "\"" + escapeString(e.getName()) + "\""); - out.println("def valueOf(s: %s): %s = s match {", String.class, className); - for (int i = 0; i < identifiers.size(); i++) { - out.println("case \"%s\" => %s", escapeString(literals.get(i)), identifiers.get(i)); - } - out.println("case _ => throw new %s()", IllegalArgumentException.class); - out.println("}"); - out.println("}"); + out.println("%soverride def getLiteral: String = literal", visibilityPublic()); - out.println(); - out.println("sealed trait %s extends %s[[before= with ][separator= with ][%s]] {", className, EnumType.class, interfaces); - - if (noCatalog) - out.println("override def getCatalog: %s = null", Catalog.class); - else - out.println("override def getCatalog: %s = if (getSchema == null) null else getSchema().getCatalog()", Catalog.class); - - // [#2135] Only the PostgreSQL database supports schema-scoped enum types - out.println("override def getSchema: %s = %s", - Schema.class, - noSchema - ? "null" - : out.ref(getStrategy().getFullJavaIdentifier(e.getSchema()), 2)); - out.println("override def getName: %s = %s", - String.class, - e.isSynthetic() ? "null" : "\"" + escapeString(e.getName()) + "\""); - - generateEnumClassFooter(e, out); - out.println("}"); - - for (int i = 0; i < literals.size(); i++) { - out.println(); - out.println("case object %s extends %s {", identifiers.get(i), className); - out.println("override def getLiteral: %s = \"%s\"", - String.class, - literals.get(i)); + generateEnumClassFooter(e, out); out.println("}"); } + else { + out.println("object %s {", className); + out.println(); + + for (String identifier : identifiers) + out.println("val %s: %s = %s.%s", scalaWhitespaceSuffix(identifier), className, getStrategy().getJavaPackageName(e), identifier); + + out.println(); + out.println("def values: %s[%s] = %s(", + out.ref("scala.Array"), + className, + out.ref("scala.Array")); + + for (int i = 0; i < identifiers.size(); i++) { + out.print((i > 0 ? ", " : " ")); + out.println(identifiers.get(i)); + } + + out.println(")"); + out.println(); + + out.println("def valueOf(s: %s): %s = s match {", String.class, className); + for (int i = 0; i < identifiers.size(); i++) { + out.println("case \"%s\" => %s", escapeString(literals.get(i)), identifiers.get(i)); + } + out.println("case _ => throw new %s()", IllegalArgumentException.class); + out.println("}"); + out.println("}"); + + out.println(); + out.println("sealed trait %s extends %s[[before= with ][separator= with ][%s]] {", className, EnumType.class, interfaces); + + if (noCatalog) + out.println("override def getCatalog: %s = null", Catalog.class); + else + out.println("override def getCatalog: %s = if (getSchema == null) null else getSchema().getCatalog()", Catalog.class); + + // [#2135] Only the PostgreSQL database supports schema-scoped enum types + out.println("override def getSchema: %s = %s", + Schema.class, + noSchema + ? "null" + : out.ref(getStrategy().getFullJavaIdentifier(e.getSchema()), 2)); + out.println("override def getName: %s = %s", + String.class, + e.isSynthetic() ? "null" : "\"" + escapeString(e.getName()) + "\""); + + generateEnumClassFooter(e, out); + out.println("}"); + + for (int i = 0; i < literals.size(); i++) { + out.println(); + out.println("case object %s extends %s {", identifiers.get(i), className); + out.println("override def getLiteral: %s = \"%s\"", + String.class, + literals.get(i)); + out.println("}"); + } + } } else if (kotlin) { interfaces.add(out.ref(EnumType.class)); 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 986b41999c..0baacd6814 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 @@ -110,6 +110,8 @@ public class Generate implements Serializable, XMLAppendable protected Boolean recordsImplementingRecordN = false; @XmlElement(defaultValue = "false") protected Boolean enumsAsScalaSealedTraits = false; + @XmlElement(defaultValue = "true") + protected Boolean enumsAsScalaEnums = true; @XmlElement(defaultValue = "false") protected Boolean pojos = false; @XmlElement(defaultValue = "true") @@ -1217,6 +1219,30 @@ public class Generate implements Serializable, XMLAppendable this.enumsAsScalaSealedTraits = value; } + /** + * Generate enums as Scala 3.0 enums (if Scala 3 is supported). + * + * @return + * possible object is + * {@link Boolean } + * + */ + public Boolean isEnumsAsScalaEnums() { + return enumsAsScalaEnums; + } + + /** + * Generate enums as Scala 3.0 enums (if Scala 3 is supported). + * + * @param value + * allowed object is + * {@link Boolean } + * + */ + public void setEnumsAsScalaEnums(Boolean value) { + this.enumsAsScalaEnums = value; + } + /** * Generate POJOs. * @@ -3597,6 +3623,15 @@ public class Generate implements Serializable, XMLAppendable return this; } + /** + * Generate enums as Scala 3.0 enums (if Scala 3 is supported). + * + */ + public Generate withEnumsAsScalaEnums(Boolean value) { + setEnumsAsScalaEnums(value); + return this; + } + /** * Generate POJOs. * @@ -4426,6 +4461,7 @@ public class Generate implements Serializable, XMLAppendable builder.append("records", records); builder.append("recordsImplementingRecordN", recordsImplementingRecordN); builder.append("enumsAsScalaSealedTraits", enumsAsScalaSealedTraits); + builder.append("enumsAsScalaEnums", enumsAsScalaEnums); builder.append("pojos", pojos); builder.append("pojosEqualsAndHashCode", pojosEqualsAndHashCode); builder.append("pojosToString", pojosToString); @@ -4882,6 +4918,15 @@ public class Generate implements Serializable, XMLAppendable return false; } } + if (enumsAsScalaEnums == null) { + if (other.enumsAsScalaEnums!= null) { + return false; + } + } else { + if (!enumsAsScalaEnums.equals(other.enumsAsScalaEnums)) { + return false; + } + } if (pojos == null) { if (other.pojos!= null) { return false; @@ -5684,6 +5729,7 @@ public class Generate implements Serializable, XMLAppendable 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)+((enumsAsScalaEnums == null)? 0 :enumsAsScalaEnums.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/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd index 452c505fc0..9d2c621368 100644 --- a/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd +++ b/jOOQ-meta/src/main/resources/org/jooq/meta/xsd/jooq-codegen-3.20.0.xsd @@ -2671,6 +2671,10 @@ jOOQ API, without adding custom data type bindings to them.]]> + + + +