[weaver-pojo*] Refactor POJO weaver extensibility

This commit is contained in:
2025-06-21 15:27:15 +02:00
parent 95b2cbc7dd
commit dc318722d3
26 changed files with 414 additions and 203 deletions

View File

@@ -4,12 +4,14 @@ import de.siphalor.tweed5.annotationinheritance.impl.AnnotationInheritanceResolv
import de.siphalor.tweed5.typeutils.api.annotations.AnnotationRepeatType;
import de.siphalor.tweed5.utils.api.collection.ClassToInstanceMap;
import lombok.RequiredArgsConstructor;
import lombok.var;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jspecify.annotations.NonNull;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Array;
@RequiredArgsConstructor
public class AnnotationInheritanceAwareAnnotatedElement implements AnnotatedElement {
@@ -48,6 +50,28 @@ public class AnnotationInheritanceAwareAnnotatedElement implements AnnotatedElem
return getOrResolveAnnotations().get(annotationClass);
}
@Override
public @NonNull <T extends Annotation> @NotNull T[] getAnnotationsByType(@NonNull Class<T> annotationClass) {
T annotation = getOrResolveAnnotations().get(annotationClass);
if (annotation != null) {
//noinspection unchecked
T[] array = (T[]) Array.newInstance(annotationClass, 1);
array[0] = annotation;
return array;
}
AnnotationRepeatType repeatType = AnnotationRepeatType.getType(annotationClass);
if (repeatType instanceof AnnotationRepeatType.Repeatable) {
var containerRepeatType = ((AnnotationRepeatType.Repeatable) repeatType).containerRepeatType();
Annotation containerAnnotation = getOrResolveAnnotations().get(containerRepeatType.annotationClass());
if (containerAnnotation != null) {
return containerRepeatType.elements(containerAnnotation);
}
}
//noinspection unchecked
return (T[]) Array.newInstance(annotationClass, 0);
}
@Override
public @NotNull Annotation[] getAnnotations() {
return getOrResolveAnnotations().values().toArray(new Annotation[0]);

View File

@@ -27,7 +27,7 @@ public class AnnotationInheritanceResolver {
public ClassToInstanceMap<Annotation> resolve() {
resolve(main, Collections.emptySet());
ClassToInstanceMap<Annotation> resolvedAnnotations = new ClassToInstanceMap<>();
ClassToInstanceMap<Annotation> resolvedAnnotations = ClassToInstanceMap.backedBy(new LinkedHashMap<>());
List<Aggregator> aggregatorList = new ArrayList<>(aggregators.values());
for (int i = aggregatorList.size() - 1; i >= 0; i--) {

View File

@@ -18,6 +18,15 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
.isEqualTo(1);
}
@Test
void getAnnotationsByTypeAForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotationsByType(A.class))
.singleElement()
.extracting(A::value)
.isEqualTo(1);
}
@Test
void getAnnotationBForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
@@ -27,6 +36,15 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
.isEqualTo(2);
}
@Test
void getAnnotationsByTypeBForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotationsByType(B.class))
.singleElement()
.extracting(B::value)
.isEqualTo(2);
}
@Test
void getAnnotationCForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
@@ -36,12 +54,33 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
.isEqualTo(10);
}
@Test
void getAnnotationsByTypeCForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotationsByType(C.class))
.singleElement()
.extracting(C::value)
.isEqualTo(10);
}
@Test
void getAnnotationRForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotation(R.class)).isNull();
}
@Test
void getAnnotationsByTypeRForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotationsByType(R.class))
.satisfiesExactly(
r -> assertThat(r.value()).isEqualTo(4),
r -> assertThat(r.value()).isEqualTo(2),
r -> assertThat(r.value()).isEqualTo(3),
r -> assertThat(r.value()).isEqualTo(10)
);
}
@Test
void getAnnotationRsForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
@@ -58,6 +97,21 @@ class AnnotationInheritanceAwareAnnotatedElementTest {
);
}
@Test
void getAnnotationsByTypeRsForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);
assertThat(element.getAnnotationsByType(Rs.class))
.singleElement()
.extracting(Rs::value)
.asInstanceOf(array(R[].class))
.satisfiesExactly(
r -> assertThat(r.value()).isEqualTo(4),
r -> assertThat(r.value()).isEqualTo(2),
r -> assertThat(r.value()).isEqualTo(3),
r -> assertThat(r.value()).isEqualTo(10)
);
}
@Test
void getAnnotationsForTarget1() {
var element = new AnnotationInheritanceAwareAnnotatedElement(Target1.class);