From 3ae1b9ba578aae78641790192e130c27f2b993e7 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 20 Jul 2022 10:25:45 +0100 Subject: [PATCH] Polish CodeBlock joining logic Consistently use `CodeBlock.joining(", ")` when generating code. --- ...BeanDefinitionPropertiesCodeGenerator.java | 35 +++++++++---------- ...nDefinitionPropertyValueCodeGenerator.java | 16 ++++----- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGenerator.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGenerator.java index 83274e6c11..bd34cd24e5 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGenerator.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGenerator.java @@ -140,22 +140,23 @@ class BeanDefinitionPropertiesCodeGenerator { private void addInitDestroyMethods(Builder builder, AbstractBeanDefinition beanDefinition, @Nullable String[] methodNames, String format) { - - if (!ObjectUtils.isEmpty(methodNames)) { - Class beanType = ClassUtils - .getUserClass(beanDefinition.getResolvableType().toClass()); - List filteredMethodNames = Arrays.stream(methodNames) - .filter(candidate -> !AbstractBeanDefinition.INFER_METHOD.equals(candidate)) - .toList(); - if (!ObjectUtils.isEmpty(filteredMethodNames)) { - filteredMethodNames.forEach(methodName -> addInitDestroyHint(beanType, methodName)); - CodeBlock arguments = CodeBlock.join(filteredMethodNames.stream() - .map(name -> CodeBlock.of("$S", name)).toList(), ", "); - builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments); - } + List filteredMethodNames = (!ObjectUtils.isEmpty(methodNames)) + ? Arrays.stream(methodNames).filter(this::isNotInferredMethod).toList() + : Collections.emptyList(); + if (!filteredMethodNames.isEmpty()) { + Class beanType = ClassUtils.getUserClass(beanDefinition.getResolvableType().toClass()); + filteredMethodNames.forEach(methodName -> addInitDestroyHint(beanType, methodName)); + CodeBlock arguments = filteredMethodNames.stream() + .map(name -> CodeBlock.of("$S", name)) + .collect(CodeBlock.joining(", ")); + builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments); } } + private boolean isNotInferredMethod(String candidate) { + return !AbstractBeanDefinition.INFER_METHOD.equals(candidate); + } + private void addInitDestroyHint(Class beanUserClass, String methodName) { Method method = ReflectionUtils.findMethod(beanUserClass, methodName); if (method != null) { @@ -264,12 +265,8 @@ class BeanDefinitionPropertiesCodeGenerator { } private CodeBlock toStringVarArgs(String[] strings) { - CodeBlock.Builder builder = CodeBlock.builder(); - for (int i = 0; i < strings.length; i++) { - builder.add((i != 0) ? ", " : ""); - builder.add("$S", strings[i]); - } - return builder.build(); + return Arrays.stream(strings).map(string -> CodeBlock.of("$S", string)) + .collect(CodeBlock.joining(",")); } private Object toRole(int value) { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGenerator.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGenerator.java index 865f3c2215..637ccf6d8e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGenerator.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionPropertyValueCodeGenerator.java @@ -16,7 +16,7 @@ package org.springframework.beans.factory.aot; -import java.lang.reflect.Array; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -28,6 +28,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.stream.Stream; import org.springframework.aot.generate.GeneratedMethod; import org.springframework.aot.generate.GeneratedMethods; @@ -43,6 +44,7 @@ import org.springframework.javapoet.CodeBlock; import org.springframework.javapoet.CodeBlock.Builder; import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; +import org.springframework.util.ObjectUtils; /** * Internal code generator used to generate code for a single value contained in @@ -247,17 +249,11 @@ class BeanDefinitionPropertyValueCodeGenerator { public CodeBlock generateCode(@Nullable Object value, ResolvableType type) { if (type.isArray()) { ResolvableType componentType = type.getComponentType(); - int length = Array.getLength(value); + Stream elements = Arrays.stream(ObjectUtils.toObjectArray(value)).map(component -> + BeanDefinitionPropertyValueCodeGenerator.this.generateCode(component, componentType)); CodeBlock.Builder builder = CodeBlock.builder(); builder.add("new $T {", type.toClass()); - for (int i = 0; i < length; i++) { - Object component = Array.get(value, i); - if (i != 0) { - builder.add(", "); - } - builder.add("$L", BeanDefinitionPropertyValueCodeGenerator.this - .generateCode(component, componentType)); - } + builder.add(elements.collect(CodeBlock.joining(", "))); builder.add("}"); return builder.build(); }