From 91e5d938ff02e80d830310c08025c6b5eca5d6b8 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 10 Jun 2021 15:49:01 +0200 Subject: [PATCH] [jOOQ/jOOQ#11912] More general and configurable fix --- .../org/jooq/codegen/AbstractGenerator.java | 189 +++++++++--------- .../java/org/jooq/codegen/GenerationTool.java | 2 + .../main/java/org/jooq/codegen/Generator.java | 16 ++ .../java/org/jooq/codegen/JavaGenerator.java | 18 +- .../java/org/jooq/meta/jaxb/Generate.java | 42 ++++ .../resources/xsd/jooq-codegen-3.15.0.xsd | 4 + 6 files changed, 171 insertions(+), 100 deletions(-) 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 6d125d560c..e2a0ba2ad8 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/AbstractGenerator.java @@ -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; 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 353c403074..aef3185a82 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GenerationTool.java @@ -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) 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 65f5e55b14..1d27f06787 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/Generator.java @@ -537,6 +537,22 @@ public interface Generator { */ void setGenerateSpringAnnotations(boolean generateSpringAnnotations); + /** + * Whether kotlin mutable properties should be annotated with + * set:JvmName as a workaround for problems occurring when + * kotlin produces setX() instead of setIsX() + * setters for an isX property. + */ + boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix(); + + /** + * Whether kotlin mutable properties should be annotated with + * set:JvmName as a workaround for problems occurring when + * kotlin produces setX() instead of setIsX() + * setters for an isX property. + */ + void setGenerateKotlinSetterJvmNameAnnotationsOnIsPrefix(boolean generateKotlinSetterJvmNameAnnotationsOnIsPrefix); + /** * The type of serialVersionUID that should be generated. */ 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 50c647bb8d..a2082c3809 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -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) { 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 bdaaa3a86f..b111b9bcdc 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 @@ -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 setX() setters instead of setIsX() in byte code for mutable properties called isX. + * + * @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())); diff --git a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd index 0e8c75e94d..6c455786ce 100644 --- a/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd +++ b/jOOQ-meta/src/main/resources/xsd/jooq-codegen-3.15.0.xsd @@ -1683,6 +1683,10 @@ jOOQ version used for source code.]]> + + + setX() setters instead of setIsX() in byte code for mutable properties called isX.]]> +