From 529f88cf4c3805ffd6dbf3bf6733967187f4c6c6 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 10 Oct 2022 09:31:46 +0200 Subject: [PATCH] Use explicit type declarations for generated code. See #2704 Original pull request: #2705. --- ...nagedTypesRegistrationAotContribution.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/springframework/data/aot/ManagedTypesRegistrationAotContribution.java b/src/main/java/org/springframework/data/aot/ManagedTypesRegistrationAotContribution.java index 5bc669967..97bf0b423 100644 --- a/src/main/java/org/springframework/data/aot/ManagedTypesRegistrationAotContribution.java +++ b/src/main/java/org/springframework/data/aot/ManagedTypesRegistrationAotContribution.java @@ -127,6 +127,10 @@ class ManagedTypesRegistrationAotContribution implements RegisteredBeanAotContri private final RegisteredBean source; private final Lazy instanceMethod = Lazy.of(this::findInstanceFactory); + private static final TypeName WILDCARD = WildcardTypeName.subtypeOf(Object.class); + private static final TypeName CLASS_OF_ANY = ParameterizedTypeName.get(ClassName.get(Class.class), WILDCARD); + private static final TypeName LIST_OF_ANY = ParameterizedTypeName.get(ClassName.get(List.class), CLASS_OF_ANY); + protected ManagedTypesInstanceCodeFragment(List> sourceTypes, RegisteredBean source, BeanRegistrationCodeFragments codeFragments) { @@ -161,8 +165,7 @@ class ManagedTypesRegistrationAotContribution implements RegisteredBeanAotContri void generateInstanceFactory(Builder method) { - boolean allSourceTypesVisible = sourceTypes.stream() - .allMatch(it -> AccessControl.forClass(it).isPublic()); + boolean allSourceTypesVisible = sourceTypes.stream().allMatch(it -> AccessControl.forClass(it).isPublic()); ParameterizedTypeName targetTypeName = ParameterizedTypeName.get(InstanceSupplier.class, source.getBeanClass()); @@ -171,21 +174,25 @@ class ManagedTypesRegistrationAotContribution implements RegisteredBeanAotContri CodeBlock.Builder builder = CodeBlock.builder().add("return ").beginControlFlow("(registeredBean -> "); - if(sourceTypes.isEmpty()) { - - TypeName wildcard = WildcardTypeName.subtypeOf(Object.class); - TypeName classOfAny = ParameterizedTypeName.get(ClassName.get(Class.class), wildcard); - - builder.addStatement("var types = $T.<$T>emptyList()", Collections.class, classOfAny); + if (sourceTypes.isEmpty()) { + builder.addStatement("$T types = $T.emptyList()", LIST_OF_ANY, Collections.class); } else { - builder.addStatement("var types = $T.of($L)", List.class, toCodeBlock(sourceTypes, allSourceTypesVisible)); + if (allSourceTypesVisible) { + builder.addStatement("$T types = $T.of($L)", LIST_OF_ANY, List.class, + toCodeBlock(sourceTypes, allSourceTypesVisible)); + } else { + TypeName listOfString = ParameterizedTypeName.get(ClassName.get(List.class), ClassName.get(String.class)); + builder.addStatement("$T types = $T.of($L)", listOfString, List.class, + toCodeBlock(sourceTypes, allSourceTypesVisible)); + } } if (allSourceTypesVisible) { - builder.addStatement("var managedTypes = $T.fromIterable($L)", ManagedTypes.class, "types"); + builder.addStatement("$T managedTypes = $T.fromIterable($L)", ManagedTypes.class, ManagedTypes.class, "types"); } else { builder.add(CodeBlock.builder() - .beginControlFlow("var managedTypes = $T.fromStream(types.stream().map(it ->", ManagedTypes.class) + .beginControlFlow("$T managedTypes = $T.fromStream(types.stream().map(it ->", ManagedTypes.class, + ManagedTypes.class) .beginControlFlow("try") .addStatement("return $T.forName(it, registeredBean.getBeanFactory().getBeanClassLoader())", ClassUtils.class)