codegen-java: Support not annotating constructor parameters (#792)

Motivation:
Spring Boot configuration classes neither require nor benefit from annotating constructor parameters with their name.
The same is true for pkl-config-java configuration classes compiled with `-parameter`.

Changes:
- Change CLI parameter `--params-annotation` to accept a `none` value.
  This is recommended in https://clig.dev/#arguments-and-flags and is how the `-F` parameter of the `ssh` command works.
- Change `paramsAnnotation` property in Gradle plugin, CliJavaCodeGeneratorOptions, and JavaCodegenOptions as follows:
  - Change meaning of `null` from "generate org.pkl.java.config.mapper.Named annotations" to "do not generate annotations".
    This is a breaking change (only) affecting users who explicitly set the property to `null` instead of omitting it.
  - Change property default from `null` to:
    `null` if `generateSpringBootConfig` is `true` and `org.pkl.java.config.mapper.Named` otherwise
- add tests
- update docs of this and other codegen options

Result:
Generated code does not contain unnecessary annotations.
This commit is contained in:
odenix
2024-12-13 14:29:18 -08:00
committed by GitHub
parent 70aaa6322e
commit 01bf844a96
13 changed files with 185 additions and 114 deletions

View File

@@ -104,26 +104,10 @@ class JavaCodeGeneratorTest {
private fun generateJavaCode(
pklCode: String,
generateGetters: Boolean = false,
generateJavadoc: Boolean = false,
generateSpringBootConfig: Boolean = false,
nonNullAnnotation: String? = null,
implementSerializable: Boolean = false,
renames: Map<String, String> = emptyMap()
options: JavaCodeGeneratorOptions = JavaCodeGeneratorOptions()
): JavaSourceCode {
val module = Evaluator.preconfigured().evaluateSchema(text(pklCode))
val generator =
JavaCodeGenerator(
module,
JavaCodeGeneratorOptions(
generateGetters = generateGetters,
generateJavadoc = generateJavadoc,
generateSpringBootConfig = generateSpringBootConfig,
nonNullAnnotation = nonNullAnnotation,
implementSerializable = implementSerializable,
renames = renames
)
)
val generator = JavaCodeGenerator(module, options)
return JavaSourceCode(generator.javaFile)
}
}
@@ -235,7 +219,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateJavadoc = true
JavaCodeGeneratorOptions(generateJavadoc = true)
)
assertThat(javaCode)
.contains(
@@ -274,8 +258,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true,
generateJavadoc = true
JavaCodeGeneratorOptions(generateGetters = true, generateJavadoc = true)
)
assertThat(javaCode)
.contains(
@@ -322,7 +305,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateJavadoc = true
JavaCodeGeneratorOptions(generateJavadoc = true)
)
assertThat(javaCode)
.contains(
@@ -349,7 +332,7 @@ class JavaCodeGeneratorTest {
propertyInDeprecatedModuleClass : Int = 42
"""
.trimIndent(),
generateJavadoc = generateJavadoc
JavaCodeGeneratorOptions(generateJavadoc = generateJavadoc)
)
assertThat(javaCode)
@@ -389,7 +372,7 @@ class JavaCodeGeneratorTest {
"""
.trimIndent(),
// no message, so no Javadoc, regardless of flag
generateJavadoc = generateJavadoc
JavaCodeGeneratorOptions(generateJavadoc = generateJavadoc)
)
assertThat(javaCode)
@@ -424,7 +407,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true
JavaCodeGeneratorOptions(generateGetters = true)
)
assertThat(javaCode)
@@ -513,7 +496,7 @@ class JavaCodeGeneratorTest {
@Deprecated { message = "property is deprecated" }
deprecatedProperty: Int
""",
generateJavadoc = true
JavaCodeGeneratorOptions(generateJavadoc = true)
)
assertThat(javaCode)
@@ -735,7 +718,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true
JavaCodeGeneratorOptions(generateGetters = true)
)
assertThat(javaCode)
@@ -889,7 +872,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true
JavaCodeGeneratorOptions(generateGetters = true)
)
assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile("GenerateGetters.jva")
@@ -1002,7 +985,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateJavadoc = true
JavaCodeGeneratorOptions(generateJavadoc = true)
)
assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile("Javadoc.jva")
@@ -1026,8 +1009,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true,
generateJavadoc = true
JavaCodeGeneratorOptions(generateGetters = true, generateJavadoc = true)
)
assertThat(javaCode)
@@ -1169,7 +1151,7 @@ class JavaCodeGeneratorTest {
foo: String
"""
.trimIndent(),
nonNullAnnotation = "com.example.Annotations\$NonNull"
JavaCodeGeneratorOptions(nonNullAnnotation = "com.example.Annotations\$NonNull")
)
assertThat(javaCode)
@@ -1463,6 +1445,40 @@ class JavaCodeGeneratorTest {
.contains("public final @NonNull String v6;")
}
@Test
fun `custom constructor parameter annotation`() {
val javaCode =
generateJavaCode(
"""
module my.mod
name: String
"""
.trimIndent(),
JavaCodeGeneratorOptions(paramsAnnotation = "org.project.MyAnnotation")
)
assertThat(javaCode)
.contains("import org.project.MyAnnotation;")
.contains("public Mod(@MyAnnotation(\"name\") @NonNull String name)")
}
@Test
fun `no constructor parameter annotation`() {
val javaCode =
generateJavaCode(
"""
module my.mod
name: String
"""
.trimIndent(),
JavaCodeGeneratorOptions(paramsAnnotation = null)
)
assertThat(javaCode).contains("public Mod(@NonNull String name)")
}
@Test
fun `spring boot config`() {
val javaCode =
@@ -1478,7 +1494,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateSpringBootConfig = true
JavaCodeGeneratorOptions(generateSpringBootConfig = true)
)
assertThat(javaCode)
@@ -1511,6 +1527,7 @@ class JavaCodeGeneratorTest {
.trimMargin()
)
.doesNotContain("@ConstructorBinding")
.doesNotContain("@Named")
// not worthwhile to add spring & spring boot dependency just so that this test can compile
// their annotations
@@ -1765,7 +1782,7 @@ class JavaCodeGeneratorTest {
typealias Direction = "north"|"east"|"south"|"west"
"""
.trimIndent(),
implementSerializable = true
JavaCodeGeneratorOptions(implementSerializable = true)
)
assertThat(javaCode)
@@ -1846,7 +1863,7 @@ class JavaCodeGeneratorTest {
abstract class Foo { str: String }
"""
.trimIndent(),
implementSerializable = true
JavaCodeGeneratorOptions(implementSerializable = true)
)
assertThat(javaCode).doesNotContain("Serializable")
@@ -1857,7 +1874,7 @@ class JavaCodeGeneratorTest {
module my.mod
"""
.trimIndent(),
implementSerializable = true
JavaCodeGeneratorOptions(implementSerializable = true)
)
assertThat(javaCode).doesNotContain("Serializable")
@@ -1874,7 +1891,7 @@ class JavaCodeGeneratorTest {
class Address { city: String }
"""
.trimIndent(),
implementSerializable = true
JavaCodeGeneratorOptions(implementSerializable = true)
)
assertThat(javaCode)
@@ -1960,7 +1977,7 @@ class JavaCodeGeneratorTest {
}
"""
.trimIndent(),
generateGetters = true
JavaCodeGeneratorOptions(generateGetters = true)
)
assertThat(javaCode)