Skip to content

Commit ddf5521

Browse files
committed
Merge branch '6.1.x'
2 parents 4d4b343 + f26483d commit ddf5521

File tree

4 files changed

+76
-1
lines changed

4 files changed

+76
-1
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ private GeneratedMethod generateBeanDefinitionMethod(GenerationContext generatio
165165
this.aotContributions.forEach(aotContribution -> aotContribution.applyTo(generationContext, codeGenerator));
166166

167167
CodeWarnings codeWarnings = new CodeWarnings();
168-
codeWarnings.detectDeprecation(this.registeredBean.getBeanClass());
168+
codeWarnings.detectDeprecation(this.registeredBean.getBeanType());
169169
return generatedMethods.add("getBeanDefinition", method -> {
170170
method.addJavadoc("Get the $L definition for '$L'.",
171171
(this.registeredBean.isInnerBean() ? "inner-bean" : "bean"),

spring-beans/src/main/java/org/springframework/beans/factory/aot/CodeWarnings.java

+22
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
import java.util.Set;
2323
import java.util.stream.Stream;
2424

25+
import org.springframework.core.ResolvableType;
2526
import org.springframework.javapoet.AnnotationSpec;
2627
import org.springframework.javapoet.CodeBlock;
2728
import org.springframework.javapoet.MethodSpec;
2829
import org.springframework.lang.Nullable;
30+
import org.springframework.util.ClassUtils;
2931

3032
/**
3133
* Helper class to register warnings that the compiler may trigger on
@@ -71,6 +73,26 @@ public CodeWarnings detectDeprecation(Stream<AnnotatedElement> elements) {
7173
return this;
7274
}
7375

76+
/**
77+
* Detect the presence of {@link Deprecated} on the signature of the
78+
* specified {@link ResolvableType}.
79+
* @param resolvableType a type signature
80+
* @return {@code this} instance
81+
*/
82+
public CodeWarnings detectDeprecation(ResolvableType resolvableType) {
83+
if (ResolvableType.NONE.equals(resolvableType)) {
84+
return this;
85+
}
86+
Class<?> type = ClassUtils.getUserClass(resolvableType.toClass());
87+
detectDeprecation(type);
88+
if (resolvableType.hasGenerics() && !resolvableType.hasUnresolvableGenerics()) {
89+
for (ResolvableType generic : resolvableType.getGenerics()) {
90+
detectDeprecation(generic);
91+
}
92+
}
93+
return this;
94+
}
95+
7496
/**
7597
* Include {@link SuppressWarnings} on the specified method if necessary.
7698
* @param method the method to update

spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java

+13
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,19 @@ void generateBeanDefinitionMethodWithDeprecatedTargetClass() {
782782
compileAndCheckWarnings(method);
783783
}
784784

785+
@Test
786+
void generateBeanDefinitionMethodWithDeprecatedGenericElementInTargetClass() {
787+
RootBeanDefinition beanDefinition = new RootBeanDefinition();
788+
beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(GenericBean.class, DeprecatedBean.class));
789+
RegisteredBean registeredBean = registerBean(beanDefinition);
790+
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
791+
methodGeneratorFactory, registeredBean, null,
792+
Collections.emptyList());
793+
MethodReference method = generator.generateBeanDefinitionMethod(
794+
generationContext, beanRegistrationsCode);
795+
compileAndCheckWarnings(method);
796+
}
797+
785798
private void compileAndCheckWarnings(MethodReference methodReference) {
786799
assertThatNoException().isThrownBy(() -> compile(TEST_COMPILER, methodReference,
787800
((instanceSupplier, compiled) -> {})));

spring-beans/src/test/java/org/springframework/beans/factory/aot/CodeWarningsTests.java

+40
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@
1717
package org.springframework.beans.factory.aot;
1818

1919
import java.util.function.Consumer;
20+
import java.util.stream.Stream;
2021

2122
import javax.lang.model.element.Modifier;
2223

2324
import org.junit.jupiter.api.Test;
25+
import org.junit.jupiter.params.ParameterizedTest;
26+
import org.junit.jupiter.params.provider.Arguments;
27+
import org.junit.jupiter.params.provider.MethodSource;
2428

2529
import org.springframework.aot.test.generate.TestGenerationContext;
30+
import org.springframework.beans.testfixture.beans.GenericBean;
2631
import org.springframework.beans.testfixture.beans.factory.aot.DeferredTypeBuilder;
2732
import org.springframework.beans.testfixture.beans.factory.generator.deprecation.DeprecatedBean;
2833
import org.springframework.beans.testfixture.beans.factory.generator.deprecation.DeprecatedForRemovalBean;
34+
import org.springframework.core.ResolvableType;
2935
import org.springframework.core.test.tools.Compiled;
3036
import org.springframework.core.test.tools.TestCompiler;
3137
import org.springframework.javapoet.MethodSpec;
@@ -92,6 +98,40 @@ void detectDeprecationOnAnnotatedElementWithDeprecatedForRemoval() {
9298
assertThat(this.codeWarnings.getWarnings()).containsOnly("removal");
9399
}
94100

101+
@ParameterizedTest
102+
@MethodSource("resolvableTypesWithDeprecated")
103+
void detectDeprecationOnResolvableTypeWithDeprecated(ResolvableType resolvableType) {
104+
this.codeWarnings.detectDeprecation(resolvableType);
105+
assertThat(this.codeWarnings.getWarnings()).containsExactly("deprecation");
106+
}
107+
108+
@SuppressWarnings("deprecation")
109+
static Stream<Arguments> resolvableTypesWithDeprecated() {
110+
return Stream.of(
111+
Arguments.of(ResolvableType.forClass(DeprecatedBean.class)),
112+
Arguments.of(ResolvableType.forClassWithGenerics(GenericBean.class, DeprecatedBean.class)),
113+
Arguments.of(ResolvableType.forClassWithGenerics(GenericBean.class,
114+
ResolvableType.forClassWithGenerics(GenericBean.class, DeprecatedBean.class)))
115+
);
116+
}
117+
118+
@ParameterizedTest
119+
@MethodSource("resolvableTypesWithDeprecatedForRemoval")
120+
void detectDeprecationOnResolvableTypeWithDeprecatedForRemoval(ResolvableType resolvableType) {
121+
this.codeWarnings.detectDeprecation(resolvableType);
122+
assertThat(this.codeWarnings.getWarnings()).containsExactly("removal");
123+
}
124+
125+
@SuppressWarnings("removal")
126+
static Stream<Arguments> resolvableTypesWithDeprecatedForRemoval() {
127+
return Stream.of(
128+
Arguments.of(ResolvableType.forClass(DeprecatedForRemovalBean.class)),
129+
Arguments.of(ResolvableType.forClassWithGenerics(GenericBean.class, DeprecatedForRemovalBean.class)),
130+
Arguments.of(ResolvableType.forClassWithGenerics(GenericBean.class,
131+
ResolvableType.forClassWithGenerics(GenericBean.class, DeprecatedForRemovalBean.class)))
132+
);
133+
}
134+
95135
@Test
96136
void toStringIncludesWarnings() {
97137
this.codeWarnings.register("deprecation");

0 commit comments

Comments
 (0)