[jOOQ/jOOQ#10998] Add <enumsAsScalaSealedTraits/> to let ScalaGenerator

generate Java enums or Dotty enums
This commit is contained in:
Lukas Eder 2020-11-20 13:50:06 +01:00
parent 5be1a2e475
commit c4d3644872
7 changed files with 180 additions and 17 deletions

View File

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

View File

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

View File

@ -174,6 +174,8 @@ class GenerationUtil {
)));
private static Set<String> 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<Character> SCALA_WHITESPACE = unmodifiableSet(new HashSet<>(asList(

View File

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

View File

@ -277,9 +277,10 @@ public class JavaGenerator extends AbstractGenerator {
*/
private Set<File> 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();

View File

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

View File

@ -1511,6 +1511,18 @@ jOOQ version used for source code.]]></jxb:javadoc></jxb:property></appinfo></an
<element name="recordsImplementingRecordN" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Generate TableRecord classes that implement Record[N] super types]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="enumsAsScalaSealedTraits" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation>
<appinfo>
<jxb:property>
<jxb:javadoc><![CDATA[@deprecated Activate the legacy Scala sealed trait enum emulation]]></jxb:javadoc>
</jxb:property>
<annox:annotate target="getter">@java.lang.Deprecated</annox:annotate>
<annox:annotate target="setter">@java.lang.Deprecated</annox:annotate>
</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>