[jOOQ/jOOQ#17148] Support Scala 3 enum types

This commit is contained in:
Lukas Eder 2024-10-22 08:59:40 +02:00
parent 809e0c1cf9
commit 8aee20e2b0
6 changed files with 153 additions and 50 deletions

View File

@ -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 <generateEnumsAsScalaSealedTraits/> 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

View File

@ -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)

View File

@ -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
*/

View File

@ -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));

View File

@ -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()));

View File

@ -2671,6 +2671,10 @@ jOOQ API, without adding custom data type bindings to them.]]></jxb:javadoc></jx
</appinfo>
</annotation>
</element>
<element name="enumsAsScalaEnums" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate enums as Scala 3.0 enums (if Scala 3 is supported).]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="pojos" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate POJOs.]]></jxb:javadoc></jxb:property></appinfo></annotation>