Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,5 @@ cached-antora-playbook.yml

node_modules
/.kotlin/
.ai/
.junie/
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ plugins {
ext {
moduleProjects = subprojects.findAll { it.name.startsWith("spring-") }
javaProjects = subprojects.findAll { !it.name.startsWith("framework-") }
mixinAnnotationVersion = "1.1.18"
}

description = "Spring Framework"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
id("java")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package org.springframework.annotation.processor;

import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import java.util.Set;

/**
* This annotation processor claims all the annotations that are not processed at compile time at all.
* Otherwise, the compiler would emit a warning that
* {@code No processor claimed any of these annotations}. Adding this to the compiler arg option {@code -Werror},
* would fail the build.
*/
@SupportedAnnotationTypes({
"com.fasterxml.jackson.annotation.JsonAnyGetter",
"com.fasterxml.jackson.annotation.JsonAnySetter",
"com.fasterxml.jackson.annotation.JsonInclude",
"com.fasterxml.jackson.annotation.JsonRootName",
"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty",
"com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement",
"com.oracle.svm.core.annotate.Alias",
"com.oracle.svm.core.annotate.Substitute",
"com.oracle.svm.core.annotate.TargetClass",
"jakarta.annotation.Generated",
"jakarta.servlet.annotation.HandlesTypes",
"javax.annotation.CheckForNull",
"javax.annotation.Nonnull",
"javax.annotation.meta.TypeQualifierDefault",
"javax.annotation.meta.TypeQualifierNickname",
"jdk.jfr/jdk.jfr.Category",
"jdk.jfr/jdk.jfr.Description",
"jdk.jfr/jdk.jfr.Enabled",
"jdk.jfr/jdk.jfr.Label",
"jdk.jfr/jdk.jfr.Registered",
"jdk.jfr/jdk.jfr.StackTrace",
"org.jspecify.annotations.NullMarked",
"org.jspecify.annotations.NullUnmarked",
"org.springframework.aot.hint.annotation.Reflective",
"org.springframework.aot.hint.annotation.RegisterReflection",
"org.springframework.beans.factory.annotation.Autowired",
"org.springframework.beans.factory.annotation.Qualifier",
"org.springframework.context.annotation.Bean",
"org.springframework.context.annotation.Conditional",
"org.springframework.context.annotation.Configuration",
"org.springframework.context.event.EventListener",
"org.springframework.context.annotation.Import",
"org.springframework.context.annotation.ImportRuntimeHints",
"org.springframework.context.annotation.Lazy",
"org.springframework.context.annotation.Role",
"org.springframework.context.annotation.Scope",
"org.springframework.core.annotation.AliasFor",
"org.springframework.core.annotation.Order",
"org.springframework.lang.CheckReturnValue",
"org.springframework.lang.Contract",
"org.springframework.messaging.handler.annotation.MessageMapping",
"org.springframework.stereotype.Component",
"org.springframework.stereotype.Controller",
"org.springframework.stereotype.Indexed",
"org.junit.jupiter.api.Test",
"org.junit.jupiter.api.BeforeEach",
"org.junit.jupiter.api.AfterEach",
"org.junit.jupiter.api.extension.RegisterExtension",
"org.junit.jupiter.api.extension.ExtendWith",
"org.junit.jupiter.params.ParameterizedTest",
"org.junit.jupiter.params.provider.MethodSource",
"org.springframework.test.annotation.Rollback",
"org.springframework.test.context.ContextConfiguration",
"org.springframework.test.context.bean.override.BeanOverride",
"org.springframework.test.context.web.WebAppConfiguration",
"org.springframework.transaction.annotation.Transactional",
"org.testng.annotations.AfterClass",
"org.testng.annotations.AfterMethod",
"org.testng.annotations.BeforeClass",
"org.testng.annotations.BeforeMethod",
"org.junit.runner.RunWith",
"jakarta.xml.bind.annotation.XmlRootElement",
"org.springframework.web.bind.annotation.ControllerAdvice",
"org.springframework.web.bind.annotation.ExceptionHandler",
"org.springframework.web.bind.annotation.Mapping",
"org.springframework.web.bind.annotation.RequestMapping",
"org.springframework.web.bind.annotation.ResponseBody",
"org.springframework.web.service.annotation.HttpExchange",
"tools.jackson.dataformat.xml.annotation.JacksonXmlProperty",
})


@SupportedSourceVersion(SourceVersion.RELEASE_21)
public class NonProcessedAnnotationClaimer extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.springframework.annotation.processor.NonProcessedAnnotationClaimer
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ include "framework-api"
include "framework-bom"
include "framework-docs"
include "framework-platform"
include 'framework-annotation-processor'
include "integration-tests"

rootProject.name = "spring"
Expand All @@ -50,3 +51,4 @@ settings.gradle.projectsLoaded {
}
}
}

5 changes: 4 additions & 1 deletion spring-beans/spring-beans.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ description = "Spring Beans"
apply plugin: "kotlin"

dependencies {
annotationProcessor project(":framework-annotation-processor")
api(project(":spring-core"))
optional("jakarta.inject:jakarta.inject-api")
compileOnly("guru.mocker.annotation:mixin-annotation:${mixinAnnotationVersion}")
annotationProcessor("guru.mocker.annotation:mixin-annotation-processor:${mixinAnnotationVersion}")
optional("jakarta.inject:jakarta.inject-api")
optional("org.apache.groovy:groovy-xml")
optional("org.jetbrains.kotlin:kotlin-reflect")
optional("org.jetbrains.kotlin:kotlin-stdlib")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@

package org.springframework.beans;

import java.awt.Image;
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.IndexedPropertyDescriptor;
import java.beans.IntrospectionException;
import java.beans.Introspector;
Expand All @@ -34,6 +31,7 @@
import java.util.Set;
import java.util.TreeSet;

import guru.mocker.annotation.mixin.Mixin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jspecify.annotations.Nullable;
Expand Down Expand Up @@ -78,12 +76,11 @@
* @see ExtendedBeanInfoFactory
* @see CachedIntrospectionResults
*/
class ExtendedBeanInfo implements BeanInfo {
@Mixin
class ExtendedBeanInfo extends ExtendedBeanInfoForwarder implements BeanInfo {

private static final Log logger = LogFactory.getLog(ExtendedBeanInfo.class);

private final BeanInfo delegate;

private final Set<PropertyDescriptor> propertyDescriptors = new TreeSet<>(new PropertyDescriptorComparator());


Expand All @@ -98,7 +95,7 @@ class ExtendedBeanInfo implements BeanInfo {
* @see #getPropertyDescriptors()
*/
public ExtendedBeanInfo(BeanInfo delegate) {
this.delegate = delegate;
super(delegate);
for (PropertyDescriptor pd : delegate.getPropertyDescriptors()) {
try {
this.propertyDescriptors.add(pd instanceof IndexedPropertyDescriptor indexedPd ?
Expand Down Expand Up @@ -223,42 +220,6 @@ public PropertyDescriptor[] getPropertyDescriptors() {
return this.propertyDescriptors.toArray(PropertyDescriptorUtils.EMPTY_PROPERTY_DESCRIPTOR_ARRAY);
}

@Override
public BeanInfo[] getAdditionalBeanInfo() {
return this.delegate.getAdditionalBeanInfo();
}

@Override
public BeanDescriptor getBeanDescriptor() {
return this.delegate.getBeanDescriptor();
}

@Override
public int getDefaultEventIndex() {
return this.delegate.getDefaultEventIndex();
}

@Override
public int getDefaultPropertyIndex() {
return this.delegate.getDefaultPropertyIndex();
}

@Override
public EventSetDescriptor[] getEventSetDescriptors() {
return this.delegate.getEventSetDescriptors();
}

@Override
public Image getIcon(int iconKind) {
return this.delegate.getIcon(iconKind);
}

@Override
public MethodDescriptor[] getMethodDescriptors() {
return this.delegate.getMethodDescriptors();
}


/**
* A simple {@link PropertyDescriptor}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,10 @@

package org.springframework.beans.factory.aot;

import java.util.List;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;

import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.generate.MethodReference;
import org.springframework.beans.factory.support.RegisteredBean;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.ResolvableType;
import org.springframework.javapoet.ClassName;
import org.springframework.javapoet.CodeBlock;
import guru.mocker.annotation.mixin.Mixin;

import org.springframework.util.Assert;

/**
Expand All @@ -39,60 +32,12 @@
* @author Stephane Nicoll
* @since 6.0
*/
public class BeanRegistrationCodeFragmentsDecorator implements BeanRegistrationCodeFragments {

private final BeanRegistrationCodeFragments delegate;

@Mixin
public class BeanRegistrationCodeFragmentsDecorator extends BeanRegistrationCodeFragmentsForwarder implements BeanRegistrationCodeFragments {

protected BeanRegistrationCodeFragmentsDecorator(BeanRegistrationCodeFragments delegate) {
super(delegate);
Assert.notNull(delegate, "Delegate must not be null");
this.delegate = delegate;
}

@Override
public ClassName getTarget(RegisteredBean registeredBean) {
return this.delegate.getTarget(registeredBean);
}

@Override
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {

return this.delegate.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode);
}

@Override
public CodeBlock generateSetBeanDefinitionPropertiesCode(
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {

return this.delegate.generateSetBeanDefinitionPropertiesCode(
generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
}

@Override
public CodeBlock generateSetBeanInstanceSupplierCode(
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {

return this.delegate.generateSetBeanInstanceSupplierCode(generationContext,
beanRegistrationCode, instanceSupplierCode, postProcessors);
}

@Override
public CodeBlock generateInstanceSupplierCode(
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
boolean allowDirectSupplierShortcut) {

return this.delegate.generateInstanceSupplierCode(generationContext,
beanRegistrationCode, allowDirectSupplierShortcut);
}

@Override
public CodeBlock generateReturnCode(
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {

return this.delegate.generateReturnCode(generationContext, beanRegistrationCode);
}

}
Loading