Add @Generated annotation to generated Java types (#1075)

JaCoCo automatically excludes methods and classes annotated with @Generated from the coverage reports. This is very important to us as generated code should not normally be included in the coverage report. We want to measure the coverage of the code that we actually wrote and maintain, not the code that was automatically generated by tools.

By introducing a property generatedAnnotation (default value false) one could enable writing @Generated on Java types to be generated.

Co-authored-by: Nullpointer <mike.schulze@tealium.com>
This commit is contained in:
André Rouél
2025-07-08 00:31:49 +02:00
committed by GitHub
parent dbf57280ba
commit 0973774a5d
11 changed files with 141 additions and 4 deletions
@@ -859,6 +859,24 @@ class JavaCodeGeneratorTest {
assertThat(fooClass.declaredFields).allSatisfy(Consumer { it.name.startsWith("_") })
}
@Test
fun generatedAnnotation() {
val javaCode =
generateJavaCode(
"""
module my.mod
class GeneratedAnnotation {
test: Boolean = true
}
"""
.trimIndent(),
JavaCodeGeneratorOptions(generatedAnnotation = true),
)
assertThat(javaCode).compilesSuccessfully().isEqualToResourceFile("GeneratedAnnotation.jva")
}
@Test
fun getters() {
val javaCode =
@@ -0,0 +1,63 @@
package my;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.StringBuilder;
import java.util.Objects;
import org.pkl.config.java.Generated;
import org.pkl.config.java.mapper.Named;
@Generated
public final class Mod {
private Mod() {
}
private static void appendProperty(StringBuilder builder, String name, Object value) {
builder.append("\n ").append(name).append(" = ");
String[] lines = Objects.toString(value).split("\n");
builder.append(lines[0]);
for (int i = 1; i < lines.length; i++) {
builder.append("\n ").append(lines[i]);
}
}
@Generated
public static final class GeneratedAnnotation {
public final boolean test;
public GeneratedAnnotation(@Named("test") boolean test) {
this.test = test;
}
public GeneratedAnnotation withTest(boolean test) {
return new GeneratedAnnotation(test);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (this.getClass() != obj.getClass()) return false;
GeneratedAnnotation other = (GeneratedAnnotation) obj;
if (!Objects.equals(this.test, other.test)) return false;
return true;
}
@Override
public int hashCode() {
int result = 1;
result = 31 * result + Objects.hashCode(this.test);
return result;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(100);
builder.append(GeneratedAnnotation.class.getSimpleName()).append(" {");
appendProperty(builder, "test", this.test);
builder.append("\n}");
return builder.toString();
}
}
}