[jOOQ/jOOQ#10998] Add <enumsAsScalaSealedTraits/> to let ScalaGenerator
generate Java enums or Dotty enums
This commit is contained in:
parent
5be1a2e475
commit
c4d3644872
@ -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() {
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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()));
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user