[jOOQ/jOOQ#11912] More general and configurable fix

This commit is contained in:
Lukas Eder 2021-06-10 15:49:01 +02:00
parent fd361a9787
commit 91e5d938ff
6 changed files with 171 additions and 100 deletions

View File

@ -64,100 +64,101 @@ abstract class AbstractGenerator implements Generator {
private static final JooqLogger log = JooqLogger.getLogger(AbstractGenerator.class);
boolean generateDeprecated = true;
boolean generateDeprecationOnUnknownTypes = true;
boolean generateIndexes = true;
boolean generateRelations = true;
boolean generateImplicitJoinPathsToOne = true;
boolean generateInstanceFields = true;
VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT;
boolean generateGeneratedAnnotation = false;
GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK;
boolean generateGeneratedAnnotationDate = true;
boolean generateNonnullAnnotation = false;
String generatedNonnullAnnotationType = "javax.annotation.Nonnull";
boolean generateNullableAnnotation = false;
String generatedNullableAnnotationType = "javax.annotation.Nullable";
boolean generateConstructorPropertiesAnnotation = false;
boolean generateDeprecated = true;
boolean generateDeprecationOnUnknownTypes = true;
boolean generateIndexes = true;
boolean generateRelations = true;
boolean generateImplicitJoinPathsToOne = true;
boolean generateInstanceFields = true;
VisibilityModifier generateVisibilityModifier = VisibilityModifier.DEFAULT;
boolean generateGeneratedAnnotation = false;
GeneratedAnnotationType generatedGeneratedAnnotationType = GeneratedAnnotationType.DETECT_FROM_JDK;
boolean generateGeneratedAnnotationDate = true;
boolean generateNonnullAnnotation = false;
String generatedNonnullAnnotationType = "javax.annotation.Nonnull";
boolean generateNullableAnnotation = false;
String generatedNullableAnnotationType = "javax.annotation.Nullable";
boolean generateConstructorPropertiesAnnotation = false;
Boolean generateConstructorPropertiesAnnotationOnPojos;
Boolean generateConstructorPropertiesAnnotationOnRecords;
boolean useSchemaVersionProvider = false;
boolean useCatalogVersionProvider = false;
boolean generateRoutines = true;
boolean generateSequences = true;
boolean generateSequenceFlags = true;
boolean generateUDTs = true;
boolean generateTables = true;
boolean generateEmbeddables = true;
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = true;
boolean generateEnumsAsScalaSealedTraits = false;
boolean generatePojos = false;
boolean generatePojosAsJavaRecordClasses = false;
boolean generatePojosAsScalaCaseClasses = true;
boolean generatePojosAsKotlinDataClasses = true;
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
boolean generateSerializablePojos = true;
boolean generateInterfaces = false;
boolean generateImmutableInterfaces = false;
boolean generateSerializableInterfaces = true;
boolean generateDaos = false;
boolean generateJPAAnnotations = false;
String generateJPAVersion = "";
boolean generateValidationAnnotations = false;
boolean generateSpringAnnotations = false;
GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT;
int maxMembersPerInitialiser = 500;
boolean generateQueues = true;
boolean generateLinks = true;
boolean generateKeys = true;
boolean generateGlobalObjectReferences = true;
boolean generateGlobalCatalogReferences = true;
boolean generateGlobalSchemaReferences = true;
boolean generateGlobalRoutineReferences = true;
boolean generateGlobalSequenceReferences = true;
boolean generateGlobalTableReferences = true;
boolean generateGlobalDomainReferences = true;
boolean generateGlobalUDTReferences = true;
boolean generateGlobalQueueReferences = true;
boolean generateGlobalLinkReferences = true;
boolean generateGlobalKeyReferences = true;
boolean generateGlobalIndexReferences = true;
boolean generateJavadoc = true;
boolean generateComments = true;
boolean generateCommentsOnAttributes = true;
boolean generateCommentsOnCatalogs = true;
boolean generateCommentsOnColumns = true;
boolean generateCommentsOnKeys = true;
boolean generateCommentsOnLinks = true;
boolean generateCommentsOnPackages = true;
boolean generateCommentsOnParameters = true;
boolean generateCommentsOnQueues = true;
boolean generateCommentsOnRoutines = true;
boolean generateCommentsOnSchemas = true;
boolean generateCommentsOnSequences = true;
boolean generateCommentsOnTables = true;
boolean generateCommentsOnUDTs = true;
boolean generateCommentsOnEmbeddables = true;
boolean generateSources = true;
boolean generateSourcesOnViews = true;
boolean generateFluentSetters = false;
boolean generateJavaBeansGettersAndSetters = false;
boolean generateVarargsSetters = true;
String generateFullyQualifiedTypes = "";
boolean generateJavaTimeTypes = true;
boolean generateTableValuedFunctions = false;
boolean generateEmptyCatalogs = false;
boolean generateEmptySchemas = false;
String generateNewline = "\n";
boolean useSchemaVersionProvider = false;
boolean useCatalogVersionProvider = false;
boolean generateRoutines = true;
boolean generateSequences = true;
boolean generateSequenceFlags = true;
boolean generateUDTs = true;
boolean generateTables = true;
boolean generateEmbeddables = true;
boolean generateRecords = true;
boolean generateRecordsImplementingRecordN = true;
boolean generateEnumsAsScalaSealedTraits = false;
boolean generatePojos = false;
boolean generatePojosAsJavaRecordClasses = false;
boolean generatePojosAsScalaCaseClasses = true;
boolean generatePojosAsKotlinDataClasses = true;
boolean generatePojosEqualsAndHashCode = false;
boolean generatePojosToString = true;
boolean generateImmutablePojos = false;
boolean generateSerializablePojos = true;
boolean generateInterfaces = false;
boolean generateImmutableInterfaces = false;
boolean generateSerializableInterfaces = true;
boolean generateDaos = false;
boolean generateJPAAnnotations = false;
String generateJPAVersion = "";
boolean generateValidationAnnotations = false;
boolean generateSpringAnnotations = false;
boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix = true;
GeneratedSerialVersionUID generatedSerialVersionUID = GeneratedSerialVersionUID.CONSTANT;
int maxMembersPerInitialiser = 500;
boolean generateQueues = true;
boolean generateLinks = true;
boolean generateKeys = true;
boolean generateGlobalObjectReferences = true;
boolean generateGlobalCatalogReferences = true;
boolean generateGlobalSchemaReferences = true;
boolean generateGlobalRoutineReferences = true;
boolean generateGlobalSequenceReferences = true;
boolean generateGlobalTableReferences = true;
boolean generateGlobalDomainReferences = true;
boolean generateGlobalUDTReferences = true;
boolean generateGlobalQueueReferences = true;
boolean generateGlobalLinkReferences = true;
boolean generateGlobalKeyReferences = true;
boolean generateGlobalIndexReferences = true;
boolean generateJavadoc = true;
boolean generateComments = true;
boolean generateCommentsOnAttributes = true;
boolean generateCommentsOnCatalogs = true;
boolean generateCommentsOnColumns = true;
boolean generateCommentsOnKeys = true;
boolean generateCommentsOnLinks = true;
boolean generateCommentsOnPackages = true;
boolean generateCommentsOnParameters = true;
boolean generateCommentsOnQueues = true;
boolean generateCommentsOnRoutines = true;
boolean generateCommentsOnSchemas = true;
boolean generateCommentsOnSequences = true;
boolean generateCommentsOnTables = true;
boolean generateCommentsOnUDTs = true;
boolean generateCommentsOnEmbeddables = true;
boolean generateSources = true;
boolean generateSourcesOnViews = true;
boolean generateFluentSetters = false;
boolean generateJavaBeansGettersAndSetters = false;
boolean generateVarargsSetters = true;
String generateFullyQualifiedTypes = "";
boolean generateJavaTimeTypes = true;
boolean generateTableValuedFunctions = false;
boolean generateEmptyCatalogs = false;
boolean generateEmptySchemas = false;
String generateNewline = "\n";
String generateIndentation;
int generatePrintMarginForBlockComment = 80;
int generatePrintMarginForBlockComment = 80;
protected GeneratorStrategyWrapper strategy;
protected String targetEncoding = "UTF-8";
protected boolean targetClean = true;
protected String targetEncoding = "UTF-8";
protected boolean targetClean = true;
final Language languageConfigured;
Language language;
@ -666,6 +667,16 @@ abstract class AbstractGenerator implements Generator {
this.generateSpringAnnotations = generateSpringAnnotations;
}
@Override
public boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix() {
return generateKotlinSetterJvmNameAnnotationsOnIsPrefix;
}
@Override
public void setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix) {
this.generateKotlinSetterJvmNameAnnotationsOnIsPrefix = generateKotlinSetterJvmNameAnnotationsOnIsPrefix;
}
@Override
public GeneratedSerialVersionUID generatedSerialVersionUID() {
return generatedSerialVersionUID;

View File

@ -750,6 +750,8 @@ public class GenerationTool {
generator.setGenerateValidationAnnotations(g.getGenerate().isValidationAnnotations());
if (g.getGenerate().isSpringAnnotations() != null)
generator.setGenerateSpringAnnotations(g.getGenerate().isSpringAnnotations());
if (g.getGenerate().isKotlinSetterJvmNameAnnotationsOnIsPrefix() != null)
generator.setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(g.getGenerate().isKotlinSetterJvmNameAnnotationsOnIsPrefix());
if (g.getGenerate().getGeneratedSerialVersionUID() != null)
generator.setGenerateGeneratedSerialVersionUID(g.getGenerate().getGeneratedSerialVersionUID());
if (g.getGenerate().getMaxMembersPerInitialiser() != null)

View File

@ -537,6 +537,22 @@ public interface Generator {
*/
void setGenerateSpringAnnotations(boolean generateSpringAnnotations);
/**
* Whether kotlin mutable properties should be annotated with
* <code>set:JvmName</code> as a workaround for problems occurring when
* kotlin produces <code>setX()</code> instead of <code>setIsX()</code>
* setters for an <code>isX</code> property.
*/
boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix();
/**
* Whether kotlin mutable properties should be annotated with
* <code>set:JvmName</code> as a workaround for problems occurring when
* kotlin produces <code>setX()</code> instead of <code>setIsX()</code>
* setters for an <code>isX</code> property.
*/
void setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix);
/**
* The type of <code>serialVersionUID</code> that should be generated.
*/

View File

@ -7255,21 +7255,17 @@ public class JavaGenerator extends AbstractGenerator {
}
}
private static final Pattern P_IS = Pattern.compile("^is[A-Z].*$");
protected void printKotlinSetterAnnotation(JavaWriter out, TypedElementDefinition<?> column, Mode mode) {
// [#11912] When X and IS_X create conflicts, we need to resolve
// them by specifying an explicit setter name
if (column instanceof ColumnDefinition) {
String member = getStrategy().getJavaMemberName(column, mode);
if (member.startsWith("is") && ((ColumnDefinition) column)
.getContainer()
.getColumns()
.stream()
.anyMatch(c -> member.equals("is" + StringUtils.toUC(getStrategy().getJavaMemberName(c, mode))))) {
out.println("@set:JvmName(\"%s\")", getStrategy().getJavaSetterName(column, mode));
}
}
if (kotlin
&& generateKotlinSetterJvmNameAnnotationsOnIsPrefix()
&& column instanceof ColumnDefinition
&& P_IS.matcher(getStrategy().getJavaMemberName(column, mode)).matches())
out.println("@set:JvmName(\"%s\")", getStrategy().getJavaSetterName(column, mode));
}
private String nullableAnnotation(JavaWriter out) {

View File

@ -123,6 +123,8 @@ public class Generate implements Serializable, XMLAppendable
@XmlElement(defaultValue = "false")
protected Boolean springAnnotations = false;
@XmlElement(defaultValue = "true")
protected Boolean kotlinSetterJvmNameAnnotationsOnIsPrefix = true;
@XmlElement(defaultValue = "true")
protected Boolean globalObjectReferences = true;
@XmlElement(defaultValue = "true")
protected Boolean globalCatalogReferences = true;
@ -1260,6 +1262,30 @@ public class Generate implements Serializable, XMLAppendable
this.springAnnotations = value;
}
/**
* Workaround for Kotlin generating <code>setX()</code> setters instead of <code>setIsX()</code> in byte code for mutable properties called <code>isX</code>.
*
* @return
* possible object is
* {@link Boolean }
*
*/
public Boolean isKotlinSetterJvmNameAnnotationsOnIsPrefix() {
return kotlinSetterJvmNameAnnotationsOnIsPrefix;
}
/**
* Sets the value of the kotlinSetterJvmNameAnnotationsOnIsPrefix property.
*
* @param value
* allowed object is
* {@link Boolean }
*
*/
public void setKotlinSetterJvmNameAnnotationsOnIsPrefix(Boolean value) {
this.kotlinSetterJvmNameAnnotationsOnIsPrefix = value;
}
/**
* Turn off generation of all global object references.
*
@ -2496,6 +2522,11 @@ public class Generate implements Serializable, XMLAppendable
return this;
}
public Generate withKotlinSetterJvmNameAnnotationsOnIsPrefix(Boolean value) {
setKotlinSetterJvmNameAnnotationsOnIsPrefix(value);
return this;
}
public Generate withGlobalObjectReferences(Boolean value) {
setGlobalObjectReferences(value);
return this;
@ -2781,6 +2812,7 @@ public class Generate implements Serializable, XMLAppendable
builder.append("jpaVersion", jpaVersion);
builder.append("validationAnnotations", validationAnnotations);
builder.append("springAnnotations", springAnnotations);
builder.append("kotlinSetterJvmNameAnnotationsOnIsPrefix", kotlinSetterJvmNameAnnotationsOnIsPrefix);
builder.append("globalObjectReferences", globalObjectReferences);
builder.append("globalCatalogReferences", globalCatalogReferences);
builder.append("globalSchemaReferences", globalSchemaReferences);
@ -3249,6 +3281,15 @@ public class Generate implements Serializable, XMLAppendable
return false;
}
}
if (kotlinSetterJvmNameAnnotationsOnIsPrefix == null) {
if (other.kotlinSetterJvmNameAnnotationsOnIsPrefix!= null) {
return false;
}
} else {
if (!kotlinSetterJvmNameAnnotationsOnIsPrefix.equals(other.kotlinSetterJvmNameAnnotationsOnIsPrefix)) {
return false;
}
}
if (globalObjectReferences == null) {
if (other.globalObjectReferences!= null) {
return false;
@ -3679,6 +3720,7 @@ public class Generate implements Serializable, XMLAppendable
result = ((prime*result)+((jpaVersion == null)? 0 :jpaVersion.hashCode()));
result = ((prime*result)+((validationAnnotations == null)? 0 :validationAnnotations.hashCode()));
result = ((prime*result)+((springAnnotations == null)? 0 :springAnnotations.hashCode()));
result = ((prime*result)+((kotlinSetterJvmNameAnnotationsOnIsPrefix == null)? 0 :kotlinSetterJvmNameAnnotationsOnIsPrefix.hashCode()));
result = ((prime*result)+((globalObjectReferences == null)? 0 :globalObjectReferences.hashCode()));
result = ((prime*result)+((globalCatalogReferences == null)? 0 :globalCatalogReferences.hashCode()));
result = ((prime*result)+((globalSchemaReferences == null)? 0 :globalSchemaReferences.hashCode()));

View File

@ -1683,6 +1683,10 @@ jOOQ version used for source code.]]></jxb:javadoc></jxb:property></appinfo></an
<element name="springAnnotations" type="boolean" default="false" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Annotate DAOs with useful spring annotations such as @Repository or @Autowired.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="kotlinSetterJvmNameAnnotationsOnIsPrefix" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Workaround for Kotlin generating <code>setX()</code> setters instead of <code>setIsX()</code> in byte code for mutable properties called <code>isX</code>.]]></jxb:javadoc></jxb:property></appinfo></annotation>
</element>
<element name="globalObjectReferences" type="boolean" default="true" minOccurs="0" maxOccurs="1">
<annotation><appinfo><jxb:property><jxb:javadoc><![CDATA[Turn off generation of all global object references.]]></jxb:javadoc></jxb:property></appinfo></annotation>