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.]]>
+
+
+
+