Make build with queryable type annotation processor faster

With this, gradle can determine the originating element for the
generated query types and the store factories correctly and
therefor can run incremental builds when the queryable type
annotation processor is added as a dependency.
This commit is contained in:
Rene Pfeuffer
2025-04-30 10:23:36 +02:00
parent edaffc1662
commit 243ff9ed95
23 changed files with 67 additions and 3 deletions

View File

@@ -16,6 +16,7 @@
package sonia.scm.annotation;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
@@ -26,6 +27,7 @@ import jakarta.inject.Inject;
import sonia.scm.ModelObject;
import sonia.scm.store.QueryableStoreFactory;
import javax.annotation.processing.Generated;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.Modifier;
@@ -56,7 +58,9 @@ class FactoryClassCreator {
TypeSpec
.classBuilder(element.getSimpleName() + "StoreFactory")
.addModifiers(Modifier.PUBLIC)
.addJavadoc("Generated queryable store factory for type {@link $T}.\nTo create conditions in queries, use the static fields in the class {@link $TQueryFields}.\n", typeNameOfDataClass, typeNameOfDataClass);
.addAnnotation(AnnotationSpec.builder(Generated.class).addMember("value", "$S", "sonia.scm.annotation.QueryableTypeAnnotationProcessor").build())
.addJavadoc("Generated queryable store factory for type {@link $T}.\nTo create conditions in queries, use the static fields in the class {@link $TQueryFields}.\n", typeNameOfDataClass, typeNameOfDataClass)
.addOriginatingElement(dataClassTypeElement);
createStoreFactoryField(builder);
createConstructor(builder);

View File

@@ -18,6 +18,7 @@ package sonia.scm.annotation;
import com.google.auto.common.MoreElements;
import com.google.auto.common.MoreTypes;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
@@ -28,6 +29,7 @@ import com.squareup.javapoet.TypeSpec;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.annotation.processing.Generated;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
@@ -70,7 +72,9 @@ class QueryFieldClassCreator {
TypeSpec
.classBuilder(element.getSimpleName() + "QueryFields")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addJavadoc("Generated query fields for type {@link $T}.\nTo create a queryable store for this, use an injected instance of the {@link $TStoreFactory}.\n", TypeName.get(typeElement.asType()), TypeName.get(typeElement.asType()));
.addAnnotation(AnnotationSpec.builder(Generated.class).addMember("value", "$S", "sonia.scm.annotation.QueryableTypeAnnotationProcessor").build())
.addJavadoc("Generated query fields for type {@link $T}.\nTo create a queryable store for this, use an injected instance of the {@link $TStoreFactory}.\n", TypeName.get(typeElement.asType()), TypeName.get(typeElement.asType()))
.addOriginatingElement(typeElement);
createPrivateConstructor(builder);
processParents(typeElement, builder);

View File

@@ -18,6 +18,7 @@ package sonia.scm.annotation;
import com.google.auto.common.MoreElements;
import org.kohsuke.MetaInfServices;
import sonia.scm.store.QueryableType;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
@@ -29,6 +30,7 @@ import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.io.IOException;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
@@ -42,6 +44,15 @@ public class QueryableTypeAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
if (roundEnvironment.processingOver()) {
return false;
}
// Only process elements that actually have the annotation
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(QueryableType.class);
if (elements.isEmpty()) {
return false;
}
for (TypeElement annotation : annotations) {
log("Found annotation: " + annotation.getQualifiedName());
roundEnvironment.getElementsAnnotatedWith(annotation).forEach(element -> {
@@ -53,6 +64,11 @@ public class QueryableTypeAnnotationProcessor extends AbstractProcessor {
return true;
}
@Override
public Set<String> getSupportedOptions() {
return Collections.emptySet();
}
@SuppressWarnings("UnstableApiUsage")
private void tryToCreateQueryFieldClass(Element element) {
TypeElement typeElement = MoreElements.asType(element);

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class AQueryFields {
public static final QueryableStore.IdQueryField<A> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -17,10 +17,12 @@
package sonia.scm.testing;
import jakarta.inject.Inject;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableMutableStore;
import sonia.scm.store.QueryableStore;
import sonia.scm.store.QueryableStoreFactory;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public class AStoreFactory {
private final QueryableStoreFactory storeFactory;

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class BQueryFields {
public static final QueryableStore.IdQueryField<B> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class BSubQueryFields {
public static final QueryableStore.IdQueryField<BSub> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class CQueryFields {
public static final QueryableStore.IdQueryField<C> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class DQueryFields {
public static final QueryableStore.IdQueryField<D> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,9 +16,11 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.Stage;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class EQueryFields {
public static final QueryableStore.IdQueryField<E> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class FQueryFields {
public static final QueryableStore.IdQueryField<F> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class GQueryFields {
public static final QueryableStore.IdQueryField<G> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class HQueryFields {
public static final QueryableStore.IdQueryField<H> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class IQueryFields {
public static final QueryableStore.IdQueryField<I> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,9 +16,11 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.repository.Repository;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class KQueryFields {
public static final QueryableStore.IdQueryField<K> REPOSITORY_ID =
new QueryableStore.IdQueryField<>(Repository.class);

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class LQueryFields {
public static final QueryableStore.IdQueryField<L> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class MQueryFields {
public static final QueryableStore.IdQueryField<M> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class NQueryFields {
public static final QueryableStore.IdQueryField<N> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -16,8 +16,10 @@
package sonia.scm.testing;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableStore;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public final class OQueryFields {
public static final QueryableStore.IdQueryField<O> INTERNAL_ID =
new QueryableStore.IdQueryField<>();

View File

@@ -18,10 +18,12 @@ package sonia.scm.testing;
import jakarta.inject.Inject;
import java.lang.String;
import javax.annotation.processing.Generated;
import sonia.scm.store.QueryableMutableStore;
import sonia.scm.store.QueryableStore;
import sonia.scm.store.QueryableStoreFactory;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public class OneNonModelObjectParentStoreFactory {
private final QueryableStoreFactory storeFactory;

View File

@@ -18,11 +18,13 @@ package sonia.scm.testing;
import jakarta.inject.Inject;
import java.lang.String;
import javax.annotation.processing.Generated;
import sonia.scm.repository.Repository;
import sonia.scm.store.QueryableMutableStore;
import sonia.scm.store.QueryableStore;
import sonia.scm.store.QueryableStoreFactory;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public class OneParentStoreFactory {
private final QueryableStoreFactory storeFactory;

View File

@@ -18,7 +18,7 @@ package sonia.scm.testing;
import jakarta.inject.Inject;
import java.lang.String;
import javax.annotation.processing.Generated;
import sonia.scm.group.Group;
import sonia.scm.repository.Repository;
import sonia.scm.store.QueryableMutableStore;
@@ -26,6 +26,7 @@ import sonia.scm.store.QueryableStore;
import sonia.scm.store.QueryableStoreFactory;
import sonia.scm.user.User;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public class ThreeParentsStoreFactory {
private final QueryableStoreFactory storeFactory;

View File

@@ -18,12 +18,15 @@ package sonia.scm.testing;
import jakarta.inject.Inject;
import java.lang.String;
import javax.annotation.processing.Generated;
import sonia.scm.repository.Repository;
import sonia.scm.store.QueryableMutableStore;
import sonia.scm.store.QueryableStore;
import sonia.scm.store.QueryableStoreFactory;
import sonia.scm.user.User;
@Generated("sonia.scm.annotation.QueryableTypeAnnotationProcessor")
public class TwoParentsStoreFactory {
private final QueryableStoreFactory storeFactory;